posthog-js 1.78.2 → 1.78.3

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":"array.full.js","sources":["../node_modules/rrweb-v1/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/ext/tslib/tslib.es6.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/types.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/utils.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/mutation.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observer.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../node_modules/rrweb-v1/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/index.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/error-stack-parser.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/stringify.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/index.js","../src/loader-recorder.ts","../src/config.ts","../src/utils.ts","../src/autocapture-utils.ts","../src/extensions/rageclick.ts","../src/constants.ts","../src/autocapture.ts","../src/posthog-featureflags.ts","../src/storage.ts","../src/posthog-persistence.ts","../src/extensions/sessionrecording-utils.ts","../src/extensions/sessionrecording.ts","../src/extensions/web-performance.ts","../src/decide.ts","../src/extensions/cloud.ts","../src/extensions/toolbar.ts","../src/gdpr-utils.ts","../src/base-request-queue.ts","../src/request-queue.ts","../node_modules/fflate/esm/browser.js","../src/types.ts","../src/send-request.ts","../src/retry-queue.ts","../src/uuidv7.ts","../src/sessionid.ts","../src/extensions/sentry-integration.ts","../src/extensions/segment-integration.ts","../src/page-view.ts","../src/extensions/exceptions/type-checking.ts","../src/extensions/exceptions/stack-trace.ts","../src/extensions/exceptions/error-conversion.ts","../src/extensions/exceptions/exception-autocapture.ts","../src/posthog-surveys.ts","../src/posthog-core.ts","../src/rate-limiter.ts","../src/compression.ts"],"sourcesContent":["var NodeType;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n var _a;\n var host = (_a = n) === null || _a === void 0 ? void 0 : _a.host;\n return Boolean(host && host.shadowRoot && host.shadowRoot === n);\n}\nfunction maskInputValue(_a) {\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\n var text = value || '';\n if (maskInputOptions[tagName.toLowerCase()] ||\n maskInputOptions[type]) {\n if (maskInputFn) {\n text = maskInputFn(text);\n }\n else {\n text = '*'.repeat(text.length);\n }\n }\n return text;\n}\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\nfunction is2DCanvasBlank(canvas) {\n var ctx = canvas.getContext('2d');\n if (!ctx)\n return true;\n var chunkSize = 50;\n for (var x = 0; x < canvas.width; x += chunkSize) {\n for (var y = 0; y < canvas.height; y += chunkSize) {\n var getImageData = ctx.getImageData;\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\n return false;\n }\n }\n return true;\n}\n\nvar _id = 1;\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\nvar IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n var processedTagName = element.tagName.toLowerCase().trim();\n if (tagNameRegex.test(processedTagName)) {\n return 'div';\n }\n return processedTagName;\n}\nfunction getCssRulesString(s) {\n try {\n var rules = s.rules || s.cssRules;\n return rules ? Array.from(rules).map(getCssRuleString).join('') : null;\n }\n catch (error) {\n return null;\n }\n}\nfunction getCssRuleString(rule) {\n var cssStringified = rule.cssText;\n if (isCSSImportRule(rule)) {\n try {\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\n }\n catch (_a) {\n }\n }\n return cssStringified;\n}\nfunction isCSSImportRule(rule) {\n return 'styleSheet' in rule;\n}\nfunction stringifyStyleSheet(sheet) {\n return sheet.cssRules\n ? Array.from(sheet.cssRules)\n .map(function (rule) { return rule.cssText || ''; })\n .join('')\n : '';\n}\nfunction extractOrigin(url) {\n var origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n }\n else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\nvar canvasService;\nvar canvasCtx;\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absoluteToStylesheet(cssText, href) {\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\n var filePath = path1 || path2 || path3;\n var maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (!RELATIVE_PATH.test(filePath)) {\n return \"url(\" + maybeQuote + filePath + maybeQuote + \")\";\n }\n if (DATA_URI.test(filePath)) {\n return \"url(\" + maybeQuote + filePath + maybeQuote + \")\";\n }\n if (filePath[0] === '/') {\n return \"url(\" + maybeQuote + (extractOrigin(href) + filePath) + maybeQuote + \")\";\n }\n var stack = href.split('/');\n var parts = filePath.split('/');\n stack.pop();\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\n var part = parts_1[_i];\n if (part === '.') {\n continue;\n }\n else if (part === '..') {\n stack.pop();\n }\n else {\n stack.push(part);\n }\n }\n return \"url(\" + maybeQuote + stack.join('/') + maybeQuote + \")\";\n });\n}\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n var pos = 0;\n function collectCharacters(regEx) {\n var chars;\n var match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n var output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n var url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n }\n else {\n var descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n var inParens = false;\n while (true) {\n var c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (c === '(') {\n inParens = true;\n }\n }\n else {\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n var a = doc.createElement('a');\n a.href = attributeValue;\n return a.href;\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\n}\nfunction getHref() {\n var a = document.createElement('a');\n a.href = '';\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value) {\n if (name === 'src' || (name === 'href' && value)) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'xlink:href' && value && value[0] !== '#') {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'background' &&\n value &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'srcset' && value) {\n return getAbsoluteSrcsetString(doc, value);\n }\n else if (name === 'style' && value) {\n return absoluteToStylesheet(value, getHref());\n }\n else if (tagName === 'object' && name === 'data' && value) {\n return absoluteToDoc(doc, value);\n }\n else {\n return value;\n }\n}\nfunction _isBlockedElement(element, blockClass, blockSelector) {\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n }\n else {\n for (var eIndex = 0; eIndex < element.classList.length; eIndex++) {\n var className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n return false;\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\n if (!node) {\n return false;\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n if (typeof maskTextClass === 'string') {\n if (node.classList.contains(maskTextClass)) {\n return true;\n }\n }\n else {\n for (var eIndex = 0; eIndex < node.classList.length; eIndex++) {\n var className = node.classList[eIndex];\n if (maskTextClass.test(className)) {\n return true;\n }\n }\n }\n if (maskTextSelector) {\n if (node.matches(maskTextSelector)) {\n return true;\n }\n }\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n }\n if (node.nodeType === node.TEXT_NODE) {\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n }\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n var win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n var fired = false;\n var readyState;\n try {\n readyState = win.document.readyState;\n }\n catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n var timer_1 = setTimeout(function () {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', function () {\n clearTimeout(timer_1);\n fired = true;\n listener();\n });\n return;\n }\n var blankUrl = 'about:blank';\n if (win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === '') {\n setTimeout(listener, 0);\n return;\n }\n iframeEl.addEventListener('load', listener);\n}\nfunction serializeNode(n, options) {\n var _a;\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _b = options.maskInputOptions, maskInputOptions = _b === void 0 ? {} : _b, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _c = options.dataURLOptions, dataURLOptions = _c === void 0 ? {} : _c, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn;\n var rootId;\n if (doc.__sn) {\n var docId = doc.__sn.id;\n rootId = docId === 1 ? undefined : docId;\n }\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== 'CSS1Compat') {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: n.compatMode,\n rootId: rootId\n };\n }\n else {\n return {\n type: NodeType.Document,\n childNodes: [],\n rootId: rootId\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId: rootId\n };\n case n.ELEMENT_NODE:\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\n var tagName = getValidTagName(n);\n var attributes_1 = {};\n for (var _i = 0, _d = Array.from(n.attributes); _i < _d.length; _i++) {\n var _e = _d[_i], name_1 = _e.name, value = _e.value;\n attributes_1[name_1] = transformAttribute(doc, tagName, name_1, value);\n }\n if (tagName === 'link' && inlineStylesheet) {\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\n return s.href === n.href;\n });\n var cssText = null;\n if (stylesheet) {\n cssText = getCssRulesString(stylesheet);\n }\n if (cssText) {\n delete attributes_1.rel;\n delete attributes_1.href;\n attributes_1._cssText = absoluteToStylesheet(cssText, stylesheet.href);\n }\n }\n if (tagName === 'style' &&\n n.sheet &&\n !(n.innerText ||\n n.textContent ||\n '').trim().length) {\n var cssText = getCssRulesString(n.sheet);\n if (cssText) {\n attributes_1._cssText = absoluteToStylesheet(cssText, getHref());\n }\n }\n if (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select') {\n var value = n.value;\n if (attributes_1.type !== 'radio' &&\n attributes_1.type !== 'checkbox' &&\n attributes_1.type !== 'submit' &&\n attributes_1.type !== 'button' &&\n value) {\n attributes_1.value = maskInputValue({\n type: attributes_1.type,\n tagName: tagName,\n value: value,\n maskInputOptions: maskInputOptions,\n maskInputFn: maskInputFn\n });\n }\n else if (n.checked) {\n attributes_1.checked = n.checked;\n }\n }\n if (tagName === 'option') {\n if (n.selected && !maskInputOptions['select']) {\n attributes_1.selected = true;\n }\n else {\n delete attributes_1.selected;\n }\n }\n if (tagName === 'canvas' && recordCanvas) {\n if (n.__context === '2d') {\n if (!is2DCanvasBlank(n)) {\n attributes_1.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n }\n else if (!('__context' in n)) {\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n var blankCanvas = document.createElement('canvas');\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes_1.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n var image_1 = n;\n var oldValue_1 = image_1.crossOrigin;\n image_1.crossOrigin = 'anonymous';\n var recordInlineImage = function () {\n try {\n canvasService.width = image_1.naturalWidth;\n canvasService.height = image_1.naturalHeight;\n canvasCtx.drawImage(image_1, 0, 0);\n attributes_1.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n catch (err) {\n console.warn(\"Cannot inline img src=\" + image_1.currentSrc + \"! Error: \" + err);\n }\n oldValue_1\n ? (attributes_1.crossOrigin = oldValue_1)\n : delete attributes_1.crossOrigin;\n };\n if (image_1.complete && image_1.naturalWidth !== 0)\n recordInlineImage();\n else\n image_1.onload = recordInlineImage;\n }\n if (tagName === 'audio' || tagName === 'video') {\n attributes_1.rr_mediaState = n.paused\n ? 'paused'\n : 'played';\n attributes_1.rr_mediaCurrentTime = n.currentTime;\n }\n if (n.scrollLeft) {\n attributes_1.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes_1.rr_scrollTop = n.scrollTop;\n }\n if (needBlock) {\n var _f = n.getBoundingClientRect(), width = _f.width, height = _f.height;\n attributes_1 = {\n \"class\": attributes_1[\"class\"],\n rr_width: width + \"px\",\n rr_height: height + \"px\"\n };\n }\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes_1.src)) {\n if (!n.contentDocument) {\n attributes_1.rr_src = attributes_1.src;\n }\n delete attributes_1.src;\n }\n return {\n type: NodeType.Element,\n tagName: tagName,\n attributes: attributes_1,\n childNodes: [],\n isSVG: isSVGElement(n) || undefined,\n needBlock: needBlock,\n rootId: rootId\n };\n case n.TEXT_NODE:\n var parentTagName = n.parentNode && n.parentNode.tagName;\n var textContent = n.textContent;\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\n if (isStyle && textContent) {\n try {\n if (n.nextSibling || n.previousSibling) {\n }\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\n textContent = stringifyStyleSheet(n.parentNode.sheet);\n }\n }\n catch (err) {\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \" + err, n);\n }\n textContent = absoluteToStylesheet(textContent, getHref());\n }\n if (isScript) {\n textContent = 'SCRIPT_PLACEHOLDER';\n }\n if (!isStyle &&\n !isScript &&\n needMaskingText(n, maskTextClass, maskTextSelector) &&\n textContent) {\n textContent = maskTextFn\n ? maskTextFn(textContent)\n : textContent.replace(/[\\S]/g, '*');\n }\n return {\n type: NodeType.Text,\n textContent: textContent || '',\n isStyle: isStyle,\n rootId: rootId\n };\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: '',\n rootId: rootId\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: n.textContent || '',\n rootId: rootId\n };\n default:\n return false;\n }\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === undefined) {\n return '';\n }\n else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n return true;\n }\n else if (sn.type === NodeType.Element) {\n if (slimDOMOptions.script &&\n (sn.tagName === 'script' ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'preload' &&\n sn.attributes.as === 'script') ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n sn.attributes.href.endsWith('.js')))) {\n return true;\n }\n else if (slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\n return true;\n }\n else if (sn.tagName === 'meta') {\n if (slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n }\n else if (slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\n return true;\n }\n else if (slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\n return true;\n }\n else if (slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined) {\n return true;\n }\n else if (slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n }\n else if (slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n var doc = options.doc, map = options.map, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, _h = options.keepIframeSrcFn, keepIframeSrcFn = _h === void 0 ? function () { return false; } : _h;\n var _j = options.preserveWhiteSpace, preserveWhiteSpace = _j === void 0 ? true : _j;\n var _serializedNode = serializeNode(n, {\n doc: doc,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n keepIframeSrcFn: keepIframeSrcFn\n });\n if (!_serializedNode) {\n console.warn(n, 'not serialized');\n return null;\n }\n var id;\n if ('__sn' in n) {\n id = n.__sn.id;\n }\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType.Text &&\n !_serializedNode.isStyle &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\n id = IGNORED_NODE;\n }\n else {\n id = genId();\n }\n var serializedNode = Object.assign(_serializedNode, { id: id });\n n.__sn = serializedNode;\n if (id === IGNORED_NODE) {\n return null;\n }\n map[id] = n;\n if (onSerialize) {\n onSerialize(n);\n }\n var recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n if (n.shadowRoot)\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType.Document ||\n serializedNode.type === NodeType.Element) &&\n recordChild) {\n if (slimDOMOptions.headWhitespace &&\n _serializedNode.type === NodeType.Element &&\n _serializedNode.tagName === 'head') {\n preserveWhiteSpace = false;\n }\n var bypassOptions = {\n doc: doc,\n map: map,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: skipChild,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n };\n for (var _i = 0, _k = Array.from(n.childNodes); _i < _k.length; _i++) {\n var childN = _k[_i];\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n if (isElement(n) && n.shadowRoot) {\n for (var _l = 0, _m = Array.from(n.shadowRoot.childNodes); _l < _m.length; _l++) {\n var childN = _m[_l];\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedChildNode.isShadow = true;\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n if (n.parentNode && isShadowRoot(n.parentNode)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'iframe') {\n onceIframeLoaded(n, function () {\n var iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n map: map,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: false,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n });\n if (serializedIframeNode) {\n onIframeLoad(n, serializedIframeNode);\n }\n }\n }, iframeLoadTimeout);\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n var _a = options || {}, _b = _a.blockClass, blockClass = _b === void 0 ? 'rr-block' : _b, _c = _a.blockSelector, blockSelector = _c === void 0 ? null : _c, _d = _a.maskTextClass, maskTextClass = _d === void 0 ? 'rr-mask' : _d, _e = _a.maskTextSelector, maskTextSelector = _e === void 0 ? null : _e, _f = _a.inlineStylesheet, inlineStylesheet = _f === void 0 ? true : _f, _g = _a.inlineImages, inlineImages = _g === void 0 ? false : _g, _h = _a.recordCanvas, recordCanvas = _h === void 0 ? false : _h, _j = _a.maskAllInputs, maskAllInputs = _j === void 0 ? false : _j, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _k = _a.slimDOM, slimDOM = _k === void 0 ? false : _k, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, _l = _a.keepIframeSrcFn, keepIframeSrcFn = _l === void 0 ? function () { return false; } : _l;\n var idNodeMap = {};\n var maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n }\n : maskAllInputs === false\n ? {\n password: true\n }\n : maskAllInputs;\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\n ?\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all',\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return [\n serializeNodeWithId(n, {\n doc: n,\n map: idNodeMap,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: false,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n }),\n idNodeMap,\n ];\n}\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\nfunction parse(css, options) {\n if (options === void 0) { options = {}; }\n var lineno = 1;\n var column = 1;\n function updatePosition(str) {\n var lines = str.match(/\\n/g);\n if (lines) {\n lineno += lines.length;\n }\n var i = str.lastIndexOf('\\n');\n column = i === -1 ? column + str.length : str.length - i;\n }\n function position() {\n var start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n var Position = (function () {\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n return Position;\n }());\n Position.prototype.content = css;\n var errorsList = [];\n function error(msg) {\n var err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg);\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = css;\n if (options.silent) {\n errorsList.push(err);\n }\n else {\n throw err;\n }\n }\n function stylesheet() {\n var rulesList = rules();\n return {\n type: 'stylesheet',\n stylesheet: {\n source: options.source,\n rules: rulesList,\n parsingErrors: errorsList\n }\n };\n }\n function open() {\n return match(/^{\\s*/);\n }\n function close() {\n return match(/^}/);\n }\n function rules() {\n var node;\n var rules = [];\n whitespace();\n comments(rules);\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\n if (node !== false) {\n rules.push(node);\n comments(rules);\n }\n }\n return rules;\n }\n function match(re) {\n var m = re.exec(css);\n if (!m) {\n return;\n }\n var str = m[0];\n updatePosition(str);\n css = css.slice(str.length);\n return m;\n }\n function whitespace() {\n match(/^\\s*/);\n }\n function comments(rules) {\n if (rules === void 0) { rules = []; }\n var c;\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n c = comment();\n }\n return rules;\n }\n function comment() {\n var pos = position();\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\n return;\n }\n var i = 2;\n while ('' !== css.charAt(i) &&\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\n ++i;\n }\n i += 2;\n if ('' === css.charAt(i - 1)) {\n return error('End of comment missing');\n }\n var str = css.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n css = css.slice(i);\n column += 2;\n return pos({\n type: 'comment',\n comment: str\n });\n }\n function selector() {\n var m = match(/^([^{]+)/);\n if (!m) {\n return;\n }\n return trim(m[0])\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\n return m.replace(/,/g, '\\u200C');\n })\n .split(/\\s*(?![^(]*\\)),\\s*/)\n .map(function (s) {\n return s.replace(/\\u200C/g, ',');\n });\n }\n function declaration() {\n var pos = position();\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\n if (!propMatch) {\n return;\n }\n var prop = trim(propMatch[0]);\n if (!match(/^:\\s*/)) {\n return error(\"property missing ':'\");\n }\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\n var ret = pos({\n type: 'declaration',\n property: prop.replace(commentre, ''),\n value: val ? trim(val[0]).replace(commentre, '') : ''\n });\n match(/^[;\\s]*/);\n return ret;\n }\n function declarations() {\n var decls = [];\n if (!open()) {\n return error(\"missing '{'\");\n }\n comments(decls);\n var decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n decl = declaration();\n }\n if (!close()) {\n return error(\"missing '}'\");\n }\n return decls;\n }\n function keyframe() {\n var m;\n var vals = [];\n var pos = position();\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\n vals.push(m[1]);\n match(/^,\\s*/);\n }\n if (!vals.length) {\n return;\n }\n return pos({\n type: 'keyframe',\n values: vals,\n declarations: declarations()\n });\n }\n function atkeyframes() {\n var pos = position();\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\n if (!m) {\n return;\n }\n var vendor = m[1];\n m = match(/^([-\\w]+)\\s*/);\n if (!m) {\n return error('@keyframes missing name');\n }\n var name = m[1];\n if (!open()) {\n return error(\"@keyframes missing '{'\");\n }\n var frame;\n var frames = comments();\n while ((frame = keyframe())) {\n frames.push(frame);\n frames = frames.concat(comments());\n }\n if (!close()) {\n return error(\"@keyframes missing '}'\");\n }\n return pos({\n type: 'keyframes',\n name: name,\n vendor: vendor,\n keyframes: frames\n });\n }\n function atsupports() {\n var pos = position();\n var m = match(/^@supports *([^{]+)/);\n if (!m) {\n return;\n }\n var supports = trim(m[1]);\n if (!open()) {\n return error(\"@supports missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@supports missing '}'\");\n }\n return pos({\n type: 'supports',\n supports: supports,\n rules: style\n });\n }\n function athost() {\n var pos = position();\n var m = match(/^@host\\s*/);\n if (!m) {\n return;\n }\n if (!open()) {\n return error(\"@host missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@host missing '}'\");\n }\n return pos({\n type: 'host',\n rules: style\n });\n }\n function atmedia() {\n var pos = position();\n var m = match(/^@media *([^{]+)/);\n if (!m) {\n return;\n }\n var media = trim(m[1]);\n if (!open()) {\n return error(\"@media missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@media missing '}'\");\n }\n return pos({\n type: 'media',\n media: media,\n rules: style\n });\n }\n function atcustommedia() {\n var pos = position();\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\n if (!m) {\n return;\n }\n return pos({\n type: 'custom-media',\n name: trim(m[1]),\n media: trim(m[2])\n });\n }\n function atpage() {\n var pos = position();\n var m = match(/^@page */);\n if (!m) {\n return;\n }\n var sel = selector() || [];\n if (!open()) {\n return error(\"@page missing '{'\");\n }\n var decls = comments();\n var decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n if (!close()) {\n return error(\"@page missing '}'\");\n }\n return pos({\n type: 'page',\n selectors: sel,\n declarations: decls\n });\n }\n function atdocument() {\n var pos = position();\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\n if (!m) {\n return;\n }\n var vendor = trim(m[1]);\n var doc = trim(m[2]);\n if (!open()) {\n return error(\"@document missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@document missing '}'\");\n }\n return pos({\n type: 'document',\n document: doc,\n vendor: vendor,\n rules: style\n });\n }\n function atfontface() {\n var pos = position();\n var m = match(/^@font-face\\s*/);\n if (!m) {\n return;\n }\n if (!open()) {\n return error(\"@font-face missing '{'\");\n }\n var decls = comments();\n var decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n if (!close()) {\n return error(\"@font-face missing '}'\");\n }\n return pos({\n type: 'font-face',\n declarations: decls\n });\n }\n var atimport = _compileAtrule('import');\n var atcharset = _compileAtrule('charset');\n var atnamespace = _compileAtrule('namespace');\n function _compileAtrule(name) {\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\n return function () {\n var pos = position();\n var m = match(re);\n if (!m) {\n return;\n }\n var ret = { type: name };\n ret[name] = m[1].trim();\n return pos(ret);\n };\n }\n function atrule() {\n if (css[0] !== '@') {\n return;\n }\n return (atkeyframes() ||\n atmedia() ||\n atcustommedia() ||\n atsupports() ||\n atimport() ||\n atcharset() ||\n atnamespace() ||\n atdocument() ||\n atpage() ||\n athost() ||\n atfontface());\n }\n function rule() {\n var pos = position();\n var sel = selector();\n if (!sel) {\n return error('selector missing');\n }\n comments();\n return pos({\n type: 'rule',\n selectors: sel,\n declarations: declarations()\n });\n }\n return addParent(stylesheet());\n}\nfunction trim(str) {\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\n}\nfunction addParent(obj, parent) {\n var isNode = obj && typeof obj.type === 'string';\n var childParent = isNode ? obj : parent;\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\n var k = _a[_i];\n var value = obj[k];\n if (Array.isArray(value)) {\n value.forEach(function (v) {\n addParent(v, childParent);\n });\n }\n else if (value && typeof value === 'object') {\n addParent(value, childParent);\n }\n }\n if (isNode) {\n Object.defineProperty(obj, 'parent', {\n configurable: true,\n writable: true,\n enumerable: false,\n value: parent || null\n });\n }\n return obj;\n}\n\nvar tagMap = {\n script: 'noscript',\n altglyph: 'altGlyph',\n altglyphdef: 'altGlyphDef',\n altglyphitem: 'altGlyphItem',\n animatecolor: 'animateColor',\n animatemotion: 'animateMotion',\n animatetransform: 'animateTransform',\n clippath: 'clipPath',\n feblend: 'feBlend',\n fecolormatrix: 'feColorMatrix',\n fecomponenttransfer: 'feComponentTransfer',\n fecomposite: 'feComposite',\n feconvolvematrix: 'feConvolveMatrix',\n fediffuselighting: 'feDiffuseLighting',\n fedisplacementmap: 'feDisplacementMap',\n fedistantlight: 'feDistantLight',\n fedropshadow: 'feDropShadow',\n feflood: 'feFlood',\n fefunca: 'feFuncA',\n fefuncb: 'feFuncB',\n fefuncg: 'feFuncG',\n fefuncr: 'feFuncR',\n fegaussianblur: 'feGaussianBlur',\n feimage: 'feImage',\n femerge: 'feMerge',\n femergenode: 'feMergeNode',\n femorphology: 'feMorphology',\n feoffset: 'feOffset',\n fepointlight: 'fePointLight',\n fespecularlighting: 'feSpecularLighting',\n fespotlight: 'feSpotLight',\n fetile: 'feTile',\n feturbulence: 'feTurbulence',\n foreignobject: 'foreignObject',\n glyphref: 'glyphRef',\n lineargradient: 'linearGradient',\n radialgradient: 'radialGradient'\n};\nfunction getTagName(n) {\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\n if (tagName === 'link' && n.attributes._cssText) {\n tagName = 'style';\n }\n return tagName;\n}\nfunction escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\nfunction addHoverClass(cssText, cache) {\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\n if (cachedStyle)\n return cachedStyle;\n var ast = parse(cssText, {\n silent: true\n });\n if (!ast.stylesheet) {\n return cssText;\n }\n var selectors = [];\n ast.stylesheet.rules.forEach(function (rule) {\n if ('selectors' in rule) {\n (rule.selectors || []).forEach(function (selector) {\n if (HOVER_SELECTOR.test(selector)) {\n selectors.push(selector);\n }\n });\n }\n });\n if (selectors.length === 0) {\n return cssText;\n }\n var selectorMatcher = new RegExp(selectors\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\n .sort(function (a, b) { return b.length - a.length; })\n .map(function (selector) {\n return escapeRegExp(selector);\n })\n .join('|'), 'g');\n var result = cssText.replace(selectorMatcher, function (selector) {\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\n return selector + \", \" + newSelector;\n });\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\n return result;\n}\nfunction createCache() {\n var stylesWithHoverClass = new Map();\n return {\n stylesWithHoverClass: stylesWithHoverClass\n };\n}\nfunction buildNode(n, options) {\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\n switch (n.type) {\n case NodeType.Document:\n return doc.implementation.createDocument(null, '', null);\n case NodeType.DocumentType:\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\n case NodeType.Element:\n var tagName = getTagName(n);\n var node_1;\n if (n.isSVG) {\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\n }\n else {\n node_1 = doc.createElement(tagName);\n }\n var _loop_1 = function (name_1) {\n if (!n.attributes.hasOwnProperty(name_1)) {\n return \"continue\";\n }\n var value = n.attributes[name_1];\n if (tagName === 'option' && name_1 === 'selected' && value === false) {\n return \"continue\";\n }\n value =\n typeof value === 'boolean' || typeof value === 'number' ? '' : value;\n if (!name_1.startsWith('rr_')) {\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\n if (isRemoteOrDynamicCss && hackCss) {\n value = addHoverClass(value, cache);\n }\n if (isTextarea || isRemoteOrDynamicCss) {\n var child = doc.createTextNode(value);\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\n var c = _a[_i];\n if (c.nodeType === node_1.TEXT_NODE) {\n node_1.removeChild(c);\n }\n }\n node_1.appendChild(child);\n return \"continue\";\n }\n try {\n if (n.isSVG && name_1 === 'xlink:href') {\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value);\n }\n else if (name_1 === 'onload' ||\n name_1 === 'onclick' ||\n name_1.substring(0, 7) === 'onmouse') {\n node_1.setAttribute('_' + name_1, value);\n }\n else if (tagName === 'meta' &&\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\n name_1 === 'content') {\n node_1.setAttribute('csp-content', value);\n return \"continue\";\n }\n else if (tagName === 'link' &&\n n.attributes.rel === 'preload' &&\n n.attributes.as === 'script') {\n }\n else if (tagName === 'link' &&\n n.attributes.rel === 'prefetch' &&\n typeof n.attributes.href === 'string' &&\n n.attributes.href.endsWith('.js')) {\n }\n else if (tagName === 'img' &&\n n.attributes.srcset &&\n n.attributes.rr_dataURL) {\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\n }\n else {\n node_1.setAttribute(name_1, value);\n }\n }\n catch (error) {\n }\n }\n else {\n if (tagName === 'canvas' && name_1 === 'rr_dataURL') {\n var image_1 = document.createElement('img');\n image_1.src = value;\n image_1.onload = function () {\n var ctx = node_1.getContext('2d');\n if (ctx) {\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\n }\n };\n }\n else if (tagName === 'img' && name_1 === 'rr_dataURL') {\n var image = node_1;\n if (!image.currentSrc.startsWith('data:')) {\n image.setAttribute('rrweb-original-src', n.attributes.src);\n image.src = value;\n }\n }\n if (name_1 === 'rr_width') {\n node_1.style.width = value;\n }\n else if (name_1 === 'rr_height') {\n node_1.style.height = value;\n }\n else if (name_1 === 'rr_mediaCurrentTime') {\n node_1.currentTime = n.attributes\n .rr_mediaCurrentTime;\n }\n else if (name_1 === 'rr_mediaState') {\n switch (value) {\n case 'played':\n node_1\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\n break;\n case 'paused':\n node_1.pause();\n break;\n }\n }\n }\n };\n for (var name_1 in n.attributes) {\n _loop_1(name_1);\n }\n if (n.isShadowHost) {\n if (!node_1.shadowRoot) {\n node_1.attachShadow({ mode: 'open' });\n }\n else {\n while (node_1.shadowRoot.firstChild) {\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\n }\n }\n }\n return node_1;\n case NodeType.Text:\n return doc.createTextNode(n.isStyle && hackCss\n ? addHoverClass(n.textContent, cache)\n : n.textContent);\n case NodeType.CDATA:\n return doc.createCDATASection(n.textContent);\n case NodeType.Comment:\n return doc.createComment(n.textContent);\n default:\n return null;\n }\n}\nfunction buildNodeWithSN(n, options) {\n var doc = options.doc, map = options.map, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\n if (!node) {\n return null;\n }\n if (n.rootId) {\n console.assert(map[n.rootId] === doc, 'Target document should has the same root id.');\n }\n if (n.type === NodeType.Document) {\n doc.close();\n doc.open();\n if (n.compatMode === 'BackCompat' &&\n n.childNodes &&\n n.childNodes[0].type !== NodeType.DocumentType) {\n if (n.childNodes[0].type === NodeType.Element &&\n 'xmlns' in n.childNodes[0].attributes &&\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\n }\n else {\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\n }\n }\n node = doc;\n }\n node.__sn = n;\n map[n.id] = node;\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\n !skipChild) {\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\n var childN = _c[_i];\n var childNode = buildNodeWithSN(childN, {\n doc: doc,\n map: map,\n skipChild: false,\n hackCss: hackCss,\n afterAppend: afterAppend,\n cache: cache\n });\n if (!childNode) {\n console.warn('Failed to rebuild', childN);\n continue;\n }\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\n node.shadowRoot.appendChild(childNode);\n }\n else {\n node.appendChild(childNode);\n }\n if (afterAppend) {\n afterAppend(childNode);\n }\n }\n }\n return node;\n}\nfunction visit(idNodeMap, onVisit) {\n function walk(node) {\n onVisit(node);\n }\n for (var key in idNodeMap) {\n if (idNodeMap[key]) {\n walk(idNodeMap[key]);\n }\n }\n}\nfunction handleScroll(node) {\n var n = node.__sn;\n if (n.type !== NodeType.Element) {\n return;\n }\n var el = node;\n for (var name_2 in n.attributes) {\n if (!(n.attributes.hasOwnProperty(name_2) && name_2.startsWith('rr_'))) {\n continue;\n }\n var value = n.attributes[name_2];\n if (name_2 === 'rr_scrollLeft') {\n el.scrollLeft = value;\n }\n if (name_2 === 'rr_scrollTop') {\n el.scrollTop = value;\n }\n }\n}\nfunction rebuild(n, options) {\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache;\n var idNodeMap = {};\n var node = buildNodeWithSN(n, {\n doc: doc,\n map: idNodeMap,\n skipChild: false,\n hackCss: hackCss,\n afterAppend: afterAppend,\n cache: cache\n });\n visit(idNodeMap, function (visitedNode) {\n if (onVisit) {\n onVisit(visitedNode);\n }\n handleScroll(visitedNode);\n });\n return [node, idNodeMap];\n}\n\nexport { IGNORED_NODE, NodeType, addHoverClass, buildNodeWithSN, createCache, is2DCanvasBlank, isElement, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\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***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nexport { __assign, __read, __rest, __spreadArray, __values };\n","var EventType;\n(function (EventType) {\n EventType[EventType[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType[EventType[\"Load\"] = 1] = \"Load\";\n EventType[EventType[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType[EventType[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType[EventType[\"Meta\"] = 4] = \"Meta\";\n EventType[EventType[\"Custom\"] = 5] = \"Custom\";\n EventType[EventType[\"Plugin\"] = 6] = \"Plugin\";\n})(EventType || (EventType = {}));\nvar IncrementalSource;\n(function (IncrementalSource) {\n IncrementalSource[IncrementalSource[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource[IncrementalSource[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource[IncrementalSource[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource[IncrementalSource[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource[IncrementalSource[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource[IncrementalSource[\"Input\"] = 5] = \"Input\";\n IncrementalSource[IncrementalSource[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource[IncrementalSource[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource[IncrementalSource[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource[IncrementalSource[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource[IncrementalSource[\"Font\"] = 10] = \"Font\";\n IncrementalSource[IncrementalSource[\"Log\"] = 11] = \"Log\";\n IncrementalSource[IncrementalSource[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource[IncrementalSource[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n})(IncrementalSource || (IncrementalSource = {}));\nvar MouseInteractions;\n(function (MouseInteractions) {\n MouseInteractions[MouseInteractions[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions[MouseInteractions[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions[MouseInteractions[\"Click\"] = 2] = \"Click\";\n MouseInteractions[MouseInteractions[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions[MouseInteractions[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions[MouseInteractions[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions[MouseInteractions[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions[MouseInteractions[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions[MouseInteractions[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions[MouseInteractions[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions[MouseInteractions[\"TouchCancel\"] = 10] = \"TouchCancel\";\n})(MouseInteractions || (MouseInteractions = {}));\nvar CanvasContext;\n(function (CanvasContext) {\n CanvasContext[CanvasContext[\"2D\"] = 0] = \"2D\";\n CanvasContext[CanvasContext[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext[CanvasContext[\"WebGL2\"] = 2] = \"WebGL2\";\n})(CanvasContext || (CanvasContext = {}));\nvar MediaInteractions;\n(function (MediaInteractions) {\n MediaInteractions[MediaInteractions[\"Play\"] = 0] = \"Play\";\n MediaInteractions[MediaInteractions[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions[MediaInteractions[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions[MediaInteractions[\"VolumeChange\"] = 3] = \"VolumeChange\";\n})(MediaInteractions || (MediaInteractions = {}));\nvar ReplayerEvents;\n(function (ReplayerEvents) {\n ReplayerEvents[\"Start\"] = \"start\";\n ReplayerEvents[\"Pause\"] = \"pause\";\n ReplayerEvents[\"Resume\"] = \"resume\";\n ReplayerEvents[\"Resize\"] = \"resize\";\n ReplayerEvents[\"Finish\"] = \"finish\";\n ReplayerEvents[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents[\"EventCast\"] = \"event-cast\";\n ReplayerEvents[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents[\"Flush\"] = \"flush\";\n ReplayerEvents[\"StateChange\"] = \"state-change\";\n ReplayerEvents[\"PlayBack\"] = \"play-back\";\n})(ReplayerEvents || (ReplayerEvents = {}));\n\nexport { CanvasContext, EventType, IncrementalSource, MediaInteractions, MouseInteractions, ReplayerEvents };\n","import { __values } from '../ext/tslib/tslib.es6.js';\nimport { IncrementalSource } from './types.js';\nimport { IGNORED_NODE, isShadowRoot, NodeType } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target) {\n if (target === void 0) { target = document; }\n var options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return function () { return target.removeEventListener(type, fn, options); };\n}\nfunction createMirror() {\n return {\n map: {},\n getId: function (n) {\n if (!n || !n.__sn) {\n return -1;\n }\n return n.__sn.id;\n },\n getNode: function (id) {\n return this.map[id] || null;\n },\n removeNodeFromMap: function (n) {\n var _this = this;\n var id = n.__sn && n.__sn.id;\n delete this.map[id];\n if (n.childNodes) {\n n.childNodes.forEach(function (child) {\n return _this.removeNodeFromMap(child);\n });\n }\n },\n has: function (id) {\n return this.map.hasOwnProperty(id);\n },\n reset: function () {\n this.map = {};\n },\n };\n}\nvar DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\n '\\r\\n' +\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\n '\\r\\n' +\n 'or you can use record.mirror to access the mirror instance during recording.';\nvar _mirror = {\n map: {},\n getId: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n};\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get: function (target, prop, receiver) {\n if (prop === 'map') {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\nfunction throttle(func, wait, options) {\n if (options === void 0) { options = {}; }\n var timeout = null;\n var previous = 0;\n return function (arg) {\n var now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n var context = this;\n var args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n }\n else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win) {\n if (win === void 0) { win = window; }\n var original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(target, key, isRevoked\n ? d\n : {\n set: function (value) {\n var _this = this;\n setTimeout(function () {\n d.set.call(_this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n },\n });\n return function () { return hookSetter(target, key, original || {}, true); };\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return function () { };\n }\n var original_1 = source[name];\n var wrapped = replacement(original_1);\n if (typeof wrapped === 'function') {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original_1,\n },\n });\n }\n source[name] = wrapped;\n return function () {\n source[name] = original_1;\n };\n }\n catch (_a) {\n return function () { };\n }\n}\nfunction getWindowHeight() {\n return (window.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight));\n}\nfunction getWindowWidth() {\n return (window.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth));\n}\nfunction isBlocked(node, blockClass) {\n if (!node) {\n return false;\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n var needBlock_1 = false;\n if (typeof blockClass === 'string') {\n if (node.closest !== undefined) {\n return node.closest('.' + blockClass) !== null;\n }\n else {\n needBlock_1 = node.classList.contains(blockClass);\n }\n }\n else {\n node.classList.forEach(function (className) {\n if (blockClass.test(className)) {\n needBlock_1 = true;\n }\n });\n }\n return needBlock_1 || isBlocked(node.parentNode, blockClass);\n }\n if (node.nodeType === node.TEXT_NODE) {\n return isBlocked(node.parentNode, blockClass);\n }\n return isBlocked(node.parentNode, blockClass);\n}\nfunction isIgnored(n) {\n if ('__sn' in n) {\n return n.__sn.id === IGNORED_NODE;\n }\n return false;\n}\nfunction isAncestorRemoved(target, mirror) {\n if (isShadowRoot(target)) {\n return false;\n }\n var id = mirror.getId(target);\n if (!mirror.has(id)) {\n return true;\n }\n if (target.parentNode &&\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!target.parentNode) {\n return true;\n }\n return isAncestorRemoved(target.parentNode, mirror);\n}\nfunction isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win) {\n if (win === void 0) { win = window; }\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype\n .forEach;\n }\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype\n .forEach;\n }\n if (!Node.prototype.contains) {\n Node.prototype.contains = function contains(node) {\n if (!(0 in arguments)) {\n throw new TypeError('1 argument is required');\n }\n do {\n if (this === node) {\n return true;\n }\n } while ((node = node && node.parentNode));\n return false;\n };\n }\n}\nvar TreeIndex = (function () {\n function TreeIndex() {\n this.reset();\n }\n TreeIndex.prototype.add = function (mutation) {\n var parentTreeNode = this.indexes.get(mutation.parentId);\n var treeNode = {\n id: mutation.node.id,\n mutation: mutation,\n children: [],\n texts: [],\n attributes: [],\n };\n if (!parentTreeNode) {\n this.tree[treeNode.id] = treeNode;\n }\n else {\n treeNode.parent = parentTreeNode;\n parentTreeNode.children[treeNode.id] = treeNode;\n }\n this.indexes.set(treeNode.id, treeNode);\n };\n TreeIndex.prototype.remove = function (mutation, mirror) {\n var _this = this;\n var parentTreeNode = this.indexes.get(mutation.parentId);\n var treeNode = this.indexes.get(mutation.id);\n var deepRemoveFromMirror = function (id) {\n _this.removeIdSet.add(id);\n var node = mirror.getNode(id);\n node === null || node === void 0 ? void 0 : node.childNodes.forEach(function (childNode) {\n if ('__sn' in childNode) {\n deepRemoveFromMirror(childNode.__sn.id);\n }\n });\n };\n var deepRemoveFromTreeIndex = function (node) {\n _this.removeIdSet.add(node.id);\n Object.values(node.children).forEach(function (n) { return deepRemoveFromTreeIndex(n); });\n var _treeNode = _this.indexes.get(node.id);\n if (_treeNode) {\n var _parentTreeNode = _treeNode.parent;\n if (_parentTreeNode) {\n delete _treeNode.parent;\n delete _parentTreeNode.children[_treeNode.id];\n _this.indexes.delete(mutation.id);\n }\n }\n };\n if (!treeNode) {\n this.removeNodeMutations.push(mutation);\n deepRemoveFromMirror(mutation.id);\n }\n else if (!parentTreeNode) {\n delete this.tree[treeNode.id];\n this.indexes.delete(treeNode.id);\n deepRemoveFromTreeIndex(treeNode);\n }\n else {\n delete treeNode.parent;\n delete parentTreeNode.children[treeNode.id];\n this.indexes.delete(mutation.id);\n deepRemoveFromTreeIndex(treeNode);\n }\n };\n TreeIndex.prototype.text = function (mutation) {\n var treeNode = this.indexes.get(mutation.id);\n if (treeNode) {\n treeNode.texts.push(mutation);\n }\n else {\n this.textMutations.push(mutation);\n }\n };\n TreeIndex.prototype.attribute = function (mutation) {\n var treeNode = this.indexes.get(mutation.id);\n if (treeNode) {\n treeNode.attributes.push(mutation);\n }\n else {\n this.attributeMutations.push(mutation);\n }\n };\n TreeIndex.prototype.scroll = function (d) {\n this.scrollMap.set(d.id, d);\n };\n TreeIndex.prototype.input = function (d) {\n this.inputMap.set(d.id, d);\n };\n TreeIndex.prototype.flush = function () {\n var e_1, _a, e_2, _b;\n var _this = this;\n var _c = this, tree = _c.tree, removeNodeMutations = _c.removeNodeMutations, textMutations = _c.textMutations, attributeMutations = _c.attributeMutations;\n var batchMutationData = {\n source: IncrementalSource.Mutation,\n removes: removeNodeMutations,\n texts: textMutations,\n attributes: attributeMutations,\n adds: [],\n };\n var walk = function (treeNode, removed) {\n if (removed) {\n _this.removeIdSet.add(treeNode.id);\n }\n batchMutationData.texts = batchMutationData.texts\n .concat(removed ? [] : treeNode.texts)\n .filter(function (m) { return !_this.removeIdSet.has(m.id); });\n batchMutationData.attributes = batchMutationData.attributes\n .concat(removed ? [] : treeNode.attributes)\n .filter(function (m) { return !_this.removeIdSet.has(m.id); });\n if (!_this.removeIdSet.has(treeNode.id) &&\n !_this.removeIdSet.has(treeNode.mutation.parentId) &&\n !removed) {\n batchMutationData.adds.push(treeNode.mutation);\n if (treeNode.children) {\n Object.values(treeNode.children).forEach(function (n) { return walk(n, false); });\n }\n }\n else {\n Object.values(treeNode.children).forEach(function (n) { return walk(n, true); });\n }\n };\n Object.values(tree).forEach(function (n) { return walk(n, false); });\n try {\n for (var _d = __values(this.scrollMap.keys()), _e = _d.next(); !_e.done; _e = _d.next()) {\n var id = _e.value;\n if (this.removeIdSet.has(id)) {\n this.scrollMap.delete(id);\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 try {\n for (var _f = __values(this.inputMap.keys()), _g = _f.next(); !_g.done; _g = _f.next()) {\n var id = _g.value;\n if (this.removeIdSet.has(id)) {\n this.inputMap.delete(id);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_g && !_g.done && (_b = _f.return)) _b.call(_f);\n }\n finally { if (e_2) throw e_2.error; }\n }\n var scrollMap = new Map(this.scrollMap);\n var inputMap = new Map(this.inputMap);\n this.reset();\n return {\n mutationData: batchMutationData,\n scrollMap: scrollMap,\n inputMap: inputMap,\n };\n };\n TreeIndex.prototype.reset = function () {\n this.tree = [];\n this.indexes = new Map();\n this.removeNodeMutations = [];\n this.textMutations = [];\n this.attributeMutations = [];\n this.removeIdSet = new Set();\n this.scrollMap = new Map();\n this.inputMap = new Map();\n };\n TreeIndex.prototype.idRemoved = function (id) {\n return this.removeIdSet.has(id);\n };\n return TreeIndex;\n}());\nfunction queueToResolveTrees(queue) {\n var e_3, _a;\n var queueNodeMap = {};\n var putIntoMap = function (m, parent) {\n var nodeInTree = {\n value: m,\n parent: parent,\n children: [],\n };\n queueNodeMap[m.node.id] = nodeInTree;\n return nodeInTree;\n };\n var queueNodeTrees = [];\n try {\n for (var queue_1 = __values(queue), queue_1_1 = queue_1.next(); !queue_1_1.done; queue_1_1 = queue_1.next()) {\n var mutation = queue_1_1.value;\n var nextId = mutation.nextId, parentId = mutation.parentId;\n if (nextId && nextId in queueNodeMap) {\n var nextInTree = queueNodeMap[nextId];\n if (nextInTree.parent) {\n var idx = nextInTree.parent.children.indexOf(nextInTree);\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\n }\n else {\n var idx = queueNodeTrees.indexOf(nextInTree);\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\n }\n continue;\n }\n if (parentId in queueNodeMap) {\n var parentInTree = queueNodeMap[parentId];\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\n continue;\n }\n queueNodeTrees.push(putIntoMap(mutation, null));\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (queue_1_1 && !queue_1_1.done && (_a = queue_1.return)) _a.call(queue_1);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return queueNodeTrees;\n}\nfunction iterateResolveTree(tree, cb) {\n cb(tree.value);\n for (var i = tree.children.length - 1; i >= 0; i--) {\n iterateResolveTree(tree.children[i], cb);\n }\n}\nfunction isIframeINode(node) {\n if ('__sn' in node) {\n return (node.__sn.type === NodeType.Element && node.__sn.tagName === 'iframe');\n }\n return false;\n}\nfunction getBaseDimension(node, rootIframe) {\n var _a, _b;\n var frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\n if (!frameElement || frameElement === rootIframe) {\n return {\n x: 0,\n y: 0,\n relativeScale: 1,\n absoluteScale: 1,\n };\n }\n var frameDimension = frameElement.getBoundingClientRect();\n var frameBaseDimension = getBaseDimension(frameElement, rootIframe);\n var relativeScale = frameDimension.height / frameElement.clientHeight;\n return {\n x: frameDimension.x * frameBaseDimension.relativeScale +\n frameBaseDimension.x,\n y: frameDimension.y * frameBaseDimension.relativeScale +\n frameBaseDimension.y,\n relativeScale: relativeScale,\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\n };\n}\nfunction hasShadowRoot(n) {\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\n}\n\nexport { TreeIndex, _mirror, createMirror, getBaseDimension, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIframeINode, isIgnored, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle };\n","import { __values } from '../../ext/tslib/tslib.es6.js';\nimport { isShadowRoot, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isAncestorRemoved, isIframeINode, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\n return '__ln' in n;\n}\nvar DoubleLinkedList = (function () {\n function DoubleLinkedList() {\n this.length = 0;\n this.head = null;\n }\n DoubleLinkedList.prototype.get = function (position) {\n if (position >= this.length) {\n throw new Error('Position outside of list range');\n }\n var current = this.head;\n for (var index = 0; index < position; index++) {\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\n }\n return current;\n };\n DoubleLinkedList.prototype.addNode = function (n) {\n var node = {\n value: n,\n previous: null,\n next: null,\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n var current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n }\n else if (n.nextSibling &&\n isNodeInLinkedList(n.nextSibling) &&\n n.nextSibling.__ln.previous) {\n var current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n }\n else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n this.length++;\n };\n DoubleLinkedList.prototype.removeNode = function (n) {\n var current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n }\n }\n else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n };\n return DoubleLinkedList;\n}());\nvar moveKey = function (id, parentId) { return \"\".concat(id, \"@\").concat(parentId); };\nfunction isINode(n) {\n return '__sn' in n;\n}\nvar MutationBuffer = (function () {\n function MutationBuffer() {\n var _this = this;\n this.frozen = false;\n this.locked = false;\n this.texts = [];\n this.attributes = [];\n this.removes = [];\n this.mapRemoves = [];\n this.movedMap = {};\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.processMutations = function (mutations) {\n mutations.forEach(_this.processMutation);\n _this.emit();\n };\n this.emit = function () {\n var e_1, _a, e_2, _b;\n if (_this.frozen || _this.locked) {\n return;\n }\n var adds = [];\n var addList = new DoubleLinkedList();\n var getNextId = function (n) {\n var ns = n;\n var nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && _this.mirror.getId(ns);\n }\n return nextId;\n };\n var pushAdd = function (n) {\n var _a, _b, _c, _d, _e;\n var shadowHost = n.getRootNode\n ? (_a = n.getRootNode()) === null || _a === void 0 ? void 0 : _a.host\n : null;\n var rootShadowHost = shadowHost;\n while ((_c = (_b = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _b === void 0 ? void 0 : _b.call(rootShadowHost)) === null || _c === void 0 ? void 0 : _c.host)\n rootShadowHost =\n ((_e = (_d = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _d === void 0 ? void 0 : _d.call(rootShadowHost)) === null || _e === void 0 ? void 0 : _e.host) ||\n null;\n var notInDoc = !_this.doc.contains(n) &&\n (rootShadowHost === null || !_this.doc.contains(rootShadowHost));\n if (!n.parentNode || notInDoc) {\n return;\n }\n var parentId = isShadowRoot(n.parentNode)\n ? _this.mirror.getId(shadowHost)\n : _this.mirror.getId(n.parentNode);\n var nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n var sn = serializeNodeWithId(n, {\n doc: _this.doc,\n map: _this.mirror.map,\n blockClass: _this.blockClass,\n blockSelector: _this.blockSelector,\n maskTextClass: _this.maskTextClass,\n maskTextSelector: _this.maskTextSelector,\n skipChild: true,\n inlineStylesheet: _this.inlineStylesheet,\n maskInputOptions: _this.maskInputOptions,\n maskTextFn: _this.maskTextFn,\n maskInputFn: _this.maskInputFn,\n slimDOMOptions: _this.slimDOMOptions,\n recordCanvas: _this.recordCanvas,\n inlineImages: _this.inlineImages,\n onSerialize: function (currentN) {\n if (isIframeINode(currentN)) {\n _this.iframeManager.addIframe(currentN);\n }\n if (hasShadowRoot(n)) {\n _this.shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: function (iframe, childSn) {\n _this.iframeManager.attachIframe(iframe, childSn);\n _this.shadowDomManager.observeAttachShadow(iframe);\n },\n });\n if (sn) {\n adds.push({\n parentId: parentId,\n nextId: nextId,\n node: sn,\n });\n }\n };\n while (_this.mapRemoves.length) {\n _this.mirror.removeNodeFromMap(_this.mapRemoves.shift());\n }\n try {\n for (var _c = __values(_this.movedSet), _d = _c.next(); !_d.done; _d = _c.next()) {\n var n = _d.value;\n if (isParentRemoved(_this.removes, n, _this.mirror) &&\n !_this.movedSet.has(n.parentNode)) {\n continue;\n }\n pushAdd(n);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_1) throw e_1.error; }\n }\n try {\n for (var _e = __values(_this.addedSet), _f = _e.next(); !_f.done; _f = _e.next()) {\n var n = _f.value;\n if (!isAncestorInSet(_this.droppedSet, n) &&\n !isParentRemoved(_this.removes, n, _this.mirror)) {\n pushAdd(n);\n }\n else if (isAncestorInSet(_this.movedSet, n)) {\n pushAdd(n);\n }\n else {\n _this.droppedSet.add(n);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n }\n finally { if (e_2) throw e_2.error; }\n }\n var candidate = null;\n while (addList.length) {\n var node = null;\n if (candidate) {\n var parentId = _this.mirror.getId(candidate.value.parentNode);\n var nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n for (var index = addList.length - 1; index >= 0; index--) {\n var _node = addList.get(index);\n if (_node) {\n var parentId = _this.mirror.getId(_node.value.parentNode);\n var nextId = getNextId(_node.value);\n if (parentId !== -1 && nextId !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n var payload = {\n texts: _this.texts\n .map(function (text) { return ({\n id: _this.mirror.getId(text.node),\n value: text.value,\n }); })\n .filter(function (text) { return _this.mirror.has(text.id); }),\n attributes: _this.attributes\n .map(function (attribute) { return ({\n id: _this.mirror.getId(attribute.node),\n attributes: attribute.attributes,\n }); })\n .filter(function (attribute) { return _this.mirror.has(attribute.id); }),\n removes: _this.removes,\n adds: adds,\n };\n if (!payload.texts.length &&\n !payload.attributes.length &&\n !payload.removes.length &&\n !payload.adds.length) {\n return;\n }\n _this.texts = [];\n _this.attributes = [];\n _this.removes = [];\n _this.addedSet = new Set();\n _this.movedSet = new Set();\n _this.droppedSet = new Set();\n _this.movedMap = {};\n _this.mutationCb(payload);\n };\n this.processMutation = function (m) {\n var e_3, _a, e_4, _b;\n if (isIgnored(m.target)) {\n return;\n }\n switch (m.type) {\n case 'characterData': {\n var value = m.target.textContent;\n if (!isBlocked(m.target, _this.blockClass) && value !== m.oldValue) {\n _this.texts.push({\n value: needMaskingText(m.target, _this.maskTextClass, _this.maskTextSelector) && value\n ? _this.maskTextFn\n ? _this.maskTextFn(value)\n : value.replace(/[\\S]/g, '*')\n : value,\n node: m.target,\n });\n }\n break;\n }\n case 'attributes': {\n var target = m.target;\n var value = m.target.getAttribute(m.attributeName);\n if (m.attributeName === 'value') {\n value = maskInputValue({\n maskInputOptions: _this.maskInputOptions,\n tagName: m.target.tagName,\n type: m.target.getAttribute('type'),\n value: value,\n maskInputFn: _this.maskInputFn,\n });\n }\n if (isBlocked(m.target, _this.blockClass) || value === m.oldValue) {\n return;\n }\n var item = _this.attributes.find(function (a) { return a.node === m.target; });\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n };\n _this.attributes.push(item);\n }\n if (m.attributeName === 'style') {\n var old = _this.doc.createElement('span');\n if (m.oldValue) {\n old.setAttribute('style', m.oldValue);\n }\n if (item.attributes.style === undefined ||\n item.attributes.style === null) {\n item.attributes.style = {};\n }\n var styleObj = item.attributes.style;\n try {\n for (var _c = __values(Array.from(target.style)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var pname = _d.value;\n var newValue = target.style.getPropertyValue(pname);\n var newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) ||\n newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === '') {\n styleObj[pname] = newValue;\n }\n else {\n styleObj[pname] = [newValue, newPriority];\n }\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_3) throw e_3.error; }\n }\n try {\n for (var _e = __values(Array.from(old.style)), _f = _e.next(); !_f.done; _f = _e.next()) {\n var pname = _f.value;\n if (target.style.getPropertyValue(pname) === '') {\n styleObj[pname] = false;\n }\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n }\n finally { if (e_4) throw e_4.error; }\n }\n }\n else {\n item.attributes[m.attributeName] = transformAttribute(_this.doc, m.target.tagName, m.attributeName, value);\n }\n break;\n }\n case 'childList': {\n m.addedNodes.forEach(function (n) { return _this.genAdds(n, m.target); });\n m.removedNodes.forEach(function (n) {\n var nodeId = _this.mirror.getId(n);\n var parentId = isShadowRoot(m.target)\n ? _this.mirror.getId(m.target.host)\n : _this.mirror.getId(m.target);\n if (isBlocked(m.target, _this.blockClass) || isIgnored(n)) {\n return;\n }\n if (_this.addedSet.has(n)) {\n deepDelete(_this.addedSet, n);\n _this.droppedSet.add(n);\n }\n else if (_this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, _this.mirror)) ;\n else if (_this.movedSet.has(n) &&\n _this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(_this.movedSet, n);\n }\n else {\n _this.removes.push({\n parentId: parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) ? true : undefined,\n });\n }\n _this.mapRemoves.push(n);\n });\n break;\n }\n }\n };\n this.genAdds = function (n, target) {\n if (target && isBlocked(target, _this.blockClass)) {\n return;\n }\n if (isINode(n)) {\n if (isIgnored(n)) {\n return;\n }\n _this.movedSet.add(n);\n var targetId = null;\n if (target && isINode(target)) {\n targetId = target.__sn.id;\n }\n if (targetId) {\n _this.movedMap[moveKey(n.__sn.id, targetId)] = true;\n }\n }\n else {\n _this.addedSet.add(n);\n _this.droppedSet.delete(n);\n }\n if (!isBlocked(n, _this.blockClass))\n n.childNodes.forEach(function (childN) { return _this.genAdds(childN); });\n };\n }\n MutationBuffer.prototype.init = function (options) {\n var _this = this;\n [\n 'mutationCb',\n 'blockClass',\n 'blockSelector',\n 'maskTextClass',\n 'maskTextSelector',\n 'inlineStylesheet',\n 'maskInputOptions',\n 'maskTextFn',\n 'maskInputFn',\n 'recordCanvas',\n 'inlineImages',\n 'slimDOMOptions',\n 'doc',\n 'mirror',\n 'iframeManager',\n 'shadowDomManager',\n 'canvasManager',\n ].forEach(function (key) {\n _this[key] = options[key];\n });\n };\n MutationBuffer.prototype.freeze = function () {\n this.frozen = true;\n this.canvasManager.freeze();\n };\n MutationBuffer.prototype.unfreeze = function () {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n };\n MutationBuffer.prototype.isFrozen = function () {\n return this.frozen;\n };\n MutationBuffer.prototype.lock = function () {\n this.locked = true;\n this.canvasManager.lock();\n };\n MutationBuffer.prototype.unlock = function () {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n };\n MutationBuffer.prototype.reset = function () {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n };\n return MutationBuffer;\n}());\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n n.childNodes.forEach(function (childN) { return deepDelete(addsSet, childN); });\n}\nfunction isParentRemoved(removes, n, mirror) {\n var parentNode = n.parentNode;\n if (!parentNode) {\n return false;\n }\n var parentId = mirror.getId(parentNode);\n if (removes.some(function (r) { return r.id === parentId; })) {\n return true;\n }\n return isParentRemoved(removes, parentNode, mirror);\n}\nfunction isAncestorInSet(set, n) {\n var parentNode = n.parentNode;\n if (!parentNode) {\n return false;\n }\n if (set.has(parentNode)) {\n return true;\n }\n return isAncestorInSet(set, parentNode);\n}\n\nexport default MutationBuffer;\n","import { __read, __values, __spreadArray, __assign } from '../../ext/tslib/tslib.es6.js';\nimport { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isTouchEvent, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch } from '../utils.js';\nimport { IncrementalSource, MouseInteractions } from '../types.js';\nimport MutationBuffer from './mutation.js';\n\nvar mutationBuffers = [];\nvar isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\nvar isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\nvar isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\nvar isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\nfunction getEventTarget(event) {\n try {\n if ('composedPath' in event) {\n var path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n }\n else if ('path' in event && event.path.length) {\n return event.path[0];\n }\n return event.target;\n }\n catch (_a) {\n return event.target;\n }\n}\nfunction initMutationObserver(options, rootEl) {\n var _a, _b;\n var mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n var mutationObserverCtor = window.MutationObserver ||\n window.__rrMutationObserver;\n var angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\n if (angularZoneSymbol &&\n window[angularZoneSymbol]) {\n mutationObserverCtor = window[angularZoneSymbol];\n }\n var observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n });\n return observer;\n}\nfunction initMoveObserver(_a) {\n var mousemoveCb = _a.mousemoveCb, sampling = _a.sampling, doc = _a.doc, mirror = _a.mirror;\n if (sampling.mousemove === false) {\n return function () { };\n }\n var threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\n var callbackThreshold = typeof sampling.mousemoveCallback === 'number'\n ? sampling.mousemoveCallback\n : 500;\n var positions = [];\n var timeBaseline;\n var wrappedCb = throttle(function (source) {\n var totalOffset = Date.now() - timeBaseline;\n mousemoveCb(positions.map(function (p) {\n p.timeOffset -= totalOffset;\n return p;\n }), source);\n positions = [];\n timeBaseline = null;\n }, callbackThreshold);\n var updatePosition = throttle(function (evt) {\n var target = getEventTarget(evt);\n var _a = isTouchEvent(evt)\n ? evt.changedTouches[0]\n : evt, clientX = _a.clientX, clientY = _a.clientY;\n if (!timeBaseline) {\n timeBaseline = Date.now();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror.getId(target),\n timeOffset: Date.now() - timeBaseline,\n });\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\n ? IncrementalSource.Drag\n : evt instanceof MouseEvent\n ? IncrementalSource.MouseMove\n : IncrementalSource.TouchMove);\n }, threshold, {\n trailing: false,\n });\n var handlers = [\n on('mousemove', updatePosition, doc),\n on('touchmove', updatePosition, doc),\n on('drag', updatePosition, doc),\n ];\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initMouseInteractionObserver(_a) {\n var mouseInteractionCb = _a.mouseInteractionCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, sampling = _a.sampling;\n if (sampling.mouseInteraction === false) {\n return function () { };\n }\n var disableMap = sampling.mouseInteraction === true ||\n sampling.mouseInteraction === undefined\n ? {}\n : sampling.mouseInteraction;\n var handlers = [];\n var getHandler = function (eventKey) {\n return function (event) {\n var target = getEventTarget(event);\n if (isBlocked(target, blockClass)) {\n return;\n }\n var e = isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n var id = mirror.getId(target);\n var clientX = e.clientX, clientY = e.clientY;\n mouseInteractionCb({\n type: MouseInteractions[eventKey],\n id: id,\n x: clientX,\n y: clientY,\n });\n };\n };\n Object.keys(MouseInteractions)\n .filter(function (key) {\n return Number.isNaN(Number(key)) &&\n !key.endsWith('_Departed') &&\n disableMap[key] !== false;\n })\n .forEach(function (eventKey) {\n var eventName = eventKey.toLowerCase();\n var handler = getHandler(eventKey);\n handlers.push(on(eventName, handler, doc));\n });\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initScrollObserver(_a) {\n var scrollCb = _a.scrollCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, sampling = _a.sampling;\n var updatePosition = throttle(function (evt) {\n var target = getEventTarget(evt);\n if (!target || isBlocked(target, blockClass)) {\n return;\n }\n var id = mirror.getId(target);\n if (target === doc) {\n var scrollEl = (doc.scrollingElement || doc.documentElement);\n scrollCb({\n id: id,\n x: scrollEl.scrollLeft,\n y: scrollEl.scrollTop,\n });\n }\n else {\n scrollCb({\n id: id,\n x: target.scrollLeft,\n y: target.scrollTop,\n });\n }\n }, sampling.scroll || 100);\n return on('scroll', updatePosition, doc);\n}\nfunction initViewportResizeObserver(_a) {\n var viewportResizeCb = _a.viewportResizeCb;\n var lastH = -1;\n var lastW = -1;\n var updateDimension = throttle(function () {\n var height = getWindowHeight();\n var width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height),\n });\n lastH = height;\n lastW = width;\n }\n }, 200);\n return on('resize', updateDimension, window);\n}\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\n var value = __assign({}, v);\n if (!enable)\n delete value.userTriggered;\n return value;\n}\nvar INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nvar lastInputValueMap = new WeakMap();\nfunction initInputObserver(_a) {\n var inputCb = _a.inputCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, ignoreClass = _a.ignoreClass, maskInputOptions = _a.maskInputOptions, maskInputFn = _a.maskInputFn, sampling = _a.sampling, userTriggeredOnInput = _a.userTriggeredOnInput;\n function eventHandler(event) {\n var target = getEventTarget(event);\n var userTriggered = event.isTrusted;\n if (target && target.tagName === 'OPTION')\n target = target.parentElement;\n if (!target ||\n !target.tagName ||\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\n isBlocked(target, blockClass)) {\n return;\n }\n var type = target.type;\n if (target.classList.contains(ignoreClass)) {\n return;\n }\n var text = target.value;\n var isChecked = false;\n if (type === 'radio' || type === 'checkbox') {\n isChecked = target.checked;\n }\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\n maskInputOptions[type]) {\n text = maskInputValue({\n maskInputOptions: maskInputOptions,\n tagName: target.tagName,\n type: type,\n value: text,\n maskInputFn: maskInputFn,\n });\n }\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text: text, isChecked: isChecked, userTriggered: userTriggered }, userTriggeredOnInput));\n var name = target.name;\n if (type === 'radio' && name && isChecked) {\n doc\n .querySelectorAll(\"input[type=\\\"radio\\\"][name=\\\"\".concat(name, \"\\\"]\"))\n .forEach(function (el) {\n if (el !== target) {\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\n text: el.value,\n isChecked: !isChecked,\n userTriggered: false,\n }, userTriggeredOnInput));\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n var lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue ||\n lastInputValue.text !== v.text ||\n lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n var id = mirror.getId(target);\n inputCb(__assign(__assign({}, v), { id: id }));\n }\n }\n var events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\n var handlers = events.map(function (eventName) { return on(eventName, eventHandler, doc); });\n var propertyDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n var hookProperties = [\n [HTMLInputElement.prototype, 'value'],\n [HTMLInputElement.prototype, 'checked'],\n [HTMLSelectElement.prototype, 'value'],\n [HTMLTextAreaElement.prototype, 'value'],\n [HTMLSelectElement.prototype, 'selectedIndex'],\n [HTMLOptionElement.prototype, 'selected'],\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push.apply(handlers, __spreadArray([], __read(hookProperties.map(function (p) {\n return hookSetter(p[0], p[1], {\n set: function () {\n eventHandler({ target: this });\n },\n });\n })), false));\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction getNestedCSSRulePositions(rule) {\n var positions = [];\n function recurse(childRule, pos) {\n if ((isCSSGroupingRuleSupported &&\n childRule.parentRule instanceof CSSGroupingRule) ||\n (isCSSMediaRuleSupported &&\n childRule.parentRule instanceof CSSMediaRule) ||\n (isCSSSupportsRuleSupported &&\n childRule.parentRule instanceof CSSSupportsRule) ||\n (isCSSConditionRuleSupported &&\n childRule.parentRule instanceof CSSConditionRule)) {\n var rules = Array.from(childRule.parentRule.cssRules);\n var index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n else {\n var rules = Array.from(childRule.parentStyleSheet.cssRules);\n var index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction initStyleSheetObserver(_a, _b) {\n var styleSheetRuleCb = _a.styleSheetRuleCb, mirror = _a.mirror;\n var win = _b.win;\n var insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\n var id = mirror.getId(this.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n adds: [{ rule: rule, index: index }],\n });\n }\n return insertRule.apply(this, arguments);\n };\n var deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\n var id = mirror.getId(this.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n removes: [{ index: index }],\n });\n }\n return deleteRule.apply(this, arguments);\n };\n var supportedNestedCSSRuleTypes = {};\n if (isCSSGroupingRuleSupported) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n }\n else {\n if (isCSSMediaRuleSupported) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (isCSSConditionRuleSupported) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (isCSSSupportsRuleSupported) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n var unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(function (_a) {\n var _b = __read(_a, 2), typeKey = _b[0], type = _b[1];\n unmodifiedFunctions[typeKey] = {\n insertRule: type.prototype.insertRule,\n deleteRule: type.prototype.deleteRule,\n };\n type.prototype.insertRule = function (rule, index) {\n var id = mirror.getId(this.parentStyleSheet.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n adds: [\n {\n rule: rule,\n index: __spreadArray(__spreadArray([], __read(getNestedCSSRulePositions(this)), false), [\n index || 0,\n ], false),\n },\n ],\n });\n }\n return unmodifiedFunctions[typeKey].insertRule.apply(this, arguments);\n };\n type.prototype.deleteRule = function (index) {\n var id = mirror.getId(this.parentStyleSheet.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n removes: [{ index: __spreadArray(__spreadArray([], __read(getNestedCSSRulePositions(this)), false), [index], false) }],\n });\n }\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, arguments);\n };\n });\n return function () {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n Object.entries(supportedNestedCSSRuleTypes).forEach(function (_a) {\n var _b = __read(_a, 2), typeKey = _b[0], type = _b[1];\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n };\n}\nfunction initStyleDeclarationObserver(_a, _b) {\n var styleDeclarationCb = _a.styleDeclarationCb, mirror = _a.mirror;\n var win = _b.win;\n var setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\n var _a, _b;\n var id = mirror.getId((_b = (_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet) === null || _b === void 0 ? void 0 : _b.ownerNode);\n if (id !== -1) {\n styleDeclarationCb({\n id: id,\n set: {\n property: property,\n value: value,\n priority: priority,\n },\n index: getNestedCSSRulePositions(this.parentRule),\n });\n }\n return setProperty.apply(this, arguments);\n };\n var removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\n var _a, _b;\n var id = mirror.getId((_b = (_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet) === null || _b === void 0 ? void 0 : _b.ownerNode);\n if (id !== -1) {\n styleDeclarationCb({\n id: id,\n remove: {\n property: property,\n },\n index: getNestedCSSRulePositions(this.parentRule),\n });\n }\n return removeProperty.apply(this, arguments);\n };\n return function () {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n };\n}\nfunction initMediaInteractionObserver(_a) {\n var mediaInteractionCb = _a.mediaInteractionCb, blockClass = _a.blockClass, mirror = _a.mirror, sampling = _a.sampling;\n var handler = function (type) {\n return throttle(function (event) {\n var target = getEventTarget(event);\n if (!target || isBlocked(target, blockClass)) {\n return;\n }\n var _a = target, currentTime = _a.currentTime, volume = _a.volume, muted = _a.muted;\n mediaInteractionCb({\n type: type,\n id: mirror.getId(target),\n currentTime: currentTime,\n volume: volume,\n muted: muted,\n });\n }, sampling.media || 500);\n };\n var handlers = [\n on('play', handler(0)),\n on('pause', handler(1)),\n on('seeked', handler(2)),\n on('volumechange', handler(3)),\n ];\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initFontObserver(_a) {\n var fontCb = _a.fontCb, doc = _a.doc;\n var win = doc.defaultView;\n if (!win) {\n return function () { };\n }\n var handlers = [];\n var fontMap = new WeakMap();\n var originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n var fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family: family,\n buffer: typeof source !== 'string',\n descriptors: descriptors,\n fontSource: typeof source === 'string'\n ? source\n :\n JSON.stringify(Array.from(new Uint8Array(source))),\n });\n return fontFace;\n };\n var restoreHandler = patch(doc.fonts, 'add', function (original) {\n return function (fontFace) {\n setTimeout(function () {\n var p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }, 0);\n return original.apply(this, [fontFace]);\n };\n });\n handlers.push(function () {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction mergeHooks(o, hooks) {\n var mutationCb = o.mutationCb, mousemoveCb = o.mousemoveCb, mouseInteractionCb = o.mouseInteractionCb, scrollCb = o.scrollCb, viewportResizeCb = o.viewportResizeCb, inputCb = o.inputCb, mediaInteractionCb = o.mediaInteractionCb, styleSheetRuleCb = o.styleSheetRuleCb, styleDeclarationCb = o.styleDeclarationCb, canvasMutationCb = o.canvasMutationCb, fontCb = o.fontCb;\n o.mutationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mutation) {\n hooks.mutation.apply(hooks, __spreadArray([], __read(p), false));\n }\n mutationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mousemoveCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mousemove) {\n hooks.mousemove.apply(hooks, __spreadArray([], __read(p), false));\n }\n mousemoveCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mouseInteractionCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mouseInteraction) {\n hooks.mouseInteraction.apply(hooks, __spreadArray([], __read(p), false));\n }\n mouseInteractionCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.scrollCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.scroll) {\n hooks.scroll.apply(hooks, __spreadArray([], __read(p), false));\n }\n scrollCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.viewportResizeCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.viewportResize) {\n hooks.viewportResize.apply(hooks, __spreadArray([], __read(p), false));\n }\n viewportResizeCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.inputCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.input) {\n hooks.input.apply(hooks, __spreadArray([], __read(p), false));\n }\n inputCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mediaInteractionCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mediaInteaction) {\n hooks.mediaInteaction.apply(hooks, __spreadArray([], __read(p), false));\n }\n mediaInteractionCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.styleSheetRuleCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.styleSheetRule) {\n hooks.styleSheetRule.apply(hooks, __spreadArray([], __read(p), false));\n }\n styleSheetRuleCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.styleDeclarationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.styleDeclaration) {\n hooks.styleDeclaration.apply(hooks, __spreadArray([], __read(p), false));\n }\n styleDeclarationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.canvasMutationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.canvasMutation) {\n hooks.canvasMutation.apply(hooks, __spreadArray([], __read(p), false));\n }\n canvasMutationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.fontCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.font) {\n hooks.font.apply(hooks, __spreadArray([], __read(p), false));\n }\n fontCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n}\nfunction initObservers(o, hooks) {\n var e_1, _a;\n if (hooks === void 0) { hooks = {}; }\n var currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return function () { };\n }\n mergeHooks(o, hooks);\n var mutationObserver = initMutationObserver(o, o.doc);\n var mousemoveHandler = initMoveObserver(o);\n var mouseInteractionHandler = initMouseInteractionObserver(o);\n var scrollHandler = initScrollObserver(o);\n var viewportResizeHandler = initViewportResizeObserver(o);\n var inputHandler = initInputObserver(o);\n var mediaInteractionHandler = initMediaInteractionObserver(o);\n var styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n var styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow,\n });\n var fontObserver = o.collectFonts ? initFontObserver(o) : function () { };\n var pluginHandlers = [];\n try {\n for (var _b = __values(o.plugins), _c = _b.next(); !_c.done; _c = _b.next()) {\n var plugin = _c.value;\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\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 function () {\n mutationBuffers.forEach(function (b) { return b.reset(); });\n mutationObserver.disconnect();\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n pluginHandlers.forEach(function (h) { return h(); });\n };\n}\n\nexport { INPUT_TAGS, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","var IframeManager = (function () {\n function IframeManager(options) {\n this.iframes = new WeakMap();\n this.mutationCb = options.mutationCb;\n }\n IframeManager.prototype.addIframe = function (iframeEl) {\n this.iframes.set(iframeEl, true);\n };\n IframeManager.prototype.addLoadListener = function (cb) {\n this.loadListener = cb;\n };\n IframeManager.prototype.attachIframe = function (iframeEl, childSn) {\n var _a;\n this.mutationCb({\n adds: [\n {\n parentId: iframeEl.__sn.id,\n nextId: null,\n node: childSn,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n });\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\n };\n return IframeManager;\n}());\n\nexport { IframeManager };\n","import { __assign } from '../../ext/tslib/tslib.es6.js';\nimport { initMutationObserver, initScrollObserver } from './observer.js';\nimport { patch } from '../utils.js';\n\nvar ShadowDomManager = (function () {\n function ShadowDomManager(options) {\n this.restorePatches = [];\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n var manager = this;\n this.restorePatches.push(patch(HTMLElement.prototype, 'attachShadow', function (original) {\n return function () {\n var shadowRoot = original.apply(this, arguments);\n if (this.shadowRoot)\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\n return shadowRoot;\n };\n }));\n }\n ShadowDomManager.prototype.addShadowRoot = function (shadowRoot, doc) {\n initMutationObserver(__assign(__assign({}, this.bypassOptions), { doc: doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\n initScrollObserver(__assign(__assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\n };\n ShadowDomManager.prototype.observeAttachShadow = function (iframeElement) {\n if (iframeElement.contentWindow) {\n var manager_1 = this;\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\n return function () {\n var shadowRoot = original.apply(this, arguments);\n if (this.shadowRoot)\n manager_1.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\n return shadowRoot;\n };\n }));\n }\n };\n ShadowDomManager.prototype.reset = function () {\n this.restorePatches.forEach(function (restorePatch) { return restorePatch(); });\n };\n return ShadowDomManager;\n}());\n\nexport { ShadowDomManager };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { encode } from '../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nvar webGLVarMap = new Map();\nfunction variableListFor(ctx, ctor) {\n var contextMap = webGLVarMap.get(ctx);\n if (!contextMap) {\n contextMap = new Map();\n webGLVarMap.set(ctx, contextMap);\n }\n if (!contextMap.has(ctor)) {\n contextMap.set(ctor, []);\n }\n return contextMap.get(ctor);\n}\nvar saveWebGLVar = function (value, win, ctx) {\n if (!value ||\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\n return;\n var name = value.constructor.name;\n var list = variableListFor(ctx, name);\n var index = list.indexOf(value);\n if (index === -1) {\n index = list.length;\n list.push(value);\n }\n return index;\n};\nfunction serializeArg(value, win, ctx) {\n if (value instanceof Array) {\n return value.map(function (arg) { return serializeArg(arg, win, ctx); });\n }\n else if (value === null) {\n return value;\n }\n else if (value instanceof Float32Array ||\n value instanceof Float64Array ||\n value instanceof Int32Array ||\n value instanceof Uint32Array ||\n value instanceof Uint8Array ||\n value instanceof Uint16Array ||\n value instanceof Int16Array ||\n value instanceof Int8Array ||\n value instanceof Uint8ClampedArray) {\n var name_1 = value.constructor.name;\n return {\n rr_type: name_1,\n args: [Object.values(value)],\n };\n }\n else if (value instanceof ArrayBuffer) {\n var name_2 = value.constructor.name;\n var base64 = encode(value);\n return {\n rr_type: name_2,\n base64: base64,\n };\n }\n else if (value instanceof DataView) {\n var name_3 = value.constructor.name;\n return {\n rr_type: name_3,\n args: [\n serializeArg(value.buffer, win, ctx),\n value.byteOffset,\n value.byteLength,\n ],\n };\n }\n else if (value instanceof HTMLImageElement) {\n var name_4 = value.constructor.name;\n var src = value.src;\n return {\n rr_type: name_4,\n src: src,\n };\n }\n else if (value instanceof ImageData) {\n var name_5 = value.constructor.name;\n return {\n rr_type: name_5,\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\n };\n }\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\n var name_6 = value.constructor.name;\n var index = saveWebGLVar(value, win, ctx);\n return {\n rr_type: name_6,\n index: index,\n };\n }\n return value;\n}\nvar serializeArgs = function (args, win, ctx) {\n return __spreadArray([], __read(args), false).map(function (arg) { return serializeArg(arg, win, ctx); });\n};\nvar isInstanceOfWebGLObject = function (value, win) {\n var webGLConstructorNames = [\n 'WebGLActiveInfo',\n 'WebGLBuffer',\n 'WebGLFramebuffer',\n 'WebGLProgram',\n 'WebGLRenderbuffer',\n 'WebGLShader',\n 'WebGLShaderPrecisionFormat',\n 'WebGLTexture',\n 'WebGLUniformLocation',\n 'WebGLVertexArrayObject',\n 'WebGLVertexArrayObjectOES',\n ];\n var supportedWebGLConstructorNames = webGLConstructorNames.filter(function (name) { return typeof win[name] === 'function'; });\n return Boolean(supportedWebGLConstructorNames.find(function (name) { return value instanceof win[name]; }));\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { __spreadArray, __read, __values } from '../../../../ext/tslib/tslib.es6.js';\nimport { CanvasContext } from '../../../types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, mirror, win) {\n var e_1, _a;\n var handlers = [];\n var props = Object.getOwnPropertyNames(prototype);\n var _loop_1 = function (prop) {\n try {\n if (typeof prototype[prop] !== 'function') {\n return \"continue\";\n }\n var restoreHandler = patch(prototype, prop, function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var result = original.apply(this, args);\n saveWebGLVar(result, win, prototype);\n if (!isBlocked(this.canvas, blockClass)) {\n var id = mirror.getId(this.canvas);\n var recordArgs = serializeArgs(__spreadArray([], __read(args), false), win, prototype);\n var mutation = {\n type: type,\n property: prop,\n args: recordArgs,\n };\n cb(this.canvas, mutation);\n }\n return result;\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_b) {\n var hookHandler = hookSetter(prototype, prop, {\n set: function (v) {\n cb(this.canvas, {\n type: type,\n property: prop,\n args: [v],\n setter: true,\n });\n },\n });\n handlers.push(hookHandler);\n }\n };\n try {\n for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {\n var prop = props_1_1.value;\n _loop_1(prop);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return handlers;\n}\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, mirror) {\n var handlers = [];\n handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, mirror, win)), false));\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\n handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, mirror, win)), false));\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvasWebGLMutationObserver;\n","import { __rest } from '../../../../ext/tslib/tslib.es6.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\n\nvar CanvasManager = (function () {\n function CanvasManager(options) {\n this.pendingCanvasMutations = new Map();\n this.rafStamps = { latestId: 0, invokeId: null };\n this.frozen = false;\n this.locked = false;\n this.processMutation = function (target, mutation) {\n var newFrame = this.rafStamps.invokeId &&\n this.rafStamps.latestId !== this.rafStamps.invokeId;\n if (newFrame || !this.rafStamps.invokeId)\n this.rafStamps.invokeId = this.rafStamps.latestId;\n if (!this.pendingCanvasMutations.has(target)) {\n this.pendingCanvasMutations.set(target, []);\n }\n this.pendingCanvasMutations.get(target).push(mutation);\n };\n this.mutationCb = options.mutationCb;\n this.mirror = options.mirror;\n if (options.recordCanvas === true)\n this.initCanvasMutationObserver(options.win, options.blockClass);\n }\n CanvasManager.prototype.reset = function () {\n this.pendingCanvasMutations.clear();\n this.resetObservers && this.resetObservers();\n };\n CanvasManager.prototype.freeze = function () {\n this.frozen = true;\n };\n CanvasManager.prototype.unfreeze = function () {\n this.frozen = false;\n };\n CanvasManager.prototype.lock = function () {\n this.locked = true;\n };\n CanvasManager.prototype.unlock = function () {\n this.locked = false;\n };\n CanvasManager.prototype.initCanvasMutationObserver = function (win, blockClass) {\n this.startRAFTimestamping();\n this.startPendingCanvasMutationFlusher();\n var canvasContextReset = initCanvasContextObserver(win, blockClass);\n var canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);\n var canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);\n this.resetObservers = function () {\n canvasContextReset();\n canvas2DReset();\n canvasWebGL1and2Reset();\n };\n };\n CanvasManager.prototype.startPendingCanvasMutationFlusher = function () {\n var _this = this;\n requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });\n };\n CanvasManager.prototype.startRAFTimestamping = function () {\n var _this = this;\n var setLatestRAFTimestamp = function (timestamp) {\n _this.rafStamps.latestId = timestamp;\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n CanvasManager.prototype.flushPendingCanvasMutations = function () {\n var _this = this;\n this.pendingCanvasMutations.forEach(function (values, canvas) {\n var id = _this.mirror.getId(canvas);\n _this.flushPendingCanvasMutationFor(canvas, id);\n });\n requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });\n };\n CanvasManager.prototype.flushPendingCanvasMutationFor = function (canvas, id) {\n if (this.frozen || this.locked) {\n return;\n }\n var valuesWithType = this.pendingCanvasMutations.get(canvas);\n if (!valuesWithType || id === -1)\n return;\n var values = valuesWithType.map(function (value) {\n value.type; var rest = __rest(value, [\"type\"]);\n return rest;\n });\n var type = valuesWithType[0].type;\n this.mutationCb({ id: id, type: type, commands: values });\n this.pendingCanvasMutations.delete(canvas);\n };\n return CanvasManager;\n}());\n\nexport { CanvasManager };\n","import { __assign, __read, __values } from '../../ext/tslib/tslib.es6.js';\nimport { snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, createMirror, getWindowWidth, getWindowHeight, isIframeINode, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\n\nfunction wrapEvent(e) {\n return __assign(__assign({}, e), { timestamp: Date.now() });\n}\nvar wrappedEmit;\nvar takeFullSnapshot;\nvar mirror = createMirror();\nfunction record(options) {\n if (options === void 0) { options = {}; }\n var emit = options.emit, checkoutEveryNms = options.checkoutEveryNms, checkoutEveryNth = options.checkoutEveryNth, _a = options.blockClass, blockClass = _a === void 0 ? 'rr-block' : _a, _b = options.blockSelector, blockSelector = _b === void 0 ? null : _b, _c = options.ignoreClass, ignoreClass = _c === void 0 ? 'rr-ignore' : _c, _d = options.maskTextClass, maskTextClass = _d === void 0 ? 'rr-mask' : _d, _e = options.maskTextSelector, maskTextSelector = _e === void 0 ? null : _e, _f = options.inlineStylesheet, inlineStylesheet = _f === void 0 ? true : _f, maskAllInputs = options.maskAllInputs, _maskInputOptions = options.maskInputOptions, _slimDOMOptions = options.slimDOMOptions, maskInputFn = options.maskInputFn, maskTextFn = options.maskTextFn, hooks = options.hooks, packFn = options.packFn, _g = options.sampling, sampling = _g === void 0 ? {} : _g, mousemoveWait = options.mousemoveWait, _h = options.recordCanvas, recordCanvas = _h === void 0 ? false : _h, _j = options.userTriggeredOnInput, userTriggeredOnInput = _j === void 0 ? false : _j, _k = options.collectFonts, collectFonts = _k === void 0 ? false : _k, _l = options.inlineImages, inlineImages = _l === void 0 ? false : _l, plugins = options.plugins, _m = options.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\n if (!emit) {\n throw new Error('emit function is required');\n }\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\n sampling.mousemove = mousemoveWait;\n }\n var maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true,\n }\n : _maskInputOptions !== undefined\n ? _maskInputOptions\n : { password: true };\n var slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\n ? {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n headMetaAuthorship: _slimDOMOptions === 'all',\n headMetaDescKeywords: _slimDOMOptions === 'all',\n }\n : _slimDOMOptions\n ? _slimDOMOptions\n : {};\n polyfill();\n var lastFullSnapshotEvent;\n var incrementalSnapshotCount = 0;\n var eventProcessor = function (e) {\n var e_1, _a;\n try {\n for (var _b = __values(plugins || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var plugin = _c.value;\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\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 if (packFn) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = function (e, isCheckout) {\n var _a;\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\n e.type !== EventType.FullSnapshot &&\n !(e.type === EventType.IncrementalSnapshot &&\n e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach(function (buf) { return buf.unfreeze(); });\n }\n emit(eventProcessor(e), isCheckout);\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n }\n else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation &&\n e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n var exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n var exceedTime = checkoutEveryNms &&\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n var wrappedMutationEmit = function (m) {\n wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Mutation }, m),\n }));\n };\n var wrappedScrollEmit = function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Scroll }, p),\n }));\n };\n var wrappedCanvasMutationEmit = function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.CanvasMutation }, p),\n }));\n };\n var iframeManager = new IframeManager({\n mutationCb: wrappedMutationEmit,\n });\n var canvasManager = new CanvasManager({\n recordCanvas: recordCanvas,\n mutationCb: wrappedCanvasMutationEmit,\n win: window,\n blockClass: blockClass,\n mirror: mirror,\n });\n var shadowDomManager = new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n sampling: sampling,\n slimDOMOptions: slimDOMOptions,\n iframeManager: iframeManager,\n canvasManager: canvasManager,\n },\n mirror: mirror,\n });\n takeFullSnapshot = function (isCheckout) {\n var _a, _b, _c, _d;\n if (isCheckout === void 0) { isCheckout = false; }\n wrappedEmit(wrapEvent({\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight(),\n },\n }), isCheckout);\n mutationBuffers.forEach(function (buf) { return buf.lock(); });\n var _e = __read(snapshot(document, {\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskTextFn: maskTextFn,\n slimDOM: slimDOMOptions,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n onSerialize: function (n) {\n if (isIframeINode(n)) {\n iframeManager.addIframe(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: function (iframe, childSn) {\n iframeManager.attachIframe(iframe, childSn);\n shadowDomManager.observeAttachShadow(iframe);\n },\n keepIframeSrcFn: keepIframeSrcFn,\n }), 2), node = _e[0], idNodeMap = _e[1];\n if (!node) {\n return console.warn('Failed to snapshot the document');\n }\n mirror.map = idNodeMap;\n wrappedEmit(wrapEvent({\n type: EventType.FullSnapshot,\n data: {\n node: node,\n initialOffset: {\n left: window.pageXOffset !== undefined\n ? window.pageXOffset\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\n (document === null || document === void 0 ? void 0 : document.body.scrollLeft) ||\n 0,\n top: window.pageYOffset !== undefined\n ? window.pageYOffset\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\n ((_d = (_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.parentElement) === null || _d === void 0 ? void 0 : _d.scrollTop) ||\n (document === null || document === void 0 ? void 0 : document.body.scrollTop) ||\n 0,\n },\n },\n }));\n mutationBuffers.forEach(function (buf) { return buf.unlock(); });\n };\n try {\n var handlers_1 = [];\n handlers_1.push(on('DOMContentLoaded', function () {\n wrappedEmit(wrapEvent({\n type: EventType.DomContentLoaded,\n data: {},\n }));\n }));\n var observe_1 = function (doc) {\n var _a;\n return initObservers({\n mutationCb: wrappedMutationEmit,\n mousemoveCb: function (positions, source) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: {\n source: source,\n positions: positions,\n },\n }));\n },\n mouseInteractionCb: function (d) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.MouseInteraction }, d),\n }));\n },\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: function (d) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.ViewportResize }, d),\n }));\n },\n inputCb: function (v) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Input }, v),\n }));\n },\n mediaInteractionCb: function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.MediaInteraction }, p),\n }));\n },\n styleSheetRuleCb: function (r) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.StyleSheetRule }, r),\n }));\n },\n styleDeclarationCb: function (r) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.StyleDeclaration }, r),\n }));\n },\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Font }, p),\n }));\n },\n blockClass: blockClass,\n ignoreClass: ignoreClass,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n maskInputOptions: maskInputOptions,\n inlineStylesheet: inlineStylesheet,\n sampling: sampling,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n userTriggeredOnInput: userTriggeredOnInput,\n collectFonts: collectFonts,\n doc: doc,\n maskInputFn: maskInputFn,\n maskTextFn: maskTextFn,\n blockSelector: blockSelector,\n slimDOMOptions: slimDOMOptions,\n mirror: mirror,\n iframeManager: iframeManager,\n shadowDomManager: shadowDomManager,\n canvasManager: canvasManager,\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter(function (p) { return p.observer; })) === null || _a === void 0 ? void 0 : _a.map(function (p) { return ({\n observer: p.observer,\n options: p.options,\n callback: function (payload) {\n return wrappedEmit(wrapEvent({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload: payload,\n },\n }));\n },\n }); })) || [],\n }, hooks);\n };\n iframeManager.addLoadListener(function (iframeEl) {\n handlers_1.push(observe_1(iframeEl.contentDocument));\n });\n var init_1 = function () {\n takeFullSnapshot();\n handlers_1.push(observe_1(document));\n };\n if (document.readyState === 'interactive' ||\n document.readyState === 'complete') {\n init_1();\n }\n else {\n handlers_1.push(on('load', function () {\n wrappedEmit(wrapEvent({\n type: EventType.Load,\n data: {},\n }));\n init_1();\n }, window));\n }\n return function () {\n handlers_1.forEach(function (h) { return h(); });\n };\n }\n catch (error) {\n console.warn(error);\n }\n}\nrecord.addCustomEvent = function (tag, payload) {\n if (!wrappedEmit) {\n throw new Error('please add custom event after start recording');\n }\n wrappedEmit(wrapEvent({\n type: EventType.Custom,\n data: {\n tag: tag,\n payload: payload,\n },\n }));\n};\nrecord.freezePage = function () {\n mutationBuffers.forEach(function (buf) { return buf.freeze(); });\n};\nrecord.takeFullSnapshot = function (isCheckout) {\n if (!takeFullSnapshot) {\n throw new Error('please take full snapshot after start recording');\n }\n takeFullSnapshot(isCheckout);\n};\nrecord.mirror = mirror;\n\nexport default record;\n","import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass) {\n var handlers = [];\n try {\n var restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\n return function (contextType) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (!isBlocked(this, blockClass)) {\n if (!('__context' in this))\n this.__context = contextType;\n }\n return original.apply(this, __spreadArray([contextType], __read(args), false));\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_a) {\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvasContextObserver;\n","import { __values, __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { CanvasContext } from '../../../types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, mirror) {\n var e_1, _a;\n var handlers = [];\n var props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\n var _loop_1 = function (prop) {\n try {\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\n return \"continue\";\n }\n var restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\n return function () {\n var _this = this;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!isBlocked(this.canvas, blockClass)) {\n setTimeout(function () {\n var recordArgs = __spreadArray([], __read(args), false);\n if (prop === 'drawImage') {\n if (recordArgs[0] &&\n recordArgs[0] instanceof HTMLCanvasElement) {\n var canvas = recordArgs[0];\n var ctx = canvas.getContext('2d');\n var imgd = ctx === null || ctx === void 0 ? void 0 : ctx.getImageData(0, 0, canvas.width, canvas.height);\n var pix = imgd === null || imgd === void 0 ? void 0 : imgd.data;\n recordArgs[0] = JSON.stringify(pix);\n }\n }\n cb(_this.canvas, {\n type: CanvasContext['2D'],\n property: prop,\n args: recordArgs,\n });\n }, 0);\n }\n return original.apply(this, args);\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_b) {\n var hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\n set: function (v) {\n cb(this.canvas, {\n type: CanvasContext['2D'],\n property: prop,\n args: [v],\n setter: true,\n });\n },\n });\n handlers.push(hookHandler);\n }\n };\n try {\n for (var props2D_1 = __values(props2D), props2D_1_1 = props2D_1.next(); !props2D_1_1.done; props2D_1_1 = props2D_1.next()) {\n var prop = props2D_1_1.value;\n _loop_1(prop);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (props2D_1_1 && !props2D_1_1.done && (_a = props2D_1.return)) _a.call(props2D_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvas2DMutationObserver;\n","var StackFrame = (function () {\n function StackFrame(obj) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n StackFrame.prototype.toString = function () {\n var lineNumber = this.lineNumber || '';\n var columnNumber = this.columnNumber || '';\n if (this.functionName) {\n return (this.functionName +\n ' (' +\n this.fileName +\n ':' +\n lineNumber +\n ':' +\n columnNumber +\n ')');\n }\n return this.fileName + ':' + lineNumber + ':' + columnNumber;\n };\n return StackFrame;\n}());\nvar FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nvar CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nvar SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nvar ErrorStackParser = {\n parse: function (error) {\n if (!error) {\n return [];\n }\n if (typeof error.stacktrace !== 'undefined' ||\n typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n }\n else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n }\n else if (error.stack) {\n return this.parseFFOrSafari(error);\n }\n else {\n throw new Error('Cannot parse given Error object');\n }\n },\n extractLocation: function (urlLike) {\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n var regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts)\n throw new Error(\"Cannot parse given url: \".concat(urlLike));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n var sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n var location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n var tokens = sanitizedLine.split(/\\s+/).slice(1);\n var locationParts = this.extractLocation(location ? location[1] : tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n return new StackFrame({\n functionName: functionName,\n fileName: fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n return filtered.map(function (line) {\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, ':$1');\n }\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n return new StackFrame({\n functionName: line,\n });\n }\n else {\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n var matches = line.match(functionNameRegex);\n var functionName = matches && matches[1] ? matches[1] : undefined;\n var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e) {\n if (!e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n }\n else if (!e.stack) {\n return this.parseOpera10(e);\n }\n else {\n return this.parseOpera11(e);\n }\n },\n parseOpera9: function (e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }));\n }\n }\n return result;\n },\n parseOpera10: function (e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }));\n }\n }\n return result;\n },\n parseOpera11: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return (!!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/));\n }, this);\n return filtered.map(function (line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = tokens.shift() || '';\n var functionName = functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n\nexport { ErrorStackParser, StackFrame };\n","import { __values } from '../../../../ext/tslib/tslib.es6.js';\n\nfunction pathToSelector(node) {\n if (!node || !node.outerHTML) {\n return '';\n }\n var path = '';\n while (node.parentElement) {\n var name_1 = node.localName;\n if (!name_1) {\n break;\n }\n name_1 = name_1.toLowerCase();\n var parent_1 = node.parentElement;\n var domSiblings = [];\n if (parent_1.children && parent_1.children.length > 0) {\n for (var i = 0; i < parent_1.children.length; i++) {\n var sibling = parent_1.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name_1) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n if (domSiblings.length > 1) {\n name_1 += ':eq(' + domSiblings.indexOf(node) + ')';\n }\n path = name_1 + (path ? '>' + path : '');\n node = parent_1;\n }\n return path;\n}\nfunction isObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\nfunction isObjTooDeep(obj, limit) {\n var e_1, _a;\n if (limit === 0) {\n return true;\n }\n var keys = Object.keys(obj);\n try {\n for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {\n var key = keys_1_1.value;\n if (isObject(obj[key]) && isObjTooDeep(obj[key], limit - 1)) {\n return true;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return false;\n}\nfunction stringify(obj, stringifyOptions) {\n var options = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n var stack = [];\n var keys = [];\n return JSON.stringify(obj, function (key, value) {\n if (stack.length > 0) {\n var thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n }\n else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n }\n else {\n stack.push(value);\n }\n if (value === null || value === undefined) {\n return value;\n }\n if (shouldIgnore(value)) {\n return toString(value);\n }\n if (value instanceof Event) {\n var eventResult = {};\n for (var eventKey in value) {\n var eventValue = value[eventKey];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(eventValue.length ? eventValue[0] : null);\n }\n else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n }\n else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n }\n else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n });\n function shouldIgnore(_obj) {\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n if (typeof _obj === 'function') {\n return true;\n }\n if (isObject(_obj) && isObjTooDeep(_obj, options.depthOfLimit)) {\n return true;\n }\n return false;\n }\n function toString(_obj) {\n var str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = \"\".concat(str.slice(0, options.stringLengthLimit), \"...\");\n }\n return str;\n }\n}\n\nexport { stringify };\n","import { __values, __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { patch } from '../../../utils.js';\nimport { ErrorStackParser } from './error-stack-parser.js';\nimport { stringify } from './stringify.js';\n\nvar defaultLogOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\nfunction initLogObserver(cb, win, logOptions) {\n var e_1, _a;\n var loggerType = logOptions.logger;\n if (!loggerType) {\n return function () { };\n }\n var logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n }\n else {\n logger = loggerType;\n }\n var logCount = 0;\n var cancelHandlers = [];\n if (logOptions.level.includes('error')) {\n if (window) {\n var errorHandler_1 = function (event) {\n var message = event.message, error = event.error;\n var trace = ErrorStackParser.parse(error).map(function (stackFrame) { return stackFrame.toString(); });\n var payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace: trace,\n payload: payload,\n });\n };\n window.addEventListener('error', errorHandler_1);\n cancelHandlers.push(function () {\n if (window)\n window.removeEventListener('error', errorHandler_1);\n });\n }\n }\n try {\n for (var _b = __values(logOptions.level), _c = _b.next(); !_c.done; _c = _b.next()) {\n var levelType = _c.value;\n cancelHandlers.push(replace(logger, levelType));\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 function () {\n cancelHandlers.forEach(function (h) { return h(); });\n };\n function replace(_logger, level) {\n var _this = this;\n if (!_logger[level]) {\n return function () { };\n }\n return patch(_logger, level, function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n original.apply(_this, args);\n try {\n var trace = ErrorStackParser.parse(new Error())\n .map(function (stackFrame) { return stackFrame.toString(); })\n .splice(1);\n var payload = args.map(function (s) {\n return stringify(s, logOptions.stringifyOptions);\n });\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level: level,\n trace: trace,\n payload: payload,\n });\n }\n else if (logCount === logOptions.lengthThreshold) {\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n }\n catch (error) {\n original.apply(void 0, __spreadArray(['rrweb logger error:', error], __read(args), false));\n }\n };\n });\n }\n}\nvar PLUGIN_NAME = 'rrweb/console@1';\nvar getRecordConsolePlugin = function (options) { return ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options\n ? Object.assign({}, defaultLogOptions, options)\n : defaultLogOptions,\n}); };\n\nexport { PLUGIN_NAME, getRecordConsolePlugin };\n","import { version } from 'rrweb-v1/package.json'\n\n// Same as loader-globals.ts except includes rrweb scripts.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport rrwebRecord from 'rrweb-v1/es/rrweb/packages/rrweb/src/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { getRecordConsolePlugin } from 'rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\n\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\n\n;(win as any).rrweb = { record: rrwebRecord, version: 'v1', rrwebVersion: version }\n;(win as any).rrwebConsoleRecord = { getRecordConsolePlugin }\n\nexport default rrwebRecord\n","import { version } from '../package.json'\n\n// overriden in posthog-core,\n// e.g. Config.DEBUG = Config.DEBUG || instance.get_config('debug')\nconst Config = {\n DEBUG: false,\n LIB_VERSION: version,\n}\n\nexport default Config\n","import Config from './config'\nimport { Breaker, EventHandler, Properties } from './types'\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\nconst ArrayProto = Array.prototype\nconst ObjProto = Object.prototype\nconst toString = ObjProto.toString\nconst hasOwnProperty = ObjProto.hasOwnProperty\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\nconst navigator = win.navigator || { userAgent: '' }\nconst document = win.document || {}\nconst userAgent = navigator.userAgent\nconst localDomains = ['localhost', '127.0.0.1']\n\nconst nativeForEach = ArrayProto.forEach,\n nativeIndexOf = ArrayProto.indexOf,\n nativeIsArray = Array.isArray,\n breaker: Breaker = {}\n\n// Console override\nconst logger = {\n /** @type {function(...*)} */\n log: function (...args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n // Don't log PostHog debug messages in rrweb\n const log =\n '__rrweb_original__' in window.console.log\n ? (window.console.log as any)['__rrweb_original__']\n : window.console.log\n\n try {\n log.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n log(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n error: function (..._args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n critical: function (..._args: any[]) {\n if (!_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n unintializedWarning: function (methodName: string): void {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n logger.error(`[PostHog] You must initialize PostHog before calling ${methodName}`)\n }\n },\n}\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nexport const _trim = function (str: string): string {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n}\n\nexport const _bind_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = obj[func].bind(obj)\n }\n }\n}\n\nexport function _eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (Array.isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function _each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (obj === null || obj === undefined) {\n return\n }\n if (Array.isArray(obj)) {\n return _eachArray(obj, iterator, thisArg)\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const _extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n _eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\n\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\n}\n\nexport const _include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (obj === null) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n _each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\nexport function _includes<T = any>(str: T[] | string, needle: T): boolean {\n return (str as any).indexOf(needle) !== -1\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function _entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\n// Underscore Addons\nexport const _isObject = function (obj: any): obj is Record<string, any> {\n return obj === Object(obj) && !_isArray(obj)\n}\n\nexport const _isEmptyObject = function (obj: any): obj is Record<string, any> {\n if (_isObject(obj)) {\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\n\nexport const _isUndefined = function (obj: any): obj is undefined {\n return obj === void 0\n}\n\nexport const _isString = function (obj: any): obj is string {\n return toString.call(obj) == '[object String]'\n}\n\nexport const _isDate = function (obj: any): obj is Date {\n return toString.call(obj) == '[object Date]'\n}\n\nexport const _isNumber = function (obj: any): obj is number {\n return toString.call(obj) == '[object Number]'\n}\n\nexport const _encodeDates = function (obj: Properties): Properties {\n _each(obj, function (v, k) {\n if (_isDate(v)) {\n obj[k] = _formatDate(v)\n } else if (_isObject(v)) {\n obj[k] = _encodeDates(v) // recurse\n }\n })\n return obj\n}\n\nexport const _timestamp = function (): number {\n Date.now =\n Date.now ||\n function () {\n return +new Date()\n }\n return Date.now()\n}\n\nexport const _formatDate = function (d: Date): string {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n: number) {\n return n < 10 ? '0' + n : n\n }\n return (\n d.getUTCFullYear() +\n '-' +\n pad(d.getUTCMonth() + 1) +\n '-' +\n pad(d.getUTCDate()) +\n 'T' +\n pad(d.getUTCHours()) +\n ':' +\n pad(d.getUTCMinutes()) +\n ':' +\n pad(d.getUTCSeconds())\n )\n}\n\nexport const _safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical('Implementation error. Please turn on debug and contact support@posthog.com.')\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const _safewrap_class = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = _safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const _safewrap_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = _safewrap(obj[func])\n }\n }\n}\n\nexport const _strip_empty_properties = function (p: Properties): Properties {\n const ret: Properties = {}\n _each(p, function (v, k) {\n if (_isString(v) && v.length > 0) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (_isArray(value)) {\n result = [] as any as T\n _eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n _each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nconst LONG_STRINGS_ALLOW_LIST = ['$performance_raw']\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any, key) => {\n if (key && LONG_STRINGS_ALLOW_LIST.indexOf(key as string) > -1) {\n return value\n }\n if (typeof value === 'string' && maxStringLength !== null) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\nexport function _base64Encode(data: null): null\nexport function _base64Encode(data: undefined): undefined\nexport function _base64Encode(data: string): string\nexport function _base64Encode(data: string | null | undefined): string | null | undefined {\n const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let o1,\n o2,\n o3,\n h1,\n h2,\n h3,\n h4,\n bits,\n i = 0,\n ac = 0,\n enc = ''\n const tmp_arr: string[] = []\n\n if (!data) {\n return data\n }\n\n data = _utf8Encode(data)\n\n do {\n // pack three octets into four hexets\n o1 = data.charCodeAt(i++)\n o2 = data.charCodeAt(i++)\n o3 = data.charCodeAt(i++)\n\n bits = (o1 << 16) | (o2 << 8) | o3\n\n h1 = (bits >> 18) & 0x3f\n h2 = (bits >> 12) & 0x3f\n h3 = (bits >> 6) & 0x3f\n h4 = bits & 0x3f\n\n // use hexets to index into b64, and append result to encoded string\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)\n } while (i < data.length)\n\n enc = tmp_arr.join('')\n\n switch (data.length % 3) {\n case 1:\n enc = enc.slice(0, -2) + '=='\n break\n case 2:\n enc = enc.slice(0, -1) + '='\n break\n }\n\n return enc\n}\n\nexport const _utf8Encode = function (string: string): string {\n string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\n let utftext = '',\n start,\n end\n let stringl = 0,\n n\n\n start = end = 0\n stringl = string.length\n\n for (n = 0; n < stringl; n++) {\n const c1 = string.charCodeAt(n)\n let enc = null\n\n if (c1 < 128) {\n end++\n } else if (c1 > 127 && c1 < 2048) {\n enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128)\n } else {\n enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128)\n }\n if (enc !== null) {\n if (end > start) {\n utftext += string.substring(start, end)\n }\n utftext += enc\n start = end = n + 1\n }\n }\n\n if (end > start) {\n utftext += string.substring(start, string.length)\n }\n\n return utftext\n}\n\nexport const DEFAULT_BLOCKED_UA_STRS = [\n 'ahrefsbot',\n 'applebot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'bot.htm',\n 'bot.php',\n 'crawler',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'gptbot',\n 'hubspot',\n 'linkedinbot',\n 'mj12bot',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'semrushbot',\n 'sitebulb',\n 'twitterbot',\n 'yahoo! slurp',\n 'yandexbot',\n\n // a whole bunch of goog-specific crawlers\n // https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers\n 'adsbot-google',\n 'apis-google',\n 'duplexweb-google',\n 'feedfetcher-google',\n 'google favicon',\n 'google web preview',\n 'google-read-aloud',\n 'googlebot',\n 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n]\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false capturing data\nexport const _isBlockedUA = function (ua: string, customBlockedUserAgents: string[]): boolean {\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents).some((blockedUA) => {\n if (ua.includes) {\n return ua.includes(blockedUA)\n } else {\n // IE 11 :/\n return ua.indexOf(blockedUA) !== -1\n }\n })\n}\n\n/**\n * @param {Object=} formdata\n * @param {string=} arg_separator\n */\nexport const _HTTPBuildQuery = function (formdata: Record<string, any>, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n use_val = encodeURIComponent(val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\nexport const _getQueryParam = function (url: string, param: string): string {\n // Expects a raw URL\n\n const cleanParam = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]')\n const regexS = '[\\\\?&]' + cleanParam + '=([^&#]*)'\n const regex = new RegExp(regexS)\n const results = regex.exec(url)\n if (results === null || (results && typeof results[1] !== 'string' && (results[1] as any).length)) {\n return ''\n } else {\n let result = results[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const _register_event = (function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from PostHog\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n const register_event = function (\n element: Element | Window | Document | Node,\n type: string,\n handler: EventHandler,\n oldSchool?: boolean,\n useCapture?: boolean\n ) {\n if (!element) {\n logger.error('No valid element provided to register_event')\n return\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture)\n } else {\n const ontype = 'on' + type\n const old_handler = (element as any)[ontype] // can be undefined\n ;(element as any)[ontype] = makeHandler(element, handler, old_handler)\n }\n }\n\n function makeHandler(\n element: Element | Window | Document | Node,\n new_handler: EventHandler,\n old_handlers: EventHandler\n ) {\n return function (event: Event): boolean | void {\n event = event || fixEvent(window.event)\n\n // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n if (!event) {\n return undefined\n }\n\n let ret = true\n let old_result: any\n\n if (_isFunction(old_handlers)) {\n old_result = old_handlers(event)\n }\n const new_result = new_handler.call(element, event)\n\n if (false === old_result || false === new_result) {\n ret = false\n }\n\n return ret\n }\n }\n\n function fixEvent(event: Event | undefined): Event | undefined {\n if (event) {\n event.preventDefault = fixEvent.preventDefault\n event.stopPropagation = fixEvent.stopPropagation\n }\n return event\n }\n fixEvent.preventDefault = function () {\n ;(this as any as Event).returnValue = false\n }\n fixEvent.stopPropagation = function () {\n ;(this as any as Event).cancelBubble = true\n }\n\n return register_event\n})()\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n\nexport function loadScript(scriptUrlToLoad: string, callback: (error?: string | Event, event?: Event) => void): void {\n const addScript = () => {\n const scriptTag = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.src = scriptUrlToLoad\n scriptTag.onload = (event) => callback(undefined, event)\n scriptTag.onerror = (error) => callback(error)\n\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n // In exceptional situations this call might load before the DOM is fully ready.\n document.body.appendChild(scriptTag)\n }\n }\n\n if (document.body) {\n addScript()\n } else {\n document.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\nexport const _info = {\n campaignParams: function (customParams?: string[]): Record<string, any> {\n const campaign_keywords = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gclid',\n 'fbclid',\n 'msclkid',\n ].concat(customParams || [])\n\n const params: Record<string, any> = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = _getQueryParam(document.URL, kwkey)\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (): string | null {\n const referrer = document.referrer\n if (!referrer) {\n return null\n } else if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (): Record<string, any> {\n const search = _info.searchEngine(),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record<string, any> = {}\n\n if (search !== null) {\n ret['$search_engine'] = search\n\n const keyword = _getQueryParam(document.referrer, param)\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple')) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n */\n browserVersion: function (userAgent: string, vendor: string, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexs = {\n 'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n 'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n Chrome: /Chrome\\/(\\d+(\\.\\d+)?)/,\n 'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n 'UC Browser': /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n Safari: /Version\\/(\\d+(\\.\\d+)?)/,\n 'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n Opera: /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n Firefox: /Firefox\\/(\\d+(\\.\\d+)?)/,\n 'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n Konqueror: /Konqueror:(\\d+(\\.\\d+)?)/,\n BlackBerry: /BlackBerry (\\d+(\\.\\d+)?)/,\n 'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n 'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n 'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n Mozilla: /rv:(\\d+(\\.\\d+)?)/,\n }\n const regex: RegExp | undefined = versionRegexs[browser as keyof typeof versionRegexs]\n if (regex === undefined) {\n return null\n }\n const matches = userAgent.match(regex)\n if (!matches) {\n return null\n }\n return parseFloat(matches[matches.length - 2])\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n },\n\n os: function (user_agent: string): { os_name: string; os_version: string } {\n if (/Windows/i.test(user_agent)) {\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return { os_name: 'Windows Phone', os_version: '' }\n }\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent)\n if (match && match[1]) {\n const version = match[1]\n return { os_name: 'Windows', os_version: version }\n }\n return { os_name: 'Windows', os_version: '' }\n } else if (/(iPhone|iPad|iPod)/.test(user_agent)) {\n const match = /OS (\\d+)_(\\d+)_?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'iOS', os_version: versionParts.join('.') }\n }\n return { os_name: 'iOS', os_version: '' }\n } else if (/Android/.test(user_agent)) {\n const match = /Android (\\d+)\\.(\\d+)\\.?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Android', os_version: versionParts.join('.') }\n }\n return { os_name: 'Android', os_version: '' }\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return { os_name: 'BlackBerry', os_version: '' }\n } else if (/Mac/i.test(user_agent)) {\n const match = /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Mac OS X', os_version: versionParts.join('.') }\n }\n return { os_name: 'Mac OS X', os_version: '' }\n } else if (/Linux/.test(user_agent)) {\n return { os_name: 'Linux', os_version: '' }\n } else if (/CrOS/.test(user_agent)) {\n return { os_name: 'Chrome OS', os_version: '' }\n } else {\n return { os_name: '', os_version: '' }\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referrer: function (): string {\n return document.referrer || '$direct'\n },\n\n referringDomain: function (): string {\n if (!document.referrer) {\n return '$direct'\n }\n const parser = document.createElement('a') // Unfortunately we cannot use new URL due to IE11\n parser.href = document.referrer\n return parser.host\n },\n\n properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: win?.location.href,\n $host: win?.location.host,\n $pathname: win?.location.pathname,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: win?.screen.height,\n $screen_width: win?.screen.width,\n $viewport_height: win?.innerHeight,\n $viewport_width: win?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n }\n )\n },\n}\n\nexport { win as window, userAgent, logger, document }\n","/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\nimport { AutocaptureConfig } from 'types'\nimport { _each, _includes, _isUndefined, _trim } from './utils'\n\nexport function getClassName(el: Element): string {\n switch (typeof el.className) {\n case 'string':\n return el.className\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n return ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n default:\n // future proof\n return ''\n }\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n _each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += _trim(child.textContent)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter(shouldCaptureValue)\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n }\n })\n }\n\n return _trim(elText)\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined\n): boolean {\n if (!el || isTag(el, 'html') || !isElementNode(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n const url = window.location.href\n const allowlist = autocaptureConfig.url_allowlist\n if (allowlist && !allowlist.some((regex) => url.match(regex))) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.element_allowlist) {\n const allowlist = autocaptureConfig.element_allowlist\n if (allowlist && !allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.css_selector_allowlist) {\n const allowlist = autocaptureConfig.css_selector_allowlist\n if (allowlist && !allowlist.some((selector) => el.matches(selector))) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el] // TODO: remove this var, it's never queried\n let parentNode: Element | boolean = true\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n parentNode = (curEl.parentNode as Element) || false\n if (!parentNode) break\n if (autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return event.type === 'submit'\n case 'input':\n return event.type === 'change' || event.type === 'click'\n case 'select':\n case 'textarea':\n return event.type === 'change' || event.type === 'click'\n default:\n if (parentIsUsefulElement) return event.type === 'click'\n return (\n event.type === 'click' &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassName(curEl).split(' ')\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassName(el).split(' '), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (typeof type === 'string') {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (typeof name === 'string') {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string): boolean {\n if (value === null || _isUndefined(value)) {\n return false\n }\n\n if (typeof value === 'string') {\n value = _trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (typeof attributeName === 'string') {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = `${text} ${getNestedSpanText(target)}`.trim()\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.childNodes && target.childNodes.length) {\n _each(target.childNodes, function (child) {\n if (child && child.tagName?.toLowerCase() === 'span') {\n try {\n const spanText = getSafeText(child)\n text = `${text} ${spanText}`.trim()\n\n if (child.childNodes && child.childNodes.length) {\n text = `${text} ${getNestedSpanText(child)}`.trim()\n }\n } catch (e) {\n console.error(e)\n }\n }\n })\n }\n return text\n}\n","// Naive rage click implementation: If mouse has not moved than RAGE_CLICK_THRESHOLD_PX\n// over RAGE_CLICK_CLICK_COUNT clicks with max RAGE_CLICK_TIMEOUT_MS between clicks, it's\n// counted as a rage click\n\nconst RAGE_CLICK_THRESHOLD_PX = 30\nconst RAGE_CLICK_TIMEOUT_MS = 1000\nconst RAGE_CLICK_CLICK_COUNT = 3\n\nexport default class RageClick {\n clicks: { x: number; y: number; timestamp: number }[]\n enabled: boolean\n\n constructor(enabled: boolean) {\n this.clicks = []\n this.enabled = enabled\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n if (!this.enabled) {\n return false\n }\n\n const lastClick = this.clicks[this.clicks.length - 1]\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < RAGE_CLICK_THRESHOLD_PX &&\n timestamp - lastClick.timestamp < RAGE_CLICK_TIMEOUT_MS\n ) {\n this.clicks.push({ x, y, timestamp })\n\n if (this.clicks.length === RAGE_CLICK_CLICK_COUNT) {\n return true\n }\n } else {\n this.clicks = [{ x, y, timestamp }]\n }\n\n return false\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\nexport const SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE = '$session_recording_recorder_version_server_side' // follows rrweb versioning\nexport const SESSION_ID = '$sesid'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const POSTHOG_QUOTA_LIMITED = '$posthog_quota_limited'\n\n// These are propertties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n USER_STATE,\n POSTHOG_QUOTA_LIMITED,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n]\n","import {\n _bind_instance_methods,\n _each,\n _extend,\n _includes,\n _isFunction,\n _isUndefined,\n _register_event,\n _safewrap_instance_methods,\n logger,\n} from './utils'\nimport {\n getClassName,\n getSafeText,\n isElementNode,\n isSensitiveElement,\n isTag,\n isTextNode,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureValue,\n autocaptureCompatibleElements,\n isAngularStyleAttr,\n isDocumentFragment,\n getDirectAndNestedSpanText,\n} from './autocapture-utils'\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nconst autocapture = {\n _initializedTokens: [] as string[],\n _isDisabledServerSide: null as boolean | null,\n _isAutocaptureEnabled: false as boolean,\n\n _setIsAutocaptureEnabled: function (instance: PostHog): void {\n const disabled_server_side =\n this._isDisabledServerSide === null\n ? !!instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n : this._isDisabledServerSide\n const enabled_client_side = !!instance.get_config('autocapture')\n this._isAutocaptureEnabled = enabled_client_side && !disabled_server_side\n },\n\n _previousElementSibling: function (el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n } else {\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n }\n },\n\n _getAugmentPropertiesFromElement: function (elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n _each(elem.attributes, function (attr: Attr) {\n if (attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n return props\n },\n\n _getPropertiesFromElement: function (elem: Element, maskInputs: boolean, maskText: boolean): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassName(elem)\n if (classes.length > 0)\n props['classes'] = classes.split(' ').filter(function (c) {\n return c !== ''\n })\n\n _each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class'].indexOf(attr.name) === -1) return\n\n if (!maskInputs && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n props['attr__' + attr.name] = limitText(1024, attr.value)\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = this._previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n },\n\n _getDefaultProperties: function (eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n },\n\n _extractCustomPropertyValue: function (customProperty: AutoCaptureCustomProperty): string {\n const propValues: string[] = []\n _each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n let value\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value']\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent']\n }\n\n if (shouldCaptureValue(value)) {\n propValues.push(value)\n }\n })\n return propValues.join(', ')\n },\n\n // TODO: delete custom_properties after changeless typescript refactor\n _getCustomProperties: function (targetElementList: Element[]): Properties {\n const props: Properties = {} // will be deleted\n _each(this._customProperties, (customProperty) => {\n _each(customProperty['event_selectors'], (eventSelector) => {\n const eventElements = document.querySelectorAll(eventSelector)\n _each(eventElements, (eventElement) => {\n if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty)\n }\n })\n })\n })\n return props\n },\n\n _getEventTarget: function (e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n },\n\n _captureEvent: function (e: Event, instance: PostHog, eventName = '$autocapture'): boolean | void {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = this._getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._captureEvent(e, instance, '$rageclick')\n }\n }\n\n if (target && shouldCaptureDomEvent(target, e, this.config)) {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href,\n explicitNoCapture = false\n _each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassName(el).split(' ')\n if (_includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n this._getPropertiesFromElement(\n el,\n instance.get_config('mask_all_element_attributes'),\n instance.get_config('mask_all_text')\n )\n )\n\n const augmentProperties = this._getAugmentPropertiesFromElement(el)\n _extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (!instance.get_config('mask_all_text')) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n if (href) {\n elementsJson[0]['attr__href'] = href\n }\n\n if (explicitNoCapture) {\n return false\n }\n\n const props = _extend(\n this._getDefaultProperties(e.type),\n {\n $elements: elementsJson,\n },\n this._getCustomProperties(targetElementList),\n autocaptureAugmentProperties\n )\n\n instance.capture(eventName, props)\n return true\n }\n },\n\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function (href: string): void {\n window.location.href = href\n },\n\n _addDomEventHandlers: function (instance: PostHog): void {\n const handler = (e: Event) => {\n e = e || window.event\n this._captureEvent(e, instance)\n }\n _register_event(document, 'submit', handler, false, true)\n _register_event(document, 'change', handler, false, true)\n _register_event(document, 'click', handler, false, true)\n },\n\n _customProperties: [] as AutoCaptureCustomProperty[],\n rageclicks: null as RageClick | null,\n config: undefined as AutocaptureConfig | undefined,\n\n init: function (instance: PostHog): void {\n if (typeof instance.__autocapture !== 'boolean') {\n this.config = instance.__autocapture\n }\n\n // precompile the regex\n if (this.config?.url_allowlist) {\n this.config.url_allowlist = this.config.url_allowlist.map((url) => new RegExp(url))\n }\n\n this.rageclicks = new RageClick(instance.get_config('rageclick'))\n },\n\n afterDecideResponse: function (response: DecideResponse, instance: PostHog): void {\n const token = instance.get_config('token')\n if (this._initializedTokens.indexOf(token) > -1) {\n logger.log('autocapture already initialized for token \"' + token + '\"')\n return\n }\n\n if (instance.persistence) {\n instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n })\n }\n // store this in-memory incase persistence is disabled\n this._isDisabledServerSide = !!response['autocapture_opt_out']\n\n this._setIsAutocaptureEnabled(instance)\n\n this._initializedTokens.push(token)\n\n if (\n response &&\n response['config'] &&\n response['config']['enable_collect_everything'] &&\n this._isAutocaptureEnabled\n ) {\n // TODO: delete custom_properties after changeless typescript refactor\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties']\n }\n this._addDomEventHandlers(instance)\n } else {\n instance['__autocapture'] = false\n }\n },\n\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function (\n token: string | null | undefined,\n numBuckets: number,\n numEnabledBuckets: number\n ): boolean {\n if (!token) {\n return true\n }\n numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10\n numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10\n let charCodeSum = 0\n for (let i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i)\n }\n return charCodeSum % numBuckets < numEnabledBuckets\n },\n\n isBrowserSupported: function (): boolean {\n return _isFunction(document.querySelectorAll)\n },\n}\n\n_bind_instance_methods(autocapture)\n_safewrap_instance_methods(autocapture)\n\nexport { autocapture }\n","import { _base64Encode, _entries, _extend, logger } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n console.warn('[PostHog] Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.get_config('token')\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.get_config('advanced_disable_feature_flags') || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.get_config('api_host') + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (Array.isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.unintializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/api/early_access_features/?token=${this.instance.get_config(\n 'token'\n )}`,\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n","import { _extend, logger } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport Config from './config'\nimport { DISTINCT_ID, SESSION_ID } from './constants'\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n is_supported: () => true,\n\n error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n get: function (name) {\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';').filter((x) => x.length)\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch (err) {}\n return null\n },\n\n parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return cookie\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n let cdomain = '',\n expires = '',\n secure = ''\n\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n const matches = document.location.hostname.match(DOMAIN_MATCH_REGEX),\n domain = matches ? matches[0] : ''\n\n cdomain = domain ? '; domain=.' + domain : ''\n }\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch (err) {\n return\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n cookieStore.set(name, '', -1, cross_subdomain)\n } catch (err) {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\n\nexport const localStore: PersistentStore = {\n is_supported: function () {\n if (_localStorage_supported !== null) {\n return _localStorage_supported\n }\n\n let supported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore.set(key, val)\n if (localStore.get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore.remove(key)\n } catch (err) {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n get: function (name) {\n try {\n return window.localStorage.getItem(name)\n } catch (err) {\n localStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(localStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.localStorage.removeItem(name)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [DISTINCT_ID, SESSION_ID]\n\nexport const localPlusCookieStore: PersistentStore = {\n ...localStore,\n parse: function (name) {\n try {\n let extend: Properties = {}\n try {\n // See if there's a cookie stored with data.\n extend = cookieStore.parse(name) || {}\n } catch (err) {}\n const value = _extend(extend, JSON.parse(localStore.get(name) || '{}'))\n localStore.set(name, value)\n return value\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n localStore.set(name, value)\n const cookiePersistedProperties: Record<string, any> = {}\n COOKIE_PERSISTED_PROPERTIES.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore.set(name, cookiePersistedProperties, days, cross_subdomain, is_secure)\n }\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n window.localStorage.removeItem(name)\n cookieStore.remove(name, cross_subdomain)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n is_supported: function () {\n return true\n },\n\n error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n get: function (name) {\n return memoryStorage[name] || null\n },\n\n parse: function (name) {\n return memoryStorage[name] || null\n },\n\n set: function (name, value) {\n memoryStorage[name] = value\n },\n\n remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n is_supported: function () {\n if (sessionStorageSupported !== null) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore.set(key, val)\n if (sessionStore.get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore.remove(key)\n } catch (err) {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n error: function (msg) {\n if (Config.DEBUG) {\n logger.error('sessionStorage error: ', msg)\n }\n },\n\n get: function (name) {\n try {\n return window.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(sessionStore.get(name)) || null\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n },\n}\n","/* eslint camelcase: \"off\" */\n\nimport { _each, _extend, _include, _info, _isObject, _isUndefined, _strip_empty_properties, logger } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n PERSISTENCE_RESERVED_PROPERTIES,\n EVENT_TIMERS_KEY,\n ENABLED_FEATURE_FLAGS,\n POSTHOG_QUOTA_LIMITED,\n USER_STATE,\n} from './constants'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n props: Properties\n storage: PersistentStore\n campaign_params_saved: boolean\n custom_campaign_params: string[]\n name: string\n disabled: boolean | undefined\n secure: boolean | undefined\n expire_days: number | undefined\n default_expiry: number | undefined\n cross_subdomain: boolean | undefined\n user_state: 'anonymous' | 'identified'\n\n constructor(config: PostHogConfig) {\n // clean chars that aren't accepted by the http spec for cookie values\n // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2\n let token = ''\n\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n this.props = {}\n this.campaign_params_saved = false\n this.custom_campaign_params = config['custom_campaign_params'] || []\n\n if (config['persistence_name']) {\n this.name = 'ph_' + config['persistence_name']\n } else {\n this.name = 'ph_' + token + '_posthog'\n }\n\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical('Unknown persistence type ' + config['persistence'] + '; falling back to cookie')\n config['persistence'] = 'cookie'\n }\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore.is_supported()) {\n this.storage = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore.is_supported()) {\n this.storage = localPlusCookieStore\n } else if (storage_type === 'sessionstorage' && sessionStore.is_supported()) {\n this.storage = sessionStore\n } else if (storage_type === 'memory') {\n this.storage = memoryStore\n } else {\n this.storage = cookieStore\n }\n\n this.user_state = 'anonymous'\n\n this.load()\n this.update_config(config)\n this.save()\n }\n\n properties(): Properties {\n const p: Properties = {}\n // Filter out reserved properties\n _each(this.props, function (v, k) {\n if (k === ENABLED_FEATURE_FLAGS && typeof v === 'object') {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n } else if (!_include(PERSISTENCE_RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this.disabled) {\n return\n }\n\n const entry = this.storage.parse(this.name)\n\n if (entry) {\n this.props = _extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this.disabled) {\n return\n }\n this.storage.set(this.name, this.props, this.expire_days, this.cross_subdomain, this.secure)\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this.storage.remove(this.name, false)\n this.storage.remove(this.name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (_isObject(props)) {\n if (typeof default_value === 'undefined') {\n default_value = 'None'\n }\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (_isObject(props)) {\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this.campaign_params_saved) {\n this.register(_info.campaignParams(this.custom_campaign_params))\n this.campaign_params_saved = true\n }\n }\n\n update_search_keyword(): void {\n this.register(_info.searchInfo())\n }\n\n update_referrer_info(): void {\n this.register({\n $referrer: this.props['$referrer'] || _info.referrer(),\n $referring_domain: this.props['$referring_domain'] || _info.referringDomain(),\n })\n }\n\n get_referrer_info(): Properties {\n return _strip_empty_properties({\n $referrer: this['props']['$referrer'],\n $referring_domain: this['props']['$referring_domain'],\n })\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n _each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig): void {\n this.default_expiry = this.expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'])\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n }\n\n set_disabled(disabled: boolean): void {\n this.disabled = disabled\n if (this.disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this.cross_subdomain) {\n this.cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n get_cross_subdomain(): boolean {\n return !!this.cross_subdomain\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this.secure) {\n this.secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!_isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_user_state(): 'anonymous' | 'identified' {\n return this.props[USER_STATE] || 'anonymous'\n }\n\n set_user_state(state: 'anonymous' | 'identified'): void {\n this.props[USER_STATE] = state\n this.save()\n }\n\n get_quota_limits(): Record<string, number> {\n return this.props[POSTHOG_QUOTA_LIMITED] || {}\n }\n\n set_quota_limits(state: Record<string, number>): void {\n this.props[POSTHOG_QUOTA_LIMITED] = state\n this.save()\n }\n}\n","import type {\n KeepIframeSrcFn,\n RecordPlugin,\n SamplingStrategy,\n blockClass,\n eventWithTime,\n hooksParam,\n listenerHandler,\n maskTextClass,\n pluginEvent,\n mutationCallbackParam,\n} from '@rrweb/types'\nimport type { Mirror, MaskInputOptions, MaskInputFn, MaskTextFn, SlimDOMOptions, DataURLOptions } from 'rrweb-snapshot'\n\nexport const replacementImageURI =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNOCAwSDE2TDAgMTZWOEw4IDBaIiBmaWxsPSIjMkQyRDJEIi8+CjxwYXRoIGQ9Ik0xNiA4VjE2SDhMMTYgOFoiIGZpbGw9IiMyRDJEMkQiLz4KPC9zdmc+Cg=='\n\nexport const FULL_SNAPSHOT_EVENT_TYPE = 2\nexport const META_EVENT_TYPE = 4\nexport const INCREMENTAL_SNAPSHOT_EVENT_TYPE = 3\nexport const PLUGIN_EVENT_TYPE = 6\nexport const MUTATION_SOURCE_TYPE = 0\n\nexport const MAX_MESSAGE_SIZE = 5000000 // ~5mb\n\nexport type rrwebRecord = {\n (options: recordOptions<eventWithTime>): listenerHandler\n addCustomEvent: (tag: string, payload: any) => void\n takeFullSnapshot: () => void\n mirror: Mirror\n}\n\nexport declare type recordOptions<T> = {\n emit?: (e: T, isCheckout?: boolean) => void\n checkoutEveryNth?: number\n checkoutEveryNms?: number\n blockClass?: blockClass\n blockSelector?: string\n ignoreClass?: string\n maskTextClass?: maskTextClass\n maskTextSelector?: string\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: MaskInputFn\n maskTextFn?: MaskTextFn\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n ignoreCSSAttributes?: Set<string>\n inlineStylesheet?: boolean\n hooks?: hooksParam\n // packFn?: PackFn\n sampling?: SamplingStrategy\n dataURLOptions?: DataURLOptions\n recordCanvas?: boolean\n recordCrossOriginIframes?: boolean\n recordAfter?: 'DOMContentLoaded' | 'load'\n userTriggeredOnInput?: boolean\n collectFonts?: boolean\n inlineImages?: boolean\n plugins?: RecordPlugin[]\n mousemoveWait?: number\n keepIframeSrcFn?: KeepIframeSrcFn\n // errorHandler?: ErrorHandler\n}\n\n/*\n * Check whether a data payload is nearing 5mb. If it is, it checks the data for\n * data URIs (the likely culprit for large payloads). If it finds data URIs, it either replaces\n * it with a generic image (if it's an image) or removes it.\n * @data {object} the rr-web data object\n * @returns {object} the rr-web data object with data uris filtered out\n */\nexport function ensureMaxMessageSize(data: eventWithTime): { event: eventWithTime; size: number } {\n let stringifiedData = JSON.stringify(data)\n // Note: with compression, this limit may be able to be increased\n // but we're assuming most of the size is from a data uri which\n // is unlikely to be compressed further\n if (stringifiedData.length > MAX_MESSAGE_SIZE) {\n // Regex that matches the pattern for a dataURI with the shape 'data:{mime type};{encoding},{data}'. It:\n // 1) Checks if the pattern starts with 'data:' (potentially, not at the start of the string)\n // 2) Extracts the mime type of the data uri in the first group\n // 3) Determines when the data URI ends.Depending on if it's used in the src tag or css, it can end with a ) or \"\n const dataURIRegex = /data:([\\w/\\-.]+);(\\w+),([^)\"]*)/gim\n const matches = stringifiedData.matchAll(dataURIRegex)\n for (const match of matches) {\n if (match[1].toLocaleLowerCase().slice(0, 6) === 'image/') {\n stringifiedData = stringifiedData.replace(match[0], replacementImageURI)\n } else {\n stringifiedData = stringifiedData.replace(match[0], '')\n }\n }\n }\n return { event: JSON.parse(stringifiedData), size: stringifiedData.length }\n}\n\nexport const CONSOLE_LOG_PLUGIN_NAME = 'rrweb/console@1' // The name of the rr-web plugin that emits console logs\n\n// Console logs can be really large. This function truncates large logs\n// It's a simple function that just truncates long strings.\n// TODO: Ideally this function would have better handling of objects + lists,\n// so they could still be rendered in a pretty way after truncation.\nexport function truncateLargeConsoleLogs(_event: eventWithTime) {\n const event = _event as pluginEvent<{ payload: string[] }>\n\n const MAX_STRING_SIZE = 2000 // Maximum number of characters allowed in a string\n const MAX_STRINGS_PER_LOG = 10 // A log can consist of multiple strings (e.g. consol.log('string1', 'string2'))\n\n if (\n event &&\n typeof event === 'object' &&\n event.type === PLUGIN_EVENT_TYPE &&\n typeof event.data === 'object' &&\n event.data.plugin === CONSOLE_LOG_PLUGIN_NAME\n ) {\n // Note: event.data.payload.payload comes from rr-web, and is an array of strings\n if (event.data.payload.payload.length > MAX_STRINGS_PER_LOG) {\n event.data.payload.payload = event.data.payload.payload.slice(0, MAX_STRINGS_PER_LOG)\n event.data.payload.payload.push('...[truncated]')\n }\n const updatedPayload = []\n for (let i = 0; i < event.data.payload.payload.length; i++) {\n if (\n event.data.payload.payload[i] && // Value can be null\n event.data.payload.payload[i].length > MAX_STRING_SIZE\n ) {\n updatedPayload.push(event.data.payload.payload[i].slice(0, MAX_STRING_SIZE) + '...[truncated]')\n } else {\n updatedPayload.push(event.data.payload.payload[i])\n }\n }\n event.data.payload.payload = updatedPayload\n // Return original type\n return _event\n }\n return _event\n}\n\nexport class MutationRateLimiter {\n private bucketSize = 100\n private refillRate = 10\n private mutationBuckets: Record<string, number> = {}\n private loggedTracker: Record<string, boolean> = {}\n\n constructor(\n private readonly rrweb: rrwebRecord,\n private readonly options: {\n bucketSize?: number\n refillRate?: number\n onBlockedNode?: (id: number, node: Node | null) => void\n } = {}\n ) {\n this.refillRate = this.options.refillRate ?? this.refillRate\n this.bucketSize = this.options.bucketSize ?? this.bucketSize\n setInterval(() => {\n this.refillBuckets()\n }, 1000)\n }\n\n private refillBuckets = () => {\n Object.keys(this.mutationBuckets).forEach((key) => {\n this.mutationBuckets[key] = this.mutationBuckets[key] + this.refillRate\n\n if (this.mutationBuckets[key] >= this.bucketSize) {\n delete this.mutationBuckets[key]\n }\n })\n }\n\n private getNodeOrRelevantParent = (id: number): [number, Node | null] => {\n // For some nodes we know they are part of a larger tree such as an SVG.\n // For those we want to block the entire node, not just the specific attribute\n\n const node = this.rrweb.mirror.getNode(id)\n\n // Check if the node is an Element and then find the closest parent that is an SVG\n if (node?.nodeName !== 'svg' && node instanceof Element) {\n const closestSVG = node.closest('svg')\n\n if (closestSVG) {\n return [this.rrweb.mirror.getId(closestSVG), closestSVG]\n }\n }\n\n return [id, node]\n }\n\n private numberOfChanges = (data: Partial<mutationCallbackParam>) => {\n return (\n (data.removes?.length ?? 0) +\n (data.attributes?.length ?? 0) +\n (data.texts?.length ?? 0) +\n (data.adds?.length ?? 0)\n )\n }\n\n public throttleMutations = (event: eventWithTime) => {\n if (event.type !== INCREMENTAL_SNAPSHOT_EVENT_TYPE || event.data.source !== MUTATION_SOURCE_TYPE) {\n return event\n }\n\n const data = event.data as Partial<mutationCallbackParam>\n const initialMutationCount = this.numberOfChanges(data)\n\n if (data.attributes) {\n // Most problematic mutations come from attrs where the style or minor properties are changed rapidly\n data.attributes = data.attributes.filter((attr) => {\n const [nodeId, node] = this.getNodeOrRelevantParent(attr.id)\n\n if (this.mutationBuckets[nodeId] === 0) {\n return false\n }\n\n this.mutationBuckets[nodeId] = this.mutationBuckets[nodeId] ?? this.bucketSize\n this.mutationBuckets[nodeId] = Math.max(this.mutationBuckets[nodeId] - 1, 0)\n\n if (this.mutationBuckets[nodeId] === 0) {\n if (!this.loggedTracker[nodeId]) {\n this.loggedTracker[nodeId] = true\n this.options.onBlockedNode?.(nodeId, node)\n }\n }\n\n return attr\n })\n }\n\n // Check if every part of the mutation is empty in which case there is nothing to do\n const mutationCount = this.numberOfChanges(data)\n\n if (mutationCount === 0 && initialMutationCount !== mutationCount) {\n // If we have modified the mutation count and the remaining count is 0, then we don't need the event.\n return\n }\n return event\n }\n}\n","import {\n CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE,\n} from '../constants'\nimport {\n ensureMaxMessageSize,\n FULL_SNAPSHOT_EVENT_TYPE,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n META_EVENT_TYPE,\n MutationRateLimiter,\n recordOptions,\n rrwebRecord,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, Properties } from '../types'\nimport type { eventWithTime, listenerHandler } from '@rrweb/types'\nimport Config from '../config'\nimport { logger, loadScript, _timestamp } from '../utils'\n\nconst BASE_ENDPOINT = '/s/'\n\nexport const RECORDING_IDLE_ACTIVITY_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes\nexport const RECORDING_MAX_EVENT_SIZE = 1024 * 1024 * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'sessionRecording'\n\n// NOTE: Importing this type is problematic as we can't safely bundle it to a TS definition so, instead we redefine.\n// import type { record } from 'rrweb2/typings'\n// import type { recordOptions } from 'rrweb/typings/types'\n\n// Copied from rrweb typings to avoid import\nenum IncrementalSource {\n Mutation = 0,\n MouseMove = 1,\n MouseInteraction = 2,\n Scroll = 3,\n ViewportResize = 4,\n Input = 5,\n TouchMove = 6,\n MediaInteraction = 7,\n StyleSheetRule = 8,\n CanvasMutation = 9,\n Font = 10,\n Log = 11,\n Drag = 12,\n StyleDeclaration = 13,\n Selection = 14,\n AdoptedStyleSheet = 15,\n}\n\nconst ACTIVE_SOURCES = [\n IncrementalSource.MouseMove,\n IncrementalSource.MouseInteraction,\n IncrementalSource.Scroll,\n IncrementalSource.ViewportResize,\n IncrementalSource.Input,\n IncrementalSource.TouchMove,\n IncrementalSource.MediaInteraction,\n IncrementalSource.Drag,\n]\n\nexport class SessionRecording {\n private instance: PostHog\n private emit: boolean\n private endpoint: string\n private windowId: string | null\n private sessionId: string | null\n private lastActivityTimestamp: number = Date.now()\n private flushBufferTimer?: any\n private buffer?: {\n size: number\n data: any[]\n sessionId: string | null\n windowId: string | null\n }\n private mutationRateLimiter?: MutationRateLimiter\n\n captureStarted: boolean\n snapshots: any[]\n stopRrweb: listenerHandler | undefined\n receivedDecide: boolean\n rrwebRecord: rrwebRecord | undefined\n recorderVersion?: string\n isIdle = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.captureStarted = false\n this.snapshots = []\n this.emit = false // Controls whether data is sent to the server or not\n this.endpoint = BASE_ENDPOINT\n this.stopRrweb = undefined\n this.windowId = null\n this.sessionId = null\n this.receivedDecide = false\n\n window.addEventListener('beforeunload', () => {\n this._flushBuffer()\n })\n }\n\n private getSessionManager() {\n if (!this.instance.sessionManager) {\n logger.error('Session recording started without valid sessionManager')\n return\n }\n\n return this.instance.sessionManager\n }\n\n startRecordingIfEnabled() {\n if (this.isRecordingEnabled()) {\n this.startCaptureAndTrySendingQueuedSnapshots()\n } else {\n this.stopRecording()\n }\n }\n\n started() {\n return this.captureStarted\n }\n\n stopRecording() {\n if (this.captureStarted && this.stopRrweb) {\n this.stopRrweb()\n this.stopRrweb = undefined\n this.captureStarted = false\n }\n }\n\n isRecordingEnabled() {\n const enabled_server_side = !!this.instance.get_property(SESSION_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = !this.instance.get_config('disable_session_recording')\n return enabled_server_side && enabled_client_side\n }\n\n isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this.instance.get_property(CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = this.instance.get_config('enable_recording_console_log')\n return enabled_client_side ?? enabled_server_side\n }\n\n getRecordingVersion() {\n const recordingVersion_server_side = this.instance.get_property(SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE)\n const recordingVersion_client_side = this.instance.get_config('session_recording')?.recorderVersion\n return recordingVersion_client_side || recordingVersion_server_side || 'v1'\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.receivedDecide = true\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: !!response['sessionRecording'],\n [CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE]: response.sessionRecording?.consoleLogRecordingEnabled,\n [SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE]: response.sessionRecording?.recorderVersion,\n })\n }\n if (response.sessionRecording?.endpoint) {\n this.endpoint = response.sessionRecording?.endpoint\n }\n\n if (response.sessionRecording?.recorderVersion) {\n this.recorderVersion = response.sessionRecording.recorderVersion\n }\n this.startRecordingIfEnabled()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6,\n data: {\n plugin: 'rrweb/console@1',\n payload: {\n level,\n trace: [],\n // Even though it is a string we stringify it as thats what rrweb expects\n payload: [JSON.stringify(message)],\n },\n },\n timestamp: _timestamp(),\n })\n }\n\n private startCaptureAndTrySendingQueuedSnapshots() {\n // Only submit data after we've received a decide response to account for\n // changing endpoints and the feature being disabled on the server side.\n if (this.receivedDecide) {\n this.emit = true\n this.snapshots.forEach((properties) => this._captureSnapshotBuffered(properties))\n }\n this._startCapture()\n }\n\n private _startCapture() {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n if (typeof Object.assign === 'undefined') {\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n return\n }\n\n // We do not switch recorder versions midway through a recording.\n if (this.captureStarted || this.instance.get_config('disable_session_recording')) {\n return\n }\n\n this.captureStarted = true\n // We want to ensure the sessionManager is reset if necessary on load of the recorder\n sessionManager.checkAndGetSessionAndWindowId()\n\n const recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js'\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import\n // recorder.js from cdn since it hasn't been loaded.\n if (this.instance.__loaded_recorder_version !== this.getRecordingVersion()) {\n loadScript(\n this.instance.get_config('api_host') + `/static/${recorderJS}?v=${Config.LIB_VERSION}`,\n (err) => {\n if (err) {\n return logger.error(`Could not load ${recorderJS}`, err)\n }\n\n this._onScriptLoaded()\n }\n )\n } else {\n this._onScriptLoaded()\n }\n }\n\n private _isInteractiveEvent(event: eventWithTime) {\n return event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && ACTIVE_SOURCES.indexOf(event.data?.source) !== -1\n }\n\n private _updateWindowAndSessionIds(event: eventWithTime) {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n\n const isUserInteraction = this._isInteractiveEvent(event)\n\n if (!isUserInteraction && !this.isIdle) {\n // We check if the lastActivityTimestamp is old enough to go idle\n if (event.timestamp - this.lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {\n this.isIdle = true\n }\n }\n\n if (isUserInteraction) {\n this.lastActivityTimestamp = event.timestamp\n if (this.isIdle) {\n // Remove the idle state if set and trigger a full snapshot as we will have ingored previous mutations\n this.isIdle = false\n this._tryTakeFullSnapshot()\n }\n }\n\n if (this.isIdle) {\n return\n }\n\n // We only want to extend the session if it is an interactive event.\n const { windowId, sessionId } = sessionManager.checkAndGetSessionAndWindowId(\n !isUserInteraction,\n event.timestamp\n )\n\n if (\n [FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1 &&\n (this.windowId !== windowId || this.sessionId !== sessionId)\n ) {\n this._tryTakeFullSnapshot()\n }\n this.windowId = windowId\n this.sessionId = sessionId\n }\n\n private _tryTakeFullSnapshot(): boolean {\n if (!this.captureStarted) {\n return false\n }\n try {\n this.rrwebRecord?.takeFullSnapshot()\n return true\n } catch (e) {\n // Sometimes a race can occur where the recorder is not fully started yet, so we can't take a full snapshot.\n logger.error('Error taking full snapshot.', e)\n return false\n }\n }\n\n private _onScriptLoaded() {\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions<eventWithTime> = {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskTextClass: 'ph-mask',\n maskTextSelector: undefined,\n maskTextFn: undefined,\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n recordCrossOriginIframes: false,\n }\n // We switched from loading all of rrweb to just the record part, but\n // keep backwards compatibility if someone hasn't upgraded PostHog\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.rrwebRecord = window.rrweb ? window.rrweb.record : window.rrwebRecord\n\n // only allows user to set our 'allowlisted' options\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n\n if (!this.rrwebRecord) {\n logger.error(\n 'onScriptLoaded was called but rrwebRecord is not available. This indicates something has gone wrong.'\n )\n return\n }\n\n this.mutationRateLimiter =\n this.mutationRateLimiter ??\n new MutationRateLimiter(this.rrwebRecord!, {\n onBlockedNode: (id, node) => {\n const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n logger.log(message, {\n node: node,\n })\n\n this.log('[PostHog Recorder] ' + message, 'warn')\n },\n })\n\n this.stopRrweb = this.rrwebRecord({\n emit: (event) => {\n this.onRRwebEmit(event)\n },\n plugins:\n (window as any).rrwebConsoleRecord && this.isConsoleLogCaptureEnabled()\n ? [(window as any).rrwebConsoleRecord.getRecordConsolePlugin()]\n : [],\n ...sessionRecordingOptions,\n })\n\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this.instance._addCaptureHook((eventName) => {\n // If anything could go wrong here it has the potential to block the main loop so we catch all errors.\n try {\n if (eventName === '$pageview') {\n this.rrwebRecord?.addCustomEvent('$pageview', { href: window.location.href })\n }\n } catch (e) {\n logger.error('Could not add $pageview to rrweb session', e)\n }\n })\n\n // We reset the last activity timestamp, resetting the idle timer\n this.lastActivityTimestamp = Date.now()\n this.isIdle = false\n }\n\n onRRwebEmit(rawEvent: eventWithTime) {\n if (!rawEvent || typeof rawEvent !== 'object') {\n return\n }\n\n const throttledEvent = this.mutationRateLimiter\n ? this.mutationRateLimiter.throttleMutations(rawEvent)\n : rawEvent\n\n if (!throttledEvent) {\n return\n }\n\n const { event, size } = ensureMaxMessageSize(truncateLargeConsoleLogs(throttledEvent))\n\n this._updateWindowAndSessionIds(event)\n\n if (this.isIdle) {\n // When in an idle state we keep recording, but don't capture the events\n return\n }\n\n const properties = {\n $snapshot_bytes: size,\n $snapshot_data: event,\n $session_id: this.sessionId,\n $window_id: this.windowId,\n }\n\n if (this.emit) {\n this._captureSnapshotBuffered(properties)\n } else {\n this.snapshots.push(properties)\n }\n }\n\n private _flushBuffer() {\n if (this.flushBufferTimer) {\n clearTimeout(this.flushBufferTimer)\n this.flushBufferTimer = undefined\n }\n\n if (this.buffer && this.buffer.data.length !== 0) {\n this._captureSnapshot({\n $snapshot_bytes: this.buffer.size,\n $snapshot_data: this.buffer.data,\n $session_id: this.buffer.sessionId,\n $window_id: this.buffer.windowId,\n })\n }\n\n this.buffer = undefined\n\n return {\n size: 0,\n data: [],\n sessionId: this.sessionId,\n windowId: this.windowId,\n }\n }\n\n private _captureSnapshotBuffered(properties: Properties) {\n const additionalBytes = 2 + (this.buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n if (\n !this.buffer ||\n this.buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE ||\n this.buffer.sessionId !== this.sessionId\n ) {\n this.buffer = this._flushBuffer()\n }\n\n this.buffer.size += properties.$snapshot_bytes\n this.buffer.data.push(properties.$snapshot_data)\n\n if (!this.flushBufferTimer) {\n this.flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n }\n }\n\n private _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this.instance.capture('$snapshot', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: this.endpoint,\n _noTruncate: true,\n _batchKey: SESSION_RECORDING_BATCH_KEY,\n _metrics: {\n rrweb_full_snapshot: properties.$snapshot_data.type === FULL_SNAPSHOT_EVENT_TYPE,\n },\n })\n }\n}\n","import { isLocalhost, logger } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, NetworkRequest } from '../types'\n\nconst PERFORMANCE_EVENTS_MAPPING: { [key: string]: number } = {\n // BASE_PERFORMANCE_EVENT_COLUMNS\n entryType: 0,\n timeOrigin: 1,\n name: 2,\n\n // RESOURCE_EVENT_COLUMNS\n startTime: 3,\n redirectStart: 4,\n redirectEnd: 5,\n workerStart: 6,\n fetchStart: 7,\n domainLookupStart: 8,\n domainLookupEnd: 9,\n connectStart: 10,\n secureConnectionStart: 11,\n connectEnd: 12,\n requestStart: 13,\n responseStart: 14,\n responseEnd: 15,\n decodedBodySize: 16,\n encodedBodySize: 17,\n initiatorType: 18,\n nextHopProtocol: 19,\n renderBlockingStatus: 20,\n responseStatus: 21,\n transferSize: 22,\n\n // LARGEST_CONTENTFUL_PAINT_EVENT_COLUMNS\n element: 23,\n renderTime: 24,\n loadTime: 25,\n size: 26,\n id: 27,\n url: 28,\n\n // NAVIGATION_EVENT_COLUMNS\n domComplete: 29,\n domContentLoadedEvent: 30,\n domInteractive: 31,\n loadEventEnd: 32,\n loadEventStart: 33,\n redirectCount: 34,\n navigationType: 35,\n unloadEventEnd: 36,\n unloadEventStart: 37,\n\n // Added after v1\n duration: 39,\n timestamp: 40,\n\n // NOTE: CURRENTLY UNSUPPORTED\n // EVENT_TIMING_EVENT_COLUMNS\n // processingStart: null,\n // processingEnd: null,\n\n // MARK_AND_MEASURE_EVENT_COLUMNS\n // detail: null,\n}\n\nconst ENTRY_TYPES_TO_OBSERVE = [\n // 'event', // This is too noisy as it covers all browser events\n 'first-input',\n // 'mark', // Mark is used too liberally. We would need to filter for specific marks\n // 'measure', // Measure is used too liberally. We would need to filter for specific measures\n 'navigation',\n 'paint',\n 'resource',\n]\n\nconst PERFORMANCE_INGESTION_ENDPOINT = '/e/'\n// Don't monitor posthog paths because then events cause performance events which are events and the snake eats its tail 😱\nconst POSTHOG_PATHS_TO_IGNORE = ['/s/', PERFORMANCE_INGESTION_ENDPOINT]\n\nexport class WebPerformanceObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n observer: PerformanceObserver | undefined\n\n // Util to help developers working on this feature manually override\n _forceAllowLocalhost = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n startObservingIfEnabled() {\n if (this.isEnabled()) {\n this.startObserving()\n } else {\n this.stopObserving()\n }\n }\n\n startObserving() {\n if (this.observer) {\n return\n }\n\n if (window?.PerformanceObserver?.supportedEntryTypes === undefined) {\n logger.log(\n 'PostHog Performance observer not started because PerformanceObserver is not supported by this browser.'\n )\n return\n }\n\n if (isLocalhost() && !this._forceAllowLocalhost) {\n logger.log('PostHog Peformance observer not started because we are on localhost.')\n return\n }\n\n try {\n // compat checked above with early return\n // eslint-disable-next-line compat/compat\n this.observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n this._capturePerformanceEvent(entry)\n })\n })\n\n // compat checked above with early return\n // eslint-disable-next-line compat/compat\n const entryTypes = PerformanceObserver.supportedEntryTypes.filter((x) => ENTRY_TYPES_TO_OBSERVE.includes(x))\n\n entryTypes.forEach((entryType) => {\n this.observer?.observe({ type: entryType, buffered: true })\n })\n } catch (e) {\n console.error('PostHog failed to start performance observer', e)\n this.stopObserving()\n }\n }\n\n stopObserving() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = undefined\n }\n }\n\n isObserving() {\n return !!this.observer\n }\n\n isEnabled() {\n return this.instance.get_config('capture_performance') ?? this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.remoteEnabled = response.capturePerformance || false\n if (this.isEnabled()) {\n this.startObserving()\n }\n }\n\n _capturePerformanceEvent(event: PerformanceEntry) {\n // NOTE: We don't want to capture our own request events.\n\n if (event.name.indexOf(this.instance.get_config('api_host')) === 0) {\n const path = event.name.replace(this.instance.get_config('api_host'), '')\n\n if (POSTHOG_PATHS_TO_IGNORE.find((x) => path.indexOf(x) === 0)) {\n return\n }\n }\n\n // NOTE: This is minimal atm but will include more options when we move to the\n // built-in rrweb network recorder\n let networkRequest: NetworkRequest | null | undefined = {\n url: event.name,\n }\n\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n\n if (userSessionRecordingOptions.maskNetworkRequestFn) {\n networkRequest = userSessionRecordingOptions.maskNetworkRequestFn(networkRequest)\n }\n\n if (!networkRequest) {\n return\n }\n\n const eventJson = event.toJSON()\n eventJson.name = networkRequest.url\n const properties: { [key: number]: any } = {}\n // kudos to sentry javascript sdk for excellent background on why to use Date.now() here\n // https://github.com/getsentry/sentry-javascript/blob/e856e40b6e71a73252e788cd42b5260f81c9c88e/packages/utils/src/time.ts#L70\n // can't start observer if performance.now() is not available\n // eslint-disable-next-line compat/compat\n const timeOrigin = Math.floor(Date.now() - performance.now())\n properties[PERFORMANCE_EVENTS_MAPPING['timeOrigin']] = timeOrigin\n // clickhouse can't ingest timestamps that are floats\n // (in this case representing fractions of a millisecond we don't care about anyway)\n properties[PERFORMANCE_EVENTS_MAPPING['timestamp']] = Math.floor(timeOrigin + event.startTime)\n for (const key in PERFORMANCE_EVENTS_MAPPING) {\n if (eventJson[key] !== undefined) {\n properties[PERFORMANCE_EVENTS_MAPPING[key]] = eventJson[key]\n }\n }\n\n this.capturePerformanceEvent(properties)\n\n if (exposesServerTiming(event)) {\n for (const timing of event.serverTiming || []) {\n this.capturePerformanceEvent({\n [PERFORMANCE_EVENTS_MAPPING['timeOrigin']]: timeOrigin,\n [PERFORMANCE_EVENTS_MAPPING['timestamp']]: Math.floor(timeOrigin + event.startTime),\n [PERFORMANCE_EVENTS_MAPPING['name']]: timing.name,\n [PERFORMANCE_EVENTS_MAPPING['duration']]: timing.duration,\n // the spec has a closed list of possible types\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType\n // but, we need to know this was a server timing so that we know to\n // match it to the appropriate navigation or resource timing\n // that matching will have to be on timestamp and $current_url\n [PERFORMANCE_EVENTS_MAPPING['entryType']]: 'serverTiming',\n })\n }\n }\n }\n\n /**\n * :TRICKY: Make sure we batch these requests, and don't truncate the strings.\n */\n private capturePerformanceEvent(properties: { [key: number]: any }) {\n const timestamp = properties[PERFORMANCE_EVENTS_MAPPING['timestamp']]\n\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6, // EventType.Plugin,\n data: {\n plugin: 'posthog/network@1',\n payload: properties,\n },\n timestamp,\n })\n\n // this.instance.capture('$performance_event', properties, {\n // transport: 'XHR',\n // method: 'POST',\n // endpoint: PERFORMANCE_INGESTION_ENDPOINT,\n // _noTruncate: true,\n // _batchKey: 'performanceEvent',\n // })\n }\n}\n\n/**\n * Check if this PerformanceEntry is either a PerformanceResourceTiming or a PerformanceNavigationTiming\n * NB PerformanceNavigationTiming extends PerformanceResourceTiming\n * Here we don't care which interface it implements as both expose `serverTimings`\n */\nconst exposesServerTiming = (event: PerformanceEntry): event is PerformanceResourceTiming =>\n event.entryType === 'navigation' || event.entryType === 'resource'\n","import { autocapture } from './autocapture'\nimport { _base64Encode, loadScript } from './utils'\nimport { PostHog } from './posthog-core'\nimport { Compression, DecideResponse } from './types'\nimport { STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY } from './constants'\n\nexport class Decide {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n // don't need to wait for `decide` to return if flags were provided on initialisation\n this.instance.decideEndpointWasHit = this.instance._hasBootstrappedFeatureFlags()\n }\n\n call(): void {\n /*\n Calls /decide endpoint to fetch options for autocapture, session recording, feature flags & compression.\n */\n const json_data = JSON.stringify({\n token: this.instance.get_config('token'),\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n person_properties: this.instance.get_property(STORED_PERSON_PROPERTIES_KEY),\n group_properties: this.instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n disable_flags:\n this.instance.get_config('advanced_disable_feature_flags') ||\n this.instance.get_config('advanced_disable_feature_flags_on_first_load') ||\n undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/decide/?v=3`,\n { data: encoded_data, verbose: true },\n { method: 'POST' },\n (response) => this.parseDecideResponse(response as DecideResponse)\n )\n }\n\n parseDecideResponse(response: DecideResponse): void {\n this.instance.featureFlags.resetRequestQueue()\n this.instance.featureFlags.setReloadingPaused(false)\n\n if (response?.status === 0) {\n console.error('Failed to fetch feature flags from PostHog.')\n return\n }\n if (!(document && document.body)) {\n console.log('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this.parseDecideResponse(response)\n }, 500)\n return\n }\n\n this.instance.toolbar.afterDecideResponse(response)\n this.instance.sessionRecording?.afterDecideResponse(response)\n autocapture.afterDecideResponse(response, this.instance)\n this.instance.webPerformance?.afterDecideResponse(response)\n this.instance.exceptionAutocapture?.afterDecideResponse(response)\n\n if (!this.instance.get_config('advanced_disable_feature_flags_on_first_load')) {\n this.instance.featureFlags.receivedFeatureFlags(response)\n }\n\n this.instance['compression'] = {}\n if (response['supportedCompression'] && !this.instance.get_config('disable_compression')) {\n const compression: Partial<Record<Compression, boolean>> = {}\n for (const method of response['supportedCompression']) {\n compression[method] = true\n }\n this.instance['compression'] = compression\n }\n\n if (response['siteApps']) {\n if (this.instance.get_config('opt_in_site_apps')) {\n const apiHost = this.instance.get_config('api_host')\n for (const { id, url } of response['siteApps']) {\n const scriptUrl = [\n apiHost,\n apiHost[apiHost.length - 1] === '/' && url[0] === '/' ? url.substring(1) : url,\n ].join('')\n\n ;(window as any)[`__$$ph_site_app_${id}`] = this.instance\n\n loadScript(scriptUrl, (err) => {\n if (err) {\n console.error(`Error while initializing PostHog app with config id ${id}`, err)\n }\n })\n }\n } else if (response['siteApps'].length > 0) {\n console.error('PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.')\n }\n }\n }\n}\n","export const POSTHOG_MANAGED_HOSTS = ['https://app.posthog.com', 'https://eu.posthog.com']\n","import { _getHashParam, _register_event, loadScript, logger } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, ToolbarParams } from '../types'\nimport { POSTHOG_MANAGED_HOSTS } from './cloud'\n\nexport class Toolbar {\n instance: PostHog\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n afterDecideResponse(response: DecideResponse) {\n const toolbarParams: ToolbarParams =\n response['toolbarParams'] ||\n response['editorParams'] ||\n (response['toolbarVersion'] ? { toolbarVersion: response['toolbarVersion'] } : {})\n if (\n response['isAuthenticated'] &&\n toolbarParams['toolbarVersion'] &&\n toolbarParams['toolbarVersion'].indexOf('toolbar') === 0\n ) {\n this.loadToolbar({\n ...toolbarParams,\n })\n }\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch (error) {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window.localStorage\n }\n\n const stateHash = _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n const state = stateHash ? JSON.parse(decodeURIComponent(stateHash)) : null\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n let toolbarParams: ToolbarParams\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n history.replaceState('', document.title, location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialzation\n toolbarParams = JSON.parse(localStorage.getItem('_postHogToolbarParams') || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.get_config('token') === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch (e) {\n return false\n }\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n if ((window as any)['_postHogToolbarLoaded']) {\n return false\n }\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n ;(window as any)['_postHogToolbarLoaded'] = true\n\n // By design array.js, recorder.js, and toolbar.js are served from Django with no or limited caching, not from our CDN\n // Django respects the query params for caching, returning a 304 if appropriate\n const host = this.instance.get_config('api_host')\n const timestampToNearestThirtySeconds = Math.floor(Date.now() / 30000) * 30000\n const toolbarUrl = `${host}${\n host.endsWith('/') ? '' : '/'\n }static/toolbar.js?_ts=${timestampToNearestThirtySeconds}`\n const disableToolbarMetrics =\n !POSTHOG_MANAGED_HOSTS.includes(this.instance.get_config('api_host')) &&\n this.instance.get_config('advanced_disable_toolbar_metrics')\n\n const toolbarParams = {\n token: this.instance.get_config('token'),\n ...params,\n apiURL: host, // defaults to api_host from the instance config if nothing else set\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n\n const { source: _discard, ...paramsToPersist } = toolbarParams // eslint-disable-line\n window.localStorage.setItem('_postHogToolbarParams', JSON.stringify(paramsToPersist))\n\n loadScript(toolbarUrl, (err) => {\n if (err) {\n logger.error('Failed to load toolbar', err)\n return\n }\n ;((window as any)['ph_load_toolbar'] || (window as any)['ph_load_editor'])(toolbarParams, this.instance)\n })\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n _register_event(window, 'turbolinks:load', () => {\n ;(window as any)['_postHogToolbarLoaded'] = false\n this.loadToolbar(toolbarParams)\n })\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n","/**\n * GDPR utils\n *\n * The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection\n * and privacy for all individuals within the European Union. It addresses the export of personal\n * data outside the EU. The GDPR aims primarily to give control back to citizens and residents\n * over their personal data and to simplify the regulatory environment for international business\n * by unifying the regulation within the EU.\n *\n * This set of utilities is intended to enable opt in/out functionality in the PostHog JS SDK.\n * These functions are used internally by the SDK and are not intended to be publicly exposed.\n */\n\nimport { _each, _includes, _isNumber, _isString, window } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore } from './storage'\nimport { GDPROptions, PersistentStore } from './types'\nimport { PostHog } from './posthog-core'\n\n/**\n * A function used to capture a PostHog event (e.g. PostHogLib.capture)\n * @callback captureFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after capturing the event.\n */\n\n/** Public **/\n\nconst GDPR_DEFAULT_PERSISTENCE_PREFIX = '__ph_opt_in_out_'\n\n/**\n * Opt the user in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function optIn(token: string, options: GDPROptions): void {\n _optInOut(true, token, options)\n}\n\n/**\n * Opt the user out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\nexport function optOut(token: string, options: GDPROptions): void {\n _optInOut(false, token, options)\n}\n\n/**\n * Check whether the user has opted in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\nexport function hasOptedIn(token: string, options: GDPROptions): boolean {\n return _getStorageValue(token, options) === '1'\n}\n\n/**\n * Check whether the user has opted out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the user has opted out of the given opt type\n */\nexport function hasOptedOut(token: string, options: Partial<GDPROptions>): boolean {\n if (_hasDoNotTrackFlagOn(options)) {\n return true\n }\n return _getStorageValue(token, options) === '0'\n}\n\n/**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function clearOptInOut(token: string, options: GDPROptions) {\n options = options || {}\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie)\n}\n\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either cookieStore or localStore\n */\nfunction _getStorage(options: GDPROptions): PersistentStore {\n options = options || {}\n if (options.persistenceType === 'localStorage') {\n return localStore\n }\n if (options.persistenceType === 'localStorage+cookie') {\n return localPlusCookieStore\n }\n return cookieStore\n}\n\n/**\n * Get the name of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\nfunction _getStorageKey(token: string, options: GDPROptions) {\n options = options || {}\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token\n}\n\n/**\n * Get the value of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\nfunction _getStorageValue(token: string, options: GDPROptions) {\n return _getStorage(options).get(_getStorageKey(token, options))\n}\n\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the DNT setting is true\n */\nfunction _hasDoNotTrackFlagOn(options: GDPROptions) {\n if (options && options.respectDnt) {\n const win = (options && options.window) || window\n const nav = win['navigator'] || {}\n let hasDntOn = false\n _each(\n [\n nav['doNotTrack'], // standard\n (nav as any)['msDoNotTrack'],\n (win as any)['doNotTrack'],\n ],\n function (dntValue) {\n if (_includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true\n }\n }\n )\n return hasDntOn\n }\n return false\n}\n\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nfunction _optInOut(optValue: boolean, token: string, options: GDPROptions) {\n if (!_isString(token) || !token.length) {\n console.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token')\n return\n }\n\n options = options || {}\n\n _getStorage(options).set(\n _getStorageKey(token, options),\n optValue ? 1 : 0,\n _isNumber(options.cookieExpiration) ? options.cookieExpiration : null,\n options.crossSubdomainCookie,\n options.secureCookie\n )\n\n if (options.capture && optValue) {\n // only capture event if opting in (optValue=true)\n options.capture(options.captureEventName || '$opt_in', options.captureProperties || {}, {\n send_instantly: true,\n })\n }\n}\n\nexport function userOptedOut(posthog: PostHog, silenceErrors: boolean | undefined) {\n let optedOut = false\n\n try {\n const token = posthog.get_config('token')\n const respectDnt = posthog.get_config('respect_dnt')\n const persistenceType = posthog.get_config('opt_out_capturing_persistence_type')\n const persistencePrefix = posthog.get_config('opt_out_capturing_cookie_prefix') || undefined\n const win = posthog.get_config('window' as any) as Window | undefined // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n respectDnt,\n persistenceType,\n persistencePrefix,\n window: win,\n })\n }\n } catch (err) {\n if (!silenceErrors) {\n console.error('Unexpected error when checking capturing opt-out status: ' + err)\n }\n }\n return optedOut\n}\n\n/**\n * Wrap a method with a check for whether the user is opted out of data capturing and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {PostHog} posthog - the posthog instance\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @param silenceErrors\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\nexport function addOptOutCheck<M extends (...args: any[]) => any = (...args: any[]) => any>(\n posthog: PostHog,\n method: M,\n silenceErrors?: boolean\n): M {\n return function (...args) {\n const optedOut = userOptedOut(posthog, silenceErrors)\n\n if (!optedOut) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return method.apply(this, args)\n }\n\n const callback = args[args.length - 1]\n if (typeof callback === 'function') {\n callback(0)\n }\n\n return\n } as M\n}\n","export class RequestQueueScaffold {\n isPolling: boolean // flag to continue to recursively poll or not\n _event_queue: any[]\n _empty_queue_count: number // to track empty polls\n _poller: number | undefined // to become interval for reference to clear later\n _pollInterval: number\n\n constructor(pollInterval = 3000) {\n this.isPolling = true // flag to continue to recursively poll or not\n this._event_queue = []\n this._empty_queue_count = 0 // to track empty polls\n this._poller = undefined // to become interval for reference to clear later\n this._pollInterval = pollInterval\n }\n\n setPollInterval(interval: number): void {\n this._pollInterval = interval\n // Reset interval if running already\n if (this.isPolling) {\n this.poll()\n }\n }\n\n // // eslint-disable-next-line no-unused-vars\n // enqueue(_requestData: Record<string, any>): void {\n // return\n // }\n\n poll(): void {\n return\n }\n\n unload(): void {\n return\n }\n\n getTime(): number {\n return new Date().getTime()\n }\n}\n","import { RequestQueueScaffold } from './base-request-queue'\nimport { _each } from './utils'\nimport { Properties, QueuedRequestData, XHROptions } from './types'\n\nexport class RequestQueue extends RequestQueueScaffold {\n handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void\n\n constructor(handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void, pollInterval = 3000) {\n super(pollInterval)\n this.handlePollRequest = handlePollRequest\n }\n\n enqueue(url: string, data: Properties, options: XHROptions): void {\n this._event_queue.push({ url, data, options })\n\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this._event_queue.length > 0) {\n const requests = this.formatQueue()\n for (const key in requests) {\n const { url, data, options } = requests[key]\n _each(data, (_, dataKey) => {\n data[dataKey]['offset'] = Math.abs(data[dataKey]['timestamp'] - this.getTime())\n delete data[dataKey]['timestamp']\n })\n this.handlePollRequest(url, data, options)\n }\n this._event_queue.length = 0 // flush the _event_queue\n this._empty_queue_count = 0\n } else {\n this._empty_queue_count++\n }\n\n /**\n * _empty_queue_count will increment each time the queue is polled\n * and it is empty. To avoid empty polling (user went idle, stepped away from comp)\n * we can turn it off with the isPolling flag.\n *\n * Polling will be re enabled when the next time PostHogLib.capture is called with\n * an event that should be added to the event queue.\n */\n if (this._empty_queue_count > 4) {\n this.isPolling = false\n this._empty_queue_count = 0\n }\n if (this.isPolling) {\n this.poll()\n }\n }, this._pollInterval) as any as number\n }\n\n unload(): void {\n clearTimeout(this._poller)\n const requests = this._event_queue.length > 0 ? this.formatQueue() : {}\n this._event_queue.length = 0\n const requestValues = Object.values(requests)\n\n // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n const sortedRequests = [\n ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n ]\n sortedRequests.map(({ url, data, options }) => {\n this.handlePollRequest(url, data, { ...options, transport: 'sendBeacon' })\n })\n }\n\n formatQueue(): Record<string, QueuedRequestData> {\n const requests: Record<string, QueuedRequestData> = {}\n _each(this._event_queue, (request) => {\n const { url, data, options } = request\n const key = (options ? options._batchKey : null) || url\n if (requests[key] === undefined) {\n requests[key] = { data: [], url, options }\n }\n\n // :TRICKY: Metrics-only code\n if (\n options &&\n requests[key].options &&\n requests[key].options._metrics &&\n !(requests[key].options._metrics as any)['rrweb_full_snapshot']\n ) {\n ;(requests[key].options._metrics as any)['rrweb_full_snapshot'] =\n options._metrics['rrweb_full_snapshot']\n }\n requests[key].data.push(data)\n })\n return requests\n }\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n var w = new Worker(u);\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\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 // numbers here are at max 18 bits\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];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\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 // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\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});\n// fixed length tree\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;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\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};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\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};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\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};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\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 // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\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 // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\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 // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\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 // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts)\n throw 'unexpected EOF';\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\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 // bits read, code\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 }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\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};\n// starting at p, write the minimum number of bits that can hold v to d\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};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\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};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\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) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\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: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\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: l, r: 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 // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\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 }\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};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\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 }\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};\n// calculate the length of output from tree, code lengths\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};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\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};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[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 }\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 }\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};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\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 / 7000)) + post);\n // writing to this writes to the output buffer\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 // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\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 // prev 2-byte val map curr 2-byte val map\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 (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768\n var imod = i & 32767;\n // previous index with this value\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || 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 // len dist chain\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 // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\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 // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\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 // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\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 }\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 // this is the easiest way to avoid needing to maintain state\n if (!lst)\n pos = wfblk(w, pos, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = 0xFFFFFFFF;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return c ^ 0xFFFFFFFF; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\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 () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n };\n};\n;\n// deflate with opts\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};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n if (!opts.consume)\n dat = new u8(dat);\n w.postMessage([dat, opts], [dat.buffer]);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\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 AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = gzs(this.p);\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (opts === void 0) { opts = {}; }\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}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function 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) { ar[ai++] = v; };\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),\n 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}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function 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,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n var fl = fn.length, l = cmp.length;\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b] = 20, b += 2;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n d[b] = t, b += 2;\n var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n b += 4;\n wbytes(d, b, c);\n wbytes(d, b + 4, l);\n wbytes(d, b + 8, su);\n wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n if (ce != null)\n wbytes(d, b += 10, ce), b += 4;\n d.set(fn, b);\n b += fl;\n if (ce == null)\n d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), m = file.length;\n c.p(file);\n var n = strToU8(fn), s = n.length;\n var t = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = {\n t: t,\n d: d,\n m: m,\n c: c.d(),\n u: fn.length != l,\n n: n,\n p: p\n };\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n if (!--lft)\n cbf();\n }\n };\n if (n.length > 65535)\n cbl('filename too long', null);\n if (!t)\n cbl(null, file);\n else if (m < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var t = p.level == 0 ? 0 : 8;\n var n = strToU8(fn), s = n.length;\n if (n.length > 65535)\n throw 'filename too long';\n var d = t ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push({\n t: t,\n d: d,\n m: file.length,\n c: c.d(),\n u: fn.length != s,\n n: n,\n o: o,\n p: p\n });\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_2 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_2(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n */\n css_selector_allowlist?: string[]\n}\n\nexport type UUIDVersion = 'og' | 'v7'\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport: string\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n test: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n property_blacklist: string[]\n xhr_headers: { [header_name: string]: string }\n on_xhr_error: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_measure_pageview_stats?: boolean\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n /** Modify the network request before it is captured. Returning null stops it being captured */\n maskNetworkRequestFn?: ((url: NetworkRequest) => NetworkRequest | null | undefined) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n endpoint?: string /** defaults to '/e/' */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\nexport interface XHRParams extends QueuedRequestData {\n retryQueue: RetryQueue\n onXHRError: (req: XMLHttpRequest) => void\n timeout?: number\n onRateLimited?: (req: XMLHttpRequest) => void\n}\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n }\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type NetworkRequest = {\n url: string\n}\n","import { _each, _HTTPBuildQuery, logger } from './utils'\nimport Config from './config'\nimport { PostData, XHROptions, XHRParams } from './types'\n\nexport const addParamsToURL = (\n url: string,\n urlQueryArgs: Record<string, any> | undefined,\n parameterOptions: { ip?: boolean }\n): string => {\n const args = urlQueryArgs || {}\n args['ip'] = parameterOptions['ip'] ? 1 : 0\n args['_'] = new Date().getTime().toString()\n args['ver'] = Config.LIB_VERSION\n\n const halves = url.split('?')\n if (halves.length > 1) {\n const params = halves[1].split('&')\n for (const p of params) {\n const key = p.split('=')[0]\n if (args[key]) {\n delete args[key]\n }\n }\n }\n\n const argSeparator = url.indexOf('?') > -1 ? '&' : '?'\n return url + argSeparator + _HTTPBuildQuery(args)\n}\n\nexport const encodePostData = (data: PostData | Uint8Array, options: Partial<XHROptions>): string | BlobPart | null => {\n if (options.blob && data.buffer) {\n return new Blob([data.buffer], { type: 'text/plain' })\n }\n\n if (options.sendBeacon || options.blob) {\n const body = encodePostData(data, { method: 'POST' }) as BlobPart\n return new Blob([body], { type: 'application/x-www-form-urlencoded' })\n }\n\n if (options.method !== 'POST') {\n return null\n }\n\n let body_data\n const isUint8Array = (d: unknown): d is Uint8Array => Object.prototype.toString.call(d) === '[object Uint8Array]'\n if (Array.isArray(data) || isUint8Array(data)) {\n // TODO: eh? passing an Array here?\n body_data = 'data=' + encodeURIComponent(data as any)\n } else {\n body_data = 'data=' + encodeURIComponent(data.data as string)\n }\n\n if ('compression' in data && data.compression) {\n body_data += '&compression=' + data.compression\n }\n\n return body_data\n}\n\nexport const xhr = ({\n url,\n data,\n headers,\n options,\n callback,\n retriesPerformedSoFar,\n retryQueue,\n onXHRError,\n timeout = 10000,\n onRateLimited,\n}: XHRParams) => {\n const req = new XMLHttpRequest()\n req.open(options.method || 'GET', url, true)\n\n const body = encodePostData(data, options)\n\n _each(headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (options.method === 'POST' && !options.blob) {\n req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')\n }\n\n req.timeout = timeout\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.status === 200) {\n if (callback) {\n let response\n try {\n response = JSON.parse(req.responseText)\n } catch (e) {\n logger.error(e)\n return\n }\n callback(response)\n }\n } else {\n if (typeof onXHRError === 'function') {\n onXHRError(req)\n }\n\n // don't retry certain errors\n if ([401, 403, 404, 500].indexOf(req.status) < 0) {\n retryQueue.enqueue({\n url,\n data,\n options,\n headers,\n retriesPerformedSoFar: (retriesPerformedSoFar || 0) + 1,\n callback,\n })\n }\n\n if (req.status === 429) {\n onRateLimited?.(req)\n }\n\n if (callback) {\n callback({ status: 0 })\n }\n }\n }\n }\n req.send(body)\n}\n","import { RequestQueueScaffold } from './base-request-queue'\nimport { encodePostData, xhr } from './send-request'\nimport { QueuedRequestData, RetryQueueElement } from './types'\nimport Config from './config'\nimport { RateLimiter } from './rate-limiter'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\nexport class RetryQueue extends RequestQueueScaffold {\n queue: RetryQueueElement[]\n isPolling: boolean\n areWeOnline: boolean\n onXHRError: (failedRequest: XMLHttpRequest) => void\n rateLimiter: RateLimiter\n\n constructor(onXHRError: (failedRequest: XMLHttpRequest) => void, rateLimiter: RateLimiter) {\n super()\n this.isPolling = false\n this.queue = []\n this.areWeOnline = true\n this.onXHRError = onXHRError\n this.rateLimiter = rateLimiter\n\n if (typeof window !== 'undefined' && 'onLine' in window.navigator) {\n this.areWeOnline = window.navigator.onLine\n window.addEventListener('online', () => {\n this._handleWeAreNowOnline()\n })\n window.addEventListener('offline', () => {\n this.areWeOnline = false\n })\n }\n }\n\n enqueue(requestData: QueuedRequestData): void {\n const retriesPerformedSoFar = requestData.retriesPerformedSoFar || 0\n if (retriesPerformedSoFar >= 10) {\n return\n }\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = new Date(Date.now() + msToNextRetry)\n\n this.queue.push({ retryAt, requestData })\n console.warn(`Enqueued failed request for retry in ${msToNextRetry}`)\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n this._poller && clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this.areWeOnline && this.queue.length > 0) {\n this.flush()\n }\n this.poll()\n }, this._pollInterval) as any as number\n }\n\n flush(): void {\n // using Date.now to make tests easier, as recommended here https://codewithhugo.com/mocking-the-current-date-in-jest-tests/\n const now = new Date(Date.now())\n const toFlush = this.queue.filter(({ retryAt }) => retryAt < now)\n if (toFlush.length > 0) {\n this.queue = this.queue.filter(({ retryAt }) => retryAt >= now)\n for (const { requestData } of toFlush) {\n this._executeXhrRequest(requestData)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n for (const { requestData } of this.queue) {\n const { url, data, options } = requestData\n\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n if (Config.DEBUG) {\n console.warn('[PostHog RetryQueue] is quota limited. Dropping request.')\n }\n continue\n }\n\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n if (Config.DEBUG) {\n console.error(e)\n }\n }\n }\n this.queue = []\n }\n\n _executeXhrRequest({ url, data, options, headers, callback, retriesPerformedSoFar }: QueuedRequestData): void {\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n if (Config.DEBUG) {\n console.warn('[PostHog RetryQueue] in quota limited mode. Dropping request.')\n }\n return\n }\n\n xhr({\n url,\n data: data || {},\n options: options || {},\n headers: headers || {},\n retriesPerformedSoFar: retriesPerformedSoFar || 0,\n callback,\n retryQueue: this,\n onXHRError: this.onXHRError,\n onRateLimited: this.rateLimiter.on429Response,\n })\n }\n\n _handleWeAreNowOnline(): void {\n this.areWeOnline = true\n this.flush()\n }\n}\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return typeof value === 'number' && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private timestamp = 0\n private counter = 0\n private readonly random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (value !== undefined) {\n return value\n } else {\n // reset state and resume\n this.timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (valueAfterReset === undefined) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this.timestamp) {\n this.timestamp = ts\n this.resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this.timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this.counter++\n if (this.counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this.timestamp++\n this.resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this.timestamp,\n Math.trunc(this.counter / 2 ** 30),\n this.counter & (2 ** 30 - 1),\n this.random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private resetCounter(): void {\n this.counter = this.random.nextUint32() * 0x400 + (this.random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly buffer = new Uint32Array(8)\n private cursor = Infinity\n nextUint32(): number {\n if (this.cursor >= this.buffer.length) {\n getRandomValues(this.buffer)\n this.cursor = 0\n }\n return this.buffer[this.cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n","import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuidv7 } from './uuidv7'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 mins\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 mins\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private _window_id_storage_key: string\n private _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n private _sessionActivityTimestamp: number | null\n private _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(config: Partial<PostHogConfig>, persistence: PostHogPersistence) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (typeof desiredTimeout !== 'number') {\n console.warn('[PostHog] session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.'\n )\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.'\n )\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n this._listenToReloadWindow()\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (this._sessionIdChangedHandlers === undefined) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (Array.isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`. In addition\n * to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n startTimestamp && startTimestamp > 0 && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n if (\n !sessionId ||\n (!readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs) ||\n sessionPastMaximumLength\n ) {\n sessionId = uuidv7()\n windowId = uuidv7()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = uuidv7()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) => handler(sessionId, windowId))\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n }\n }\n}\n","/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n * Sentry.init({\n * dsn: 'https://example',\n * integrations: [\n * new posthog.SentryIntegration(posthog)\n * ]\n * })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n */\n\nimport { PostHog } from '../posthog-core'\nimport { ErrorProperties } from './exceptions/error-conversion'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n// Event as _SentryEvent,\n// EventProcessor as _SentryEventProcessor,\n// Hub as _SentryHub,\n// Integration as _SentryIntegration,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n name: string\n setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\ninterface SentryExceptionProperties {\n $sentry_event_id: any\n $sentry_exception: any\n $sentry_exception_message: any\n $sentry_exception_type: any\n $sentry_tags: any\n $sentry_url?: string\n}\n\nexport class SentryIntegration implements _SentryIntegration {\n name: string\n\n setupOnce: (\n addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n getCurrentHub: () => _SentryHub\n ) => void\n\n constructor(_posthog: PostHog, organization?: string, projectId?: number, prefix?: string) {\n // setupOnce gets called by Sentry when it intializes the plugin\n this.name = 'posthog-js'\n this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n addGlobalEventProcessor((event: _SentryEvent) => {\n if (event.level !== 'error' || !_posthog.__loaded) return event\n if (!event.tags) event.tags = {}\n\n const host = _posthog.config.ui_host || _posthog.config.api_host\n event.tags['PostHog Person URL'] = host + '/person/' + _posthog.get_distinct_id()\n if (_posthog.sessionRecordingStarted()) {\n event.tags['PostHog Recording URL'] = _posthog.get_session_replay_url({ withTimestamp: true })\n }\n\n const exceptions = event.exception?.values || []\n\n const data: SentryExceptionProperties & ErrorProperties = {\n // PostHog Exception Properties,\n $exception_message: exceptions[0]?.value,\n $exception_type: exceptions[0]?.type,\n $exception_personURL: host + '/person/' + _posthog.get_distinct_id(),\n // Sentry Exception Properties\n $sentry_event_id: event.event_id,\n $sentry_exception: event.exception,\n $sentry_exception_message: exceptions[0]?.value,\n $sentry_exception_type: exceptions[0]?.type,\n $sentry_tags: event.tags,\n }\n\n if (organization && projectId)\n data['$sentry_url'] =\n (prefix || 'https://sentry.io/organizations/') +\n organization +\n '/issues/?project=' +\n projectId +\n '&query=' +\n event.event_id\n _posthog.capture('$exception', data)\n return event\n })\n }\n }\n}\n","/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\n\n// Loosely based on https://github.com/segmentio/analytics-next/blob/master/packages/core/src/plugins/index.ts\ninterface SegmentPluginContext {\n event: {\n event: string\n userId?: string\n anonymousId?: string\n properties: any\n }\n}\n\ninterface SegmentPlugin {\n name: string\n version: string\n type: 'enrichment'\n isLoaded: () => boolean\n load: (ctx: SegmentPluginContext, instance: any, config?: any) => Promise<unknown>\n unload?: (ctx: SegmentPluginContext, instance: any) => Promise<unknown> | unknown\n ready?: () => Promise<unknown>\n track?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n identify?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n page?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n group?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n alias?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n screen?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n}\n\nexport const createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (!Promise || !Promise.resolve) {\n console.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentPluginContext, eventName: string) => {\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n posthog.register({\n distinct_id: ctx.event.userId,\n })\n posthog.reloadFeatureFlags()\n }\n\n const additionalProperties = posthog._calculate_event_properties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n","import { window } from './utils'\n\ninterface PageViewData {\n pathname: string\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\ninterface ScrollProperties {\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\ninterface PageViewEventProperties extends ScrollProperties {\n $prev_pageview_pathname?: string\n}\n\nexport class PageViewManager {\n _pageViewData: PageViewData | undefined\n _hasSeenPageView = false\n\n _createPageViewData(): PageViewData {\n return {\n pathname: window.location.pathname,\n }\n }\n\n doPageView(): PageViewEventProperties {\n let prevPageViewData: PageViewData | undefined\n // if there were events created before the first PageView, we would have created a\n // pageViewData for them. If this happened, we don't want to create a new pageViewData\n if (!this._hasSeenPageView) {\n this._hasSeenPageView = true\n prevPageViewData = undefined\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n } else {\n prevPageViewData = this._pageViewData\n this._pageViewData = this._createPageViewData()\n }\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n doPageLeave(): PageViewEventProperties {\n const prevPageViewData = this._pageViewData\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n _calculatePrevPageScrollProperties(prevPageViewData: PageViewData | undefined): ScrollProperties {\n if (\n !prevPageViewData ||\n prevPageViewData.maxScrollHeight == null ||\n prevPageViewData.lastScrollY == null ||\n prevPageViewData.maxScrollY == null ||\n prevPageViewData.maxContentHeight == null ||\n prevPageViewData.lastContentY == null ||\n prevPageViewData.maxContentY == null\n ) {\n return {}\n }\n\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } = prevPageViewData\n\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(lastScrollY / maxScrollHeight, 0, 1)\n const maxScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(maxScrollY / maxScrollHeight, 0, 1)\n const lastContentPercentage = maxContentHeight <= 1 ? 1 : clamp(lastContentY / maxContentHeight, 0, 1)\n const maxContentPercentage = maxContentHeight <= 1 ? 1 : clamp(maxContentY / maxContentHeight, 0, 1)\n\n return {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n }\n }\n\n _updateScrollData = () => {\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n const pageViewData = this._pageViewData\n\n const scrollY = this._scrollY()\n const scrollHeight = this._scrollHeight()\n const contentY = this._contentY()\n const contentHeight = this._contentHeight()\n\n pageViewData.lastScrollY = scrollY\n pageViewData.maxScrollY = Math.max(scrollY, pageViewData.maxScrollY ?? 0)\n pageViewData.maxScrollHeight = Math.max(scrollHeight, pageViewData.maxScrollHeight ?? 0)\n\n pageViewData.lastContentY = contentY\n pageViewData.maxContentY = Math.max(contentY, pageViewData.maxContentY ?? 0)\n pageViewData.maxContentHeight = Math.max(contentHeight, pageViewData.maxContentHeight ?? 0)\n }\n\n startMeasuringScrollPosition() {\n window.addEventListener('scroll', this._updateScrollData)\n window.addEventListener('scrollend', this._updateScrollData)\n window.addEventListener('resize', this._updateScrollData)\n }\n\n stopMeasuringScrollPosition() {\n window.removeEventListener('scroll', this._updateScrollData)\n window.removeEventListener('scrollend', this._updateScrollData)\n window.removeEventListener('resize', this._updateScrollData)\n }\n\n _scrollHeight(): number {\n return Math.max(0, window.document.documentElement.scrollHeight - window.document.documentElement.clientHeight)\n }\n\n _scrollY(): number {\n return window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0\n }\n\n _contentHeight(): number {\n return window.document.documentElement.scrollHeight || 0\n }\n\n _contentY(): number {\n const clientHeight = window.document.documentElement.clientHeight || 0\n return this._scrollY() + clientHeight\n }\n}\n\nfunction clamp(x: number, min: number, max: number) {\n return Math.max(min, Math.min(x, max))\n}\n","export function isEvent(candidate: unknown): candidate is Event {\n return typeof Event !== 'undefined' && isInstanceOf(candidate, Event)\n}\n\nexport function isPlainObject(candidate: unknown): candidate is Record<string, unknown> {\n return isBuiltin(candidate, 'Object')\n}\n\nexport function isInstanceOf(candidate: unknown, base: any): boolean {\n try {\n return candidate instanceof base\n } catch (_e) {\n return false\n }\n}\n\nexport function isPrimitive(\n candidate: unknown\n): candidate is number | string | boolean | bigint | symbol | null | undefined {\n return candidate === null || (typeof candidate !== 'object' && typeof candidate !== 'function')\n}\n\nexport function isError(candidate: unknown): candidate is Error {\n switch (Object.prototype.toString.call(candidate)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true\n default:\n return isInstanceOf(candidate, Error)\n }\n}\n\nexport function isErrorEvent(event: string | Error | Event): event is ErrorEvent {\n return isBuiltin(event, 'ErrorEvent')\n}\n\nexport function isErrorWithStack(candidate: unknown): candidate is Error {\n return 'stack' in (candidate as Error)\n}\n\nexport function isBuiltin(candidate: unknown, className: string): boolean {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`\n}\n\nexport function isDOMException(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMException')\n}\n\nexport function isDOMError(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMError')\n}\n","// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (lineno !== undefined) {\n frame.lineno = lineno\n }\n\n if (colno !== undefined) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n","import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\n\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\n\nexport type ErrorEventArgs = [\n event: string | Event,\n source?: string | undefined,\n lineno?: number | undefined,\n colno?: number | undefined,\n error?: Error | undefined\n]\n\nexport interface ErrorProperties {\n $exception_type: string\n $exception_message: string\n $exception_source?: string\n $exception_lineno?: number\n $exception_colno?: number\n $exception_DOMException_code?: string\n $exception_is_synthetic?: boolean\n $exception_stack_trace_raw?: string\n $exception_handled?: boolean\n $exception_personURL?: string\n}\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n }\n\n return 0\n}\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const popSize = getPopSize(ex)\n\n try {\n return defaultStackParser(stacktrace, popSize)\n } catch (e) {\n // no-empty\n }\n\n return []\n}\n\nfunction errorPropertiesFromError(error: Error): ErrorProperties {\n const frames = parseStackFrames(error)\n\n return {\n $exception_type: error.name,\n $exception_message: error.message,\n $exception_stack_trace_raw: JSON.stringify(frames),\n }\n}\n\nfunction errorPropertiesFromString(candidate: string): ErrorProperties {\n return {\n $exception_type: 'Error',\n $exception_message: candidate,\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>): ErrorProperties {\n return {\n $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',\n $exception_message: `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`,\n }\n}\n\nexport function errorToProperties([event, source, lineno, colno, error]: ErrorEventArgs): ErrorProperties {\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n\n if (error === undefined && typeof event === 'string') {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n errorProperties = {\n $exception_type: name,\n $exception_message: message,\n }\n }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n errorProperties = errorPropertiesFromString(message)\n errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties.$exception_message = errorProperties.$exception_message || message\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n errorProperties = errorPropertiesFromError((candidate as ErrorEvent).error as Error)\n } else if (isError(candidate)) {\n errorProperties = errorPropertiesFromError(candidate)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n errorProperties = errorPropertiesFromObject(objectException)\n errorProperties.$exception_is_synthetic = true\n } else {\n // If none of previous checks were valid, then it must be a string\n errorProperties.$exception_type = errorProperties.$exception_type || 'Error'\n errorProperties.$exception_message = errorProperties.$exception_message || candidate\n errorProperties.$exception_is_synthetic = true\n }\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: errorProperties.$exception_type || 'UnknownErrorType',\n $exception_message: errorProperties.$exception_message || '',\n ...(source\n ? {\n $exception_source: source, // TODO get this from URL if not present\n }\n : {}),\n ...(lineno ? { $exception_lineno: lineno } : {}),\n ...(colno ? { $exception_colno: colno } : {}),\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n // dig the object of the rejection out of known event types\n let error: unknown = ev\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in ev) {\n error = ev.reason\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in ev && 'reason' in (ev as any).detail) {\n error = (ev as any).detail.reason\n }\n } catch (_oO) {\n // no-empty\n }\n\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n if (isPrimitive(error)) {\n errorProperties = {\n $exception_message: `Non-Error promise rejection captured with value: ${String(error)}`,\n }\n } else {\n errorProperties = errorToProperties([error as string | Event])\n }\n errorProperties.$exception_handled = false\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: (errorProperties.$exception_type = 'UnhandledRejection'),\n $exception_message: (errorProperties.$exception_message =\n errorProperties.$exception_message || (ev as any).reason || String(error)),\n }\n}\n","import { window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n private debugLog(...args: any[]) {\n if (this.instance.get_config('debug')) {\n console.log('PostHog.js [PostHog.ExceptionObserver]', ...args)\n }\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n console.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (this.originalOnErrorHandler !== undefined) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (this.originalOnUnhandledRejectionHandler !== undefined) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n Array.isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n this.debugLog('Remote config for exception autocapture is enabled, starting', autocaptureExceptionsResponse)\n } else {\n this.debugLog(\n 'Remote config for exception autocapture is disabled, not starting',\n autocaptureExceptionsResponse\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n this.debugLog('Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.get_config('ui_host') || this.instance.get_config('api_host')\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n","import { PostHog } from './posthog-core'\nimport { SURVEYS } from './constants'\n\n/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\nexport interface SurveyAppearance {\n background_color?: string\n button_color?: string\n text_color?: string\n}\n\nexport enum SurveyType {\n Popover = 'Popover',\n Button = 'Button',\n Email = 'Email',\n FullScreen = 'Fullscreen',\n}\n\nexport interface SurveyQuestion {\n type: SurveyQuestionType\n question: string\n required?: boolean\n link?: boolean\n choices?: string[]\n}\n\nexport enum SurveyQuestionType {\n Open = 'open',\n MultipleChoiceSingle = 'multiple_single',\n MultipleChoiceMulti = 'multiple_multi',\n NPS = 'nps',\n Rating = 'rating',\n Link = 'link',\n}\n\nexport interface SurveyResponse {\n surveys: Survey[]\n}\n\nexport type SurveyCallback = (surveys: Survey[]) => void\n\nexport interface Survey {\n // Sync this with the backend's SurveySerializer!\n name: string\n description: string\n type: SurveyType\n linked_flag_key?: string | null\n targeting_flag_key?: string | null\n questions: SurveyQuestion[]\n appearance?: SurveyAppearance | null\n conditions?: { url?: string; selector?: string } | null\n start_date?: string | null\n end_date?: string | null\n}\n\nexport class PostHogSurveys {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n const existingSurveys = this.instance.get_property(SURVEYS)\n if (!existingSurveys || forceReload) {\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/api/surveys/?token=${this.instance.get_config('token')}`,\n {},\n { method: 'GET' },\n (response) => {\n const surveys = response.surveys\n this.instance.persistence?.register({ [SURVEYS]: surveys })\n return callback(surveys)\n }\n )\n } else {\n return callback(existingSurveys)\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n this.getSurveys((surveys) => {\n const activeSurveys = surveys.filter((survey) => {\n return !!(survey.start_date && !survey.end_date)\n })\n const conditionMatchedSurveys = activeSurveys.filter((survey) => {\n if (!survey.conditions) {\n return true\n }\n const urlCheck = survey.conditions?.url\n ? window.location.href.indexOf(survey.conditions.url) > -1\n : true\n const selectorCheck = survey.conditions?.selector\n ? document.querySelector(survey.conditions.selector)\n : true\n return urlCheck && selectorCheck\n })\n const targetingMatchedSurveys = conditionMatchedSurveys.filter((survey) => {\n if (!survey.linked_flag_key && !survey.targeting_flag_key) {\n return true\n }\n const linkedFlagCheck = survey.linked_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n return linkedFlagCheck && targetingFlagCheck\n })\n\n return callback(targetingMatchedSurveys)\n }, forceReload)\n }\n}\n","import Config from './config'\nimport {\n _copyAndTruncateStrings,\n _each,\n _eachArray,\n _extend,\n _info,\n _isArray,\n _isBlockedUA,\n _isObject,\n _isUndefined,\n _register_event,\n _safewrap_class,\n document,\n logger,\n userAgent,\n window,\n} from './utils'\nimport { autocapture } from './autocapture'\nimport { PostHogFeatureFlags } from './posthog-featureflags'\nimport { PostHogPersistence } from './posthog-persistence'\nimport { ALIAS_ID_KEY, FLAG_CALL_REPORTED, PEOPLE_DISTINCT_ID_KEY } from './constants'\nimport { SessionRecording } from './extensions/sessionrecording'\nimport { WebPerformanceObserver } from './extensions/web-performance'\nimport { Decide } from './decide'\nimport { Toolbar } from './extensions/toolbar'\nimport { clearOptInOut, hasOptedIn, hasOptedOut, optIn, optOut, userOptedOut } from './gdpr-utils'\nimport { cookieStore, localStore } from './storage'\nimport { RequestQueue } from './request-queue'\nimport { compressData, decideCompression } from './compression'\nimport { addParamsToURL, encodePostData, xhr } from './send-request'\nimport { RetryQueue } from './retry-queue'\nimport { SessionIdManager } from './sessionid'\nimport {\n AutocaptureConfig,\n CaptureOptions,\n CaptureResult,\n Compression,\n EarlyAccessFeatureCallback,\n GDPROptions,\n isFeatureEnabledOptions,\n JSC,\n JsonType,\n OptInOutCapturingOptions,\n PostHogConfig,\n Properties,\n Property,\n RequestCallback,\n SessionIdChangedCallback,\n SnippetArrayItem,\n ToolbarParams,\n XHROptions,\n} from './types'\nimport { SentryIntegration } from './extensions/sentry-integration'\nimport { createSegmentIntegration } from './extensions/segment-integration'\nimport { PageViewManager } from './page-view'\nimport { ExceptionObserver } from './extensions/exceptions/exception-autocapture'\nimport { PostHogSurveys, SurveyCallback } from './posthog-surveys'\nimport { RateLimiter } from './rate-limiter'\nimport { uuidv7 } from './uuidv7'\n\n/*\nSIMPLE STYLE GUIDE:\n\nthis.x === public function\nthis._x === internal - only use within this file\nthis.__x === private - only use within the class\n\nGlobals should be all caps\n*/\n\nenum InitType {\n INIT_MODULE = 0,\n INIT_SNIPPET = 1,\n}\n\nlet init_type: InitType\n\n// TODO: the type of this is very loose. Sometimes it's also PostHogLib itself\nlet posthog_master: Record<string, PostHog> & {\n init: (token: string, config: Partial<PostHogConfig>, name: string) => void\n}\n\n// some globals for comparisons\nconst __NOOP = () => {}\nconst __NOOPTIONS = {}\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\nconst USE_XHR = window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !USE_XHR && userAgent.indexOf('MSIE') === -1 && userAgent.indexOf('Mozilla') === -1\n\nconst defaultConfig = (): PostHogConfig => ({\n api_host: 'https://app.posthog.com',\n api_method: 'POST',\n api_transport: 'XHR',\n ui_host: null,\n token: '',\n autocapture: true,\n rageclick: true,\n cross_subdomain_cookie: document?.location?.hostname?.indexOf('herokuapp.com') === -1,\n persistence: 'cookie',\n persistence_name: '',\n cookie_name: '',\n loaded: __NOOP,\n store_google: true,\n custom_campaign_params: [],\n custom_blocked_useragents: [],\n save_referrer: true,\n test: false,\n verbose: false,\n capture_pageview: true,\n capture_pageleave: true, // We'll only capture pageleave events if capture_pageview is also true\n debug: false,\n cookie_expiration: 365,\n upgrade: false,\n disable_session_recording: false,\n disable_persistence: false,\n disable_cookie: false,\n enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n secure_cookie: window?.location?.protocol === 'https:',\n ip: true,\n opt_out_capturing_by_default: false,\n opt_out_persistence_by_default: false,\n opt_out_capturing_persistence_type: 'localStorage',\n opt_out_capturing_cookie_prefix: null,\n opt_in_site_apps: false,\n property_blacklist: [],\n respect_dnt: false,\n sanitize_properties: null,\n xhr_headers: {}, // { header: value, header2: value }\n inapp_protocol: '//',\n inapp_link_new_window: false,\n request_batching: true,\n properties_string_max_length: 65535,\n session_recording: {},\n mask_all_element_attributes: false,\n mask_all_text: false,\n advanced_disable_decide: false,\n advanced_disable_feature_flags: false,\n advanced_disable_feature_flags_on_first_load: false,\n advanced_disable_toolbar_metrics: false,\n on_xhr_error: (req) => {\n const error = 'Bad HTTP status: ' + req.status + ' ' + req.statusText\n console.error(error)\n },\n get_device_id: (uuid) => uuid,\n // Used for internal testing\n _onCapture: __NOOP,\n capture_performance: undefined,\n name: 'posthog',\n callback_fn: 'posthog._jsc',\n bootstrap: {},\n disable_compression: false,\n session_idle_timeout_seconds: 30 * 60, // 30 minutes\n})\n\n/**\n * create_phlib(token:string, config:object, name:string)\n *\n * This function is used by the init method of PostHogLib objects\n * as well as the main initializer at the end of the JSLib (that\n * initializes document.posthog as well as any additional instances\n * declared before this file has loaded).\n */\nconst create_phlib = function (\n token: string,\n config?: Partial<PostHogConfig>,\n name?: string,\n createComplete?: (instance: PostHog) => void\n): PostHog {\n let instance: PostHog\n const target =\n name === PRIMARY_INSTANCE_NAME || !posthog_master ? posthog_master : name ? posthog_master[name] : undefined\n const callbacksHandled = {\n initComplete: false,\n syncCode: false,\n }\n const handleCallback = (callbackName: keyof typeof callbacksHandled) => (instance: PostHog) => {\n if (!callbacksHandled[callbackName]) {\n callbacksHandled[callbackName] = true\n if (callbacksHandled.initComplete && callbacksHandled.syncCode) {\n createComplete?.(instance)\n }\n }\n }\n\n if (target && init_type === InitType.INIT_MODULE) {\n instance = target as any\n } else {\n if (target && !_isArray(target)) {\n console.error('You have already initialized ' + name)\n // TODO: throw something instead?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return\n }\n instance = new PostHog()\n }\n\n instance._init(token, config, name, handleCallback('initComplete'))\n instance.toolbar.maybeLoadToolbar()\n\n instance.sessionRecording = new SessionRecording(instance)\n instance.sessionRecording.startRecordingIfEnabled()\n\n instance.webPerformance = new WebPerformanceObserver(instance)\n instance.webPerformance.startObservingIfEnabled()\n\n if (instance.get_config('__preview_measure_pageview_stats')) {\n instance.pageViewManager.startMeasuringScrollPosition()\n }\n\n instance.exceptionAutocapture = new ExceptionObserver(instance)\n\n instance.__autocapture = instance.get_config('autocapture')\n autocapture._setIsAutocaptureEnabled(instance)\n if (autocapture._isAutocaptureEnabled) {\n instance.__autocapture = instance.get_config('autocapture')\n const num_buckets = 100\n const num_enabled_buckets = 100\n if (!autocapture.enabledForProject(instance.get_config('token'), num_buckets, num_enabled_buckets)) {\n instance.__autocapture = false\n logger.log('Not in active bucket: disabling Automatic Event Collection.')\n } else if (!autocapture.isBrowserSupported()) {\n instance.__autocapture = false\n logger.log('Disabling Automatic Event Collection because this browser is not supported')\n } else {\n autocapture.init(instance)\n }\n }\n\n // if any instance on the page has debug = true, we set the\n // global debug to be true\n Config.DEBUG = Config.DEBUG || instance.get_config('debug')\n\n // if target is not defined, we called init after the lib already\n // loaded, so there won't be an array of things to execute\n if (typeof target !== 'undefined' && _isArray(target)) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance.people, (target as any).people)\n instance._execute_array(target)\n }\n\n handleCallback('syncCode')(instance)\n return instance\n}\n\n/**\n * PostHog Library Object\n * @constructor\n */\nexport class PostHog {\n __loaded: boolean\n __loaded_recorder_version: 'v1' | 'v2' | undefined // flag that keeps track of which version of recorder is loaded\n config: PostHogConfig\n\n rateLimiter: RateLimiter\n pageViewManager: PageViewManager\n featureFlags: PostHogFeatureFlags\n surveys: PostHogSurveys\n toolbar: Toolbar\n\n // These are instance-specific state created after initialisation\n persistence?: PostHogPersistence\n sessionPersistence?: PostHogPersistence\n sessionManager?: SessionIdManager\n\n _requestQueue?: RequestQueue\n _retryQueue?: RetryQueue\n sessionRecording?: SessionRecording\n webPerformance?: WebPerformanceObserver\n exceptionAutocapture?: ExceptionObserver\n\n _triggered_notifs: any\n compression: Partial<Record<Compression, boolean>>\n _jsc: JSC\n __captureHooks: ((eventName: string) => void)[]\n __request_queue: [url: string, data: Record<string, any>, options: XHROptions, callback?: RequestCallback][]\n __autocapture: boolean | AutocaptureConfig | undefined\n decideEndpointWasHit: boolean\n\n SentryIntegration: typeof SentryIntegration\n segmentIntegration: () => any\n\n /** DEPRECATED: We keep this to support existing usage but now one should just call .setPersonProperties */\n people: {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n }\n\n constructor() {\n this.config = defaultConfig()\n this.compression = {}\n this.decideEndpointWasHit = false\n this.SentryIntegration = SentryIntegration\n this.segmentIntegration = () => createSegmentIntegration(this)\n this.__captureHooks = []\n this.__request_queue = []\n this.__loaded = false\n this.__loaded_recorder_version = undefined\n this.__autocapture = undefined\n this._jsc = function () {} as JSC\n\n this.featureFlags = new PostHogFeatureFlags(this)\n this.toolbar = new Toolbar(this)\n this.pageViewManager = new PageViewManager()\n this.surveys = new PostHogSurveys(this)\n this.rateLimiter = new RateLimiter()\n\n // NOTE: See the property definition for deprecation notice\n this.people = {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = typeof prop === 'string' ? { [prop]: to } : prop\n this.setPersonProperties(setProps)\n callback?.({})\n },\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = typeof prop === 'string' ? { [prop]: to } : prop\n this.setPersonProperties(undefined, setProps)\n callback?.({})\n },\n }\n }\n\n // Initialization methods\n\n /**\n * This function initializes a new instance of the PostHog capturing object.\n * All new instances are added to the main posthog object as sub properties (such as\n * posthog.library_name) and also returned by this function. To define a\n * second instance on the page, you would call:\n *\n * posthog.init('new token', { your: 'config' }, 'library_name');\n *\n * and use it like so:\n *\n * posthog.library_name.capture(...);\n *\n * @param {String} token Your PostHog API token\n * @param {Object} [config] A dictionary of config options to override. <a href=\"https://github.com/posthog/posthog-js/blob/6e0e873/src/posthog-core.js#L57-L91\">See a list of default config options</a>.\n * @param {String} [name] The name for the new posthog instance that you want created\n */\n init(token: string, config?: Partial<PostHogConfig>, name?: string): PostHog | void {\n if (_isUndefined(name)) {\n console.error('You must name your new library: init(token, config, name)')\n return\n }\n if (name === PRIMARY_INSTANCE_NAME) {\n console.error('You must initialize the main posthog object right after you include the PostHog js snippet')\n return\n }\n\n const instance: PostHog = create_phlib(token, config, name, (instance: PostHog) => {\n posthog_master[name] = instance\n instance._loaded()\n })\n posthog_master[name] = instance\n\n return instance\n }\n\n // posthog._init(token:string, config:object, name:string)\n //\n // This function sets up the current instance of the posthog\n // library. The difference between this method and the init(...)\n // method is this one initializes the actual instance, whereas the\n // init(...) method sets up a new library and calls _init on it.\n //\n // Note that there are operations that can be asynchronous, so we\n // accept a callback that is called when all the asynchronous work\n // is done. Note that we do not use promises because we want to be\n // IE11 compatible. We could use polyfills, which would make the\n // code a bit cleaner, but will add some overhead.\n //\n _init(\n token: string,\n config: Partial<PostHogConfig> = {},\n name?: string,\n initComplete?: (instance: PostHog) => void\n ): void {\n this.__loaded = true\n this.config = {} as PostHogConfig // will be set right below\n this._triggered_notifs = []\n\n // To avoid using Promises and their helper functions, we instead keep\n // track of which callbacks have been called, and then call initComplete\n // when all of them have been called. To add additional async code, add\n // to `callbacksHandled` and pass updateInitComplete as a callback to\n // the async code.\n const callbacksHandled = { segmentRegister: false, syncCode: false }\n const updateInitComplete = (callbackName: keyof typeof callbacksHandled) => () => {\n // Update the register of callbacks that have been called, and if\n // they have all been called, then we are ready to call\n // initComplete.\n if (!callbacksHandled[callbackName]) {\n callbacksHandled[callbackName] = true\n if (callbacksHandled.segmentRegister && callbacksHandled.syncCode) {\n initComplete?.(this)\n }\n }\n }\n\n this.set_config(\n _extend({}, defaultConfig(), config, {\n name: name,\n token: token,\n callback_fn: (name === PRIMARY_INSTANCE_NAME ? name : PRIMARY_INSTANCE_NAME + '.' + name) + '._jsc',\n })\n )\n\n this._jsc = function () {} as JSC\n\n // Check if recorder.js is already loaded\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (window?.rrweb?.record || window?.rrwebRecord) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.__loaded_recorder_version = window?.rrweb?.version\n }\n\n this.persistence = new PostHogPersistence(this.config)\n\n this._requestQueue = new RequestQueue(this._handle_queued_event.bind(this))\n this._retryQueue = new RetryQueue(this.get_config('on_xhr_error'), this.rateLimiter)\n this.__captureHooks = []\n this.__request_queue = []\n\n this.sessionManager = new SessionIdManager(this.config, this.persistence)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage'\n ? this.persistence\n : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' })\n\n this._gdpr_init()\n\n if (config.segment) {\n // Use segments anonymousId instead\n this.config.get_device_id = () => config.segment.user().anonymousId()\n\n // If a segment user ID exists, set it as the distinct_id\n if (config.segment.user().id()) {\n this.register({\n distinct_id: config.segment.user().id(),\n })\n this.persistence.set_user_state('identified')\n }\n\n config.segment.register(this.segmentIntegration()).then(updateInitComplete('segmentRegister'))\n } else {\n updateInitComplete('segmentRegister')()\n }\n\n if (config.bootstrap?.distinctID !== undefined) {\n const uuid = this.get_config('get_device_id')(uuidv7())\n const deviceID = config.bootstrap?.isIdentifiedID ? uuid : config.bootstrap.distinctID\n this.persistence.set_user_state(config.bootstrap?.isIdentifiedID ? 'identified' : 'anonymous')\n this.register({\n distinct_id: config.bootstrap.distinctID,\n $device_id: deviceID,\n })\n }\n\n if (this._hasBootstrappedFeatureFlags()) {\n const activeFlags = Object.keys(config.bootstrap?.featureFlags || {})\n .filter((flag) => !!config.bootstrap?.featureFlags?.[flag])\n .reduce(\n (res: Record<string, string | boolean>, key) => (\n (res[key] = config.bootstrap?.featureFlags?.[key] || false), res\n ),\n {}\n )\n const featureFlagPayloads = Object.keys(config.bootstrap?.featureFlagPayloads || {})\n .filter((key) => activeFlags[key])\n .reduce((res: Record<string, JsonType>, key) => {\n if (config.bootstrap?.featureFlagPayloads?.[key]) {\n res[key] = config.bootstrap?.featureFlagPayloads?.[key]\n }\n return res\n }, {})\n\n this.featureFlags.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n }\n\n if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persitence\n const uuid = this.get_config('get_device_id')(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: uuid,\n },\n ''\n )\n // distinct id == $device_id is a proxy for anonymous user\n this.persistence.set_user_state('anonymous')\n }\n // Set up event handler for pageleave\n // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n window.addEventListener &&\n window.addEventListener('onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this))\n\n // Make sure that we also call the initComplete callback at the end of\n // the synchronous code as well.\n updateInitComplete('syncCode')()\n }\n\n // Private methods\n\n _loaded(): void {\n // Pause `reloadFeatureFlags` calls in config.loaded callback.\n // These feature flags are loaded in the decide call made right\n // afterwards\n const disableDecide = this.get_config('advanced_disable_decide')\n if (!disableDecide) {\n this.featureFlags.setReloadingPaused(true)\n }\n\n try {\n this.get_config('loaded')(this)\n } catch (err) {\n console.error('`loaded` function failed', err)\n }\n\n this._start_queue_if_opted_in()\n\n // this happens after so a user can call identify in\n // the loaded callback\n if (this.get_config('capture_pageview')) {\n this.capture('$pageview', { title: document.title }, { send_instantly: true })\n }\n\n // Call decide to get what features are enabled and other settings.\n // As a reminder, if the /decide endpoint is disabled, feature flags, toolbar, session recording, autocapture,\n // and compression will not be available.\n if (!disableDecide) {\n new Decide(this).call()\n }\n }\n\n _start_queue_if_opted_in(): void {\n if (!this.has_opted_out_capturing()) {\n if (this.get_config('request_batching')) {\n this._requestQueue?.poll()\n }\n }\n }\n\n _dom_loaded(): void {\n if (!this.has_opted_out_capturing()) {\n _eachArray(this.__request_queue, (item) => {\n this._send_request(...item)\n })\n }\n\n this.__request_queue = []\n\n this._start_queue_if_opted_in()\n }\n\n /**\n * _prepare_callback() should be called by callers of _send_request for use\n * as the callback argument.\n *\n * If there is no callback, this returns null.\n * If we are going to make XHR/XDR requests, this returns a function.\n * If we are going to use script tags, this returns a string to use as the\n * callback GET param.\n */\n // TODO: get rid of the \"| string\"\n _prepare_callback(callback?: RequestCallback, data?: Properties): RequestCallback | null | string {\n if (_isUndefined(callback)) {\n return null\n }\n\n if (USE_XHR) {\n return function (response) {\n callback(response, data)\n }\n } else {\n // if the user gives us a callback, we store as a random\n // property on this instances jsc function and update our\n // callback string to reflect that.\n const jsc = this._jsc\n const randomized_cb = '' + Math.floor(Math.random() * 100000000)\n const callback_string = this.get_config('callback_fn') + '[' + randomized_cb + ']'\n jsc[randomized_cb] = function (response: any) {\n delete jsc[randomized_cb]\n callback(response, data)\n }\n return callback_string\n }\n }\n\n _handle_unload(): void {\n if (!this.get_config('request_batching')) {\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave', null, { transport: 'sendBeacon' })\n }\n return\n }\n\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave')\n }\n\n this._requestQueue?.unload()\n this._retryQueue?.unload()\n }\n\n _handle_queued_event(url: string, data: Record<string, any>, options?: XHROptions): void {\n const jsonData = JSON.stringify(data)\n this.__compress_and_send_json_request(url, jsonData, options || __NOOPTIONS, __NOOP)\n }\n\n __compress_and_send_json_request(\n url: string,\n jsonData: string,\n options: XHROptions,\n callback?: RequestCallback\n ): void {\n const [data, _options] = compressData(decideCompression(this.compression), jsonData, options)\n this._send_request(url, data, _options, callback)\n }\n\n _send_request(url: string, data: Record<string, any>, options: CaptureOptions, callback?: RequestCallback): void {\n if (!this.__loaded || !this._retryQueue) {\n return\n }\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n if (this.get_config('debug')) {\n console.warn('[PostHog SendRequest] is quota limited. Dropping request.')\n }\n return\n }\n\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push([url, data, options, callback])\n return\n }\n\n const DEFAULT_OPTIONS = {\n method: this.get_config('api_method'),\n transport: this.get_config('api_transport'),\n verbose: this.get_config('verbose'),\n }\n\n options = _extend(DEFAULT_OPTIONS, options || {})\n if (!USE_XHR) {\n options.method = 'GET'\n }\n\n const useSendBeacon = 'sendBeacon' in window.navigator && options.transport === 'sendBeacon'\n url = addParamsToURL(url, options.urlQueryArgs || {}, {\n ip: this.get_config('ip'),\n })\n\n if (useSendBeacon) {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n try {\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n } else if (USE_XHR) {\n try {\n xhr({\n url: url,\n data: data,\n headers: this.get_config('xhr_headers'),\n options: options,\n callback,\n retriesPerformedSoFar: 0,\n retryQueue: this._retryQueue,\n onXHRError: this.get_config('on_xhr_error'),\n onRateLimited: this.rateLimiter.on429Response,\n })\n } catch (e) {\n console.error(e)\n }\n } else {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.async = true\n script.defer = true\n script.src = url\n const s = document.getElementsByTagName('script')[0]\n s.parentNode?.insertBefore(script, s)\n }\n }\n\n /**\n * _execute_array() deals with processing any posthog function\n * calls that were called before the PostHog library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the posthog function calls && user defined\n * functions BEFORE we fire off posthog capturing calls. This is so\n * identify/register/set_config calls can properly modify early\n * capturing calls.\n *\n * @param {Array} array\n */\n _execute_array(array: SnippetArrayItem[]): void {\n let fn_name\n const alias_calls: SnippetArrayItem[] = []\n const other_calls: SnippetArrayItem[] = []\n const capturing_calls: SnippetArrayItem[] = []\n _eachArray(array, (item) => {\n if (item) {\n fn_name = item[0]\n if (_isArray(fn_name)) {\n capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n } else if (typeof item === 'function') {\n ;(item as any).call(this)\n } else if (_isArray(item) && fn_name === 'alias') {\n alias_calls.push(item)\n } else if (\n _isArray(item) &&\n fn_name.indexOf('capture') !== -1 &&\n typeof (this as any)[fn_name] === 'function'\n ) {\n capturing_calls.push(item)\n } else {\n other_calls.push(item)\n }\n }\n })\n\n const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n _eachArray(\n calls,\n function (item) {\n if (_isArray(item[0])) {\n // chained call\n let caller = thisArg\n _each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1))\n })\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[item[0]].apply(this, item.slice(1))\n }\n },\n thisArg\n )\n }\n\n execute(alias_calls, this)\n execute(other_calls, this)\n execute(capturing_calls, this)\n }\n\n _hasBootstrappedFeatureFlags(): boolean {\n return (\n (this.config.bootstrap?.featureFlags && Object.keys(this.config.bootstrap?.featureFlags).length > 0) ||\n false\n )\n }\n\n /**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * ### Usage:\n * posthog.push(['register', { a: 'b' }]);\n *\n * @param {Array} item A [function_name, args...] array to be executed\n */\n push(item: SnippetArrayItem): void {\n this._execute_array([item])\n }\n\n /*\n * PostHog supports exception autocapture, however, this function\n * is used to manually capture an exception\n * and can be used to add more context to that exception\n *\n * Properties passed as the second option will be merged with the properties\n * of the exception event.\n * Where there is a key in both generated exception and passed properties,\n * the generated exception property takes precedence.\n */\n captureException(exception: Error, properties?: Properties): void {\n this.exceptionAutocapture?.captureException(\n [exception.name, undefined, undefined, undefined, exception],\n properties\n )\n }\n\n /**\n * Capture an event. This is the most important and\n * frequently used PostHog function.\n *\n * ### Usage:\n *\n * // capture an event named 'Registered'\n * posthog.capture('Registered', {'Gender': 'Male', 'Age': 21});\n *\n * // capture an event using navigator.sendBeacon\n * posthog.capture('Left page', {'duration_seconds': 35}, {transport: 'sendBeacon'});\n *\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Object} [options] Optional configuration for this capture request.\n * @param {String} [options.transport] Transport method for network request ('XHR' or 'sendBeacon').\n * @param {Date} [options.timestamp] Timestamp is a Date object. If not set, it'll automatically be set to the current time.\n */\n capture(\n event_name: string,\n properties?: Properties | null,\n options: CaptureOptions = __NOOPTIONS\n ): CaptureResult | void {\n // While developing, a developer might purposefully _not_ call init(),\n // in this case, we would like capture to be a noop.\n if (!this.__loaded || !this.sessionPersistence || !this._requestQueue) {\n return logger.unintializedWarning('posthog.capture')\n }\n\n if (userOptedOut(this, false)) {\n return\n }\n\n options = options || __NOOPTIONS\n const transport = options['transport'] // external API, don't minify 'transport' prop\n if (transport) {\n options.transport = transport // 'transport' prop name can be minified internally\n }\n\n // typing doesn't prevent interesting data\n if (_isUndefined(event_name) || typeof event_name !== 'string') {\n console.error('No event name provided to posthog.capture')\n return\n }\n\n if (_isBlockedUA(userAgent, this.get_config('custom_blocked_useragents'))) {\n return\n }\n\n // update persistence\n this.sessionPersistence.update_search_keyword()\n\n if (this.get_config('store_google')) {\n this.sessionPersistence.update_campaign_params()\n }\n if (this.get_config('save_referrer')) {\n this.sessionPersistence.update_referrer_info()\n }\n\n let data: CaptureResult = {\n uuid: uuidv7(),\n event: event_name,\n properties: this._calculate_event_properties(event_name, properties || {}),\n }\n\n if (event_name === '$identify') {\n data['$set'] = options['$set']\n data['$set_once'] = options['$set_once']\n }\n\n data = _copyAndTruncateStrings(\n data,\n options._noTruncate ? null : this.get_config('properties_string_max_length')\n )\n data.timestamp = options.timestamp || new Date()\n\n if (this.get_config('debug')) {\n logger.log('PostHog.js send', data)\n }\n const jsonData = JSON.stringify(data)\n\n const url = this.get_config('api_host') + (options.endpoint || '/e/')\n\n const has_unique_traits = options !== __NOOPTIONS\n\n if (\n this.get_config('request_batching') &&\n (!has_unique_traits || options._batchKey) &&\n !options.send_instantly\n ) {\n this._requestQueue.enqueue(url, data, options)\n } else {\n this.__compress_and_send_json_request(url, jsonData, options)\n }\n\n this._invokeCaptureHooks(event_name, data)\n\n return data\n }\n\n _addCaptureHook(callback: (eventName: string) => void): void {\n this.__captureHooks.push(callback)\n }\n\n _invokeCaptureHooks(eventName: string, eventData: CaptureResult): void {\n this.config._onCapture(eventName, eventData)\n _each(this.__captureHooks, (callback) => callback(eventName))\n }\n\n _calculate_event_properties(event_name: string, event_properties: Properties): Properties {\n if (!this.persistence || !this.sessionPersistence) {\n return event_properties\n }\n\n // set defaults\n const start_timestamp = this.persistence.remove_event_timer(event_name)\n let properties = { ...event_properties }\n properties['token'] = this.get_config('token')\n\n if (event_name === '$snapshot') {\n const persistenceProps = { ...this.persistence.properties(), ...this.sessionPersistence.properties() }\n properties['distinct_id'] = persistenceProps.distinct_id\n return properties\n }\n\n const infoProperties = _info.properties()\n\n if (this.sessionManager) {\n const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId()\n properties['$session_id'] = sessionId\n properties['$window_id'] = windowId\n }\n\n if (this.get_config('__preview_measure_pageview_stats')) {\n let performanceProperties: Record<string, any> = {}\n if (event_name === '$pageview') {\n performanceProperties = this.pageViewManager.doPageView()\n } else if (event_name === '$pageleave') {\n performanceProperties = this.pageViewManager.doPageLeave()\n }\n properties = _extend(properties, performanceProperties)\n }\n\n if (event_name === '$pageview') {\n properties['title'] = document.title\n }\n\n if (event_name === '$performance_event') {\n const persistenceProps = this.persistence.properties()\n // Early exit for $performance_event as we only need session and $current_url\n properties['distinct_id'] = persistenceProps.distinct_id\n properties['$current_url'] = infoProperties.$current_url\n return properties\n }\n\n // set $duration if time_event was previously called for this event\n if (typeof start_timestamp !== 'undefined') {\n const duration_in_ms = new Date().getTime() - start_timestamp\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n }\n\n // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n\n // update properties with pageview info and super-properties\n properties = _extend(\n {},\n _info.properties(),\n this.persistence.properties(),\n this.sessionPersistence.properties(),\n properties\n )\n\n const property_blacklist = this.get_config('property_blacklist')\n if (_isArray(property_blacklist)) {\n _each(property_blacklist, function (blacklisted_prop) {\n delete properties[blacklisted_prop]\n })\n } else {\n console.error('Invalid value for property_blacklist config: ' + property_blacklist)\n }\n\n const sanitize_properties = this.get_config('sanitize_properties')\n if (sanitize_properties) {\n properties = sanitize_properties(properties, event_name)\n }\n\n return properties\n }\n\n /**\n * Register a set of super properties, which are included with all\n * events. This will overwrite previous super property values, except\n * for session properties (see `register_for_session(properties)`).\n *\n * ### Usage:\n *\n * // register 'Gender' as a super property\n * posthog.register({'Gender': 'Female'});\n *\n * // register several super properties when a user signs up\n * posthog.register({\n * 'Email': 'jdoe@example.com',\n * 'Account Type': 'Free'\n * });\n *\n * // Display the properties\n * console.log(posthog.persistence.properties())\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n register(properties: Properties, days?: number): void {\n this.persistence?.register(properties, days)\n }\n\n /**\n * Register a set of super properties only once. These will not\n * overwrite previous super property values, unlike register().\n *\n * ### Usage:\n *\n * // register a super property for the first time only\n * posthog.register_once({\n * 'First Login Date': new Date().toISOString()\n * });\n *\n * // Display the properties\n * console.log(posthog.persistence.properties())\n *\n * ### Notes:\n *\n * If default_value is specified, current super properties\n * with that value will be overwritten.\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n register_once(properties: Properties, default_value?: Property, days?: number): void {\n this.persistence?.register_once(properties, default_value, days)\n }\n\n /**\n * Register a set of super properties, which are included with all events, but only\n * for THIS SESSION. These will overwrite all other super property values.\n *\n * Unlike regular super properties, which last in LocalStorage for a long time,\n * session super properties get cleared after a session ends.\n *\n * ### Usage:\n *\n * // register on all events this session\n * posthog.register_for_session({'referer': customGetReferer()});\n *\n * // register several session super properties when a user signs up\n * posthog.register_for_session({\n * 'selectedPlan': 'pro',\n * 'completedSteps': 4,\n * });\n *\n * // Display the properties\n * console.log(posthog.sessionPersistence.properties())\n *\n * @param {Object} properties An associative array of properties to store about the user\n */\n register_for_session(properties: Properties): void {\n this.sessionPersistence?.register(properties)\n }\n\n /**\n * Delete a super property stored with the current user.\n *\n * @param {String} property The name of the super property to remove\n */\n unregister(property: string): void {\n this.persistence?.unregister(property)\n }\n\n /**\n * Delete a session super property stored with the current user.\n *\n * @param {String} property The name of the session super property to remove\n */\n unregister_for_session(property: string): void {\n this.sessionPersistence?.unregister(property)\n }\n\n _register_single(prop: string, value: Property) {\n this.register({ [prop]: value })\n }\n\n /*\n * Get feature flag value for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options?: { send_event?: boolean }): boolean | string | undefined {\n return this.featureFlags.getFeatureFlag(key, options)\n }\n\n /*\n * Get feature flag payload value matching key for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') {\n * const someValue = posthog.getFeatureFlagPayload('beta-feature')\n * // do something\n * }\n *\n * @param {Object|String} prop Key of the feature flag.\n */\n getFeatureFlagPayload(key: string): JsonType {\n const payload = this.featureFlags.getFeatureFlagPayload(key)\n try {\n return JSON.parse(payload as any)\n } catch {\n return payload\n }\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options?: isFeatureEnabledOptions): boolean | undefined {\n return this.featureFlags.isFeatureEnabled(key, options)\n }\n\n reloadFeatureFlags(): void {\n this.featureFlags.reloadFeatureFlags()\n }\n\n /** Opt the user in or out of an early access feature. */\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n this.featureFlags.updateEarlyAccessFeatureEnrollment(key, isEnrolled)\n }\n\n /** Get the list of early access features. To check enrollment status, use `isFeatureEnabled`. */\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n return this.featureFlags.getEarlyAccessFeatures(callback, force_reload)\n }\n\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: (flags: string[], variants: Record<string, string | boolean>) => void): () => void {\n return this.featureFlags.onFeatureFlags(callback)\n }\n\n /*\n * Register an event listener that runs whenever the session id or window id change.\n * If there is already a session id, the listener is called immediately in addition to being called on future changes.\n *\n * Can be used, for example, to sync the PostHog session id with a backend session.\n *\n * ### Usage:\n *\n * posthog.onSessionId(function(sessionId, windowId) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once a session id is present or when it or the window id are updated.\n * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by useEffect when the component unmounts.\n */\n onSessionId(callback: SessionIdChangedCallback): () => void {\n return this.sessionManager?.onSessionId(callback) ?? (() => {})\n }\n\n /** Get list of all surveys. */\n getSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getSurveys(callback, forceReload)\n }\n\n /** Get surveys that should be enabled for the current user. */\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getActiveMatchingSurveys(callback, forceReload)\n }\n\n /**\n * Identify a user with a unique ID instead of a PostHog\n * randomly generated distinct_id. If the method is never called,\n * then unique visitors will be identified by a UUID that is generated\n * the first time they visit the site.\n *\n * If user properties are passed, they are also sent to posthog.\n *\n * ### Usage:\n *\n * posthog.identify('[user unique id]')\n * posthog.identify('[user unique id]', { email: 'john@example.com' })\n * posthog.identify('[user unique id]', {}, { referral_code: '12345' })\n *\n * ### Notes:\n *\n * You can call this function to overwrite a previously set\n * unique ID for the current user.\n *\n * If the user has been identified ($user_state in persistence is set to 'identified'),\n * then capture of $identify is skipped to avoid merging users. For example,\n * if your system allows an admin user to impersonate another user.\n *\n * Then a single browser instance can have:\n *\n * `identify('a') -> capture(1) -> identify('b') -> capture(2)`\n *\n * and capture 1 and capture 2 will have the correct distinct_id.\n * but users a and b will NOT be merged in posthog.\n *\n * However, if reset is called then:\n *\n * `identify('a') -> capture(1) -> reset() -> capture(2) -> identify('b') -> capture(3)`\n *\n * users a and b are not merged.\n * Capture 1 is associated with user a.\n * A new distinct id is generated for capture 2.\n * which is merged with user b.\n * So, capture 2 and 3 are associated with user b.\n *\n * If you want to merge two identified users, you can call posthog.alias\n *\n * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!this.__loaded || !this.persistence) {\n return logger.unintializedWarning('posthog.identify')\n }\n //if the new_distinct_id has not been set ignore the identify event\n if (!new_distinct_id) {\n console.error('Unique user id has not been set in posthog.identify')\n return\n }\n\n const previous_distinct_id = this.get_distinct_id()\n this.register({ $user_id: new_distinct_id })\n\n if (!this.get_property('$device_id')) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n const device_id = previous_distinct_id\n this.register_once(\n {\n $had_persisted_distinct_id: true,\n $device_id: device_id,\n },\n ''\n )\n }\n\n // if the previous distinct id had an alias stored, then we clear it\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY)\n this.register({ distinct_id: new_distinct_id })\n }\n\n const isKnownAnonymous = this.persistence.get_user_state() === 'anonymous'\n\n // send an $identify event any time the distinct_id is changing and the old ID is an anoymous ID\n // - logic on the server will determine whether or not to do anything with it.\n if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n this.persistence.set_user_state('identified')\n\n // Update current user properties\n this.setPersonPropertiesForFlags(userPropertiesToSet || {}, false)\n\n this.capture(\n '$identify',\n {\n distinct_id: new_distinct_id,\n $anon_distinct_id: previous_distinct_id,\n },\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n )\n // let the reload feature flag request know to send this previous distinct id\n // for flag consistency\n this.featureFlags.setAnonymousDistinctId(previous_distinct_id)\n } else if (userPropertiesToSet || userPropertiesToSetOnce) {\n // If the distinct_id is not changing, but we have user properties to set, we can go for a $set event\n this.setPersonProperties(userPropertiesToSet, userPropertiesToSetOnce)\n }\n\n // Reload active feature flags if the user identity changes.\n // Note we don't reload this on property changes as these get processed async\n if (new_distinct_id !== previous_distinct_id) {\n this.reloadFeatureFlags()\n // also clear any stored flag calls\n this.unregister(FLAG_CALL_REPORTED)\n }\n }\n\n /**\n * Sets properties for the Person associated with the current distinct_id.\n *\n *\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n setPersonProperties(userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!userPropertiesToSet && !userPropertiesToSetOnce) {\n return\n }\n\n // Update current user properties\n this.setPersonPropertiesForFlags(userPropertiesToSet || {})\n\n this.capture('$set', { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} })\n }\n\n /**\n * Alpha feature: don't use unless you know what you're doing!\n *\n * Sets group analytics information for subsequent events and reloads feature flags.\n *\n * @param {String} groupType Group type (example: 'organization')\n * @param {String} groupKey Group key (example: 'org::5')\n * @param {Object} groupPropertiesToSet Optional properties to set for group\n */\n group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n if (!groupType || !groupKey) {\n console.error('posthog.group requires a group type and group key')\n return\n }\n\n const existingGroups = this.getGroups()\n\n // if group key changes, remove stored group properties\n if (existingGroups[groupType] !== groupKey) {\n this.resetGroupPropertiesForFlags(groupType)\n }\n\n this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n if (groupPropertiesToSet) {\n this.capture('$groupidentify', {\n $group_type: groupType,\n $group_key: groupKey,\n $group_set: groupPropertiesToSet,\n })\n this.setGroupPropertiesForFlags({ [groupType]: groupPropertiesToSet })\n }\n\n // If groups change and no properties change, reload feature flags.\n // The property change reload case is handled in setGroupPropertiesForFlags.\n if (existingGroups[groupType] !== groupKey && !groupPropertiesToSet) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Resets only the group properties of the user currently logged in.\n */\n resetGroups(): void {\n this.register({ $groups: {} })\n this.resetGroupPropertiesForFlags()\n\n // If groups changed, reload feature flags.\n this.reloadFeatureFlags()\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n this.featureFlags.setPersonPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n resetPersonPropertiesForFlags(): void {\n this.featureFlags.resetPersonPropertiesForFlags()\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n this.featureFlags.setGroupPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n this.featureFlags.resetGroupPropertiesForFlags(group_type)\n }\n\n /**\n * Clears super properties and generates a new random distinct_id for this instance.\n * Useful for clearing data when a user logs out.\n */\n reset(reset_device_id?: boolean): void {\n if (!this.__loaded) {\n return logger.unintializedWarning('posthog.reset')\n }\n const device_id = this.get_property('$device_id')\n this.persistence?.clear()\n this.sessionPersistence?.clear()\n this.persistence?.set_user_state('anonymous')\n this.sessionManager?.resetSessionId()\n const uuid = this.get_config('get_device_id')(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: reset_device_id ? uuid : device_id,\n },\n ''\n )\n }\n\n /**\n * Returns the current distinct id of the user. This is either the id automatically\n * generated by the library or the id that has been passed by a call to identify().\n *\n * ### Notes:\n *\n * get_distinct_id() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // set distinct_id after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * distinct_id = posthog.get_distinct_id();\n * }\n * });\n */\n get_distinct_id(): string {\n return this.get_property('distinct_id')\n }\n\n getGroups(): Record<string, any> {\n return this.get_property('$groups') || {}\n }\n\n /**\n * Returns the current session_id.\n *\n * NOTE: This should only be used for informative purposes.\n * Any actual internal use case for the session_id should be handled by the sessionManager.\n */\n\n get_session_id(): string {\n return this.sessionManager?.checkAndGetSessionAndWindowId(true).sessionId ?? ''\n }\n\n /**\n * Returns the Replay url for the current session.\n *\n * @param options Options for the url\n * @param options.withTimestamp Whether to include the timestamp in the url (defaults to false)\n * @param options.timestampLookBack How many seconds to look back for the timestamp (defaults to 10)\n */\n get_session_replay_url(options?: { withTimestamp?: boolean; timestampLookBack?: number }): string {\n if (!this.sessionManager) {\n return ''\n }\n const host = this.config.ui_host || this.config.api_host\n const { sessionId, sessionStartTimestamp } = this.sessionManager.checkAndGetSessionAndWindowId(true)\n let url = host + '/replay/' + sessionId\n if (options?.withTimestamp && sessionStartTimestamp) {\n const LOOK_BACK = options.timestampLookBack ?? 10\n if (!sessionStartTimestamp) {\n return url\n }\n const recordingStartTime = Math.max(\n Math.floor((new Date().getTime() - sessionStartTimestamp) / 1000) - LOOK_BACK,\n 0\n )\n url += `?t=${recordingStartTime}`\n }\n\n return url\n }\n\n /**\n * Create an alias, which PostHog will use to link two distinct_ids going forward (not retroactively).\n * Multiple aliases can map to the same original ID, but not vice-versa. Aliases can also be chained - the\n * following is a valid scenario:\n *\n * posthog.alias('new_id', 'existing_id');\n * ...\n * posthog.alias('newer_id', 'new_id');\n *\n * If the original ID is not passed in, we will use the current distinct_id - probably the auto-generated GUID.\n *\n * ### Notes:\n *\n * The best practice is to call alias() when a unique ID is first created for a user\n * (e.g., when a user first registers for an account and provides an email address).\n * alias() should never be called more than once for a given user, except to\n * chain a newer ID to a previously new ID, as described above.\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n */\n alias(alias: string, original?: string): CaptureResult | void | number {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n logger.critical('Attempting to create alias for existing People user - aborting.')\n return -2\n }\n\n if (_isUndefined(original)) {\n original = this.get_distinct_id()\n }\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias)\n return this.capture('$create_alias', { alias: alias, distinct_id: original })\n } else {\n console.error('alias matches current distinct_id - skipping api call.')\n this.identify(alias)\n return -1\n }\n }\n\n /**\n * Update the configuration of a posthog library instance.\n *\n * The default config is:\n *\n * {\n * // PostHog API host\n * api_host: 'https://app.posthog.com',\n *\n * // HTTP method for capturing requests\n * api_method: 'POST'\n *\n * // PostHog web app host, currently only used by the Sentry integration.\n * // This will only be different from api_host when using a reverse-proxied API host – in that case\n * // the original web app host needs to be passed here so that links to the web app are still convenient.\n * ui_host: 'https://app.posthog.com',\n *\n * // Automatically capture clicks, form submissions and change events\n * autocapture: true\n *\n * // Capture rage clicks\n * rageclick: true\n *\n * // transport for sending requests ('XHR' or 'sendBeacon')\n * // NB: sendBeacon should only be used for scenarios such as\n * // page unload where a \"best-effort\" attempt to send is\n * // acceptable; the sendBeacon API does not support callbacks\n * // or any way to know the result of the request. PostHog\n * // capturing via sendBeacon will not support any event-\n * // batching or retry mechanisms.\n * api_transport: 'XHR'\n *\n * // super properties cookie expiration (in days)\n * cookie_expiration: 365\n *\n * // super properties span subdomains\n * cross_subdomain_cookie: true\n *\n * // debug mode\n * debug: false\n *\n * // if this is true, the posthog cookie or localStorage entry\n * // will be deleted, and no user persistence will take place\n * disable_persistence: false\n *\n * // if this is true, PostHog will automatically determine\n * // City, Region and Country data using the IP address of\n * //the client\n * ip: true\n *\n * // opt users out of capturing by this PostHog instance by default\n * opt_out_capturing_by_default: false\n *\n * // opt users out of browser data storage by this PostHog instance by default\n * opt_out_persistence_by_default: false\n *\n * // persistence mechanism used by opt-in/opt-out methods - cookie\n * // or localStorage - falls back to cookie if localStorage is unavailable\n * opt_out_capturing_persistence_type: 'localStorage'\n *\n * // customize the name of cookie/localStorage set by opt-in/opt-out methods\n * opt_out_capturing_cookie_prefix: null\n *\n * // type of persistent store for super properties (cookie/\n * // localStorage) if set to 'localStorage', any existing\n * // posthog cookie value with the same persistence_name\n * // will be transferred to localStorage and deleted\n * persistence: 'cookie'\n *\n * // name for super properties persistent store\n * persistence_name: ''\n *\n * // names of properties/superproperties which should never\n * // be sent with capture() calls\n * property_blacklist: []\n *\n * // if this is true, posthog cookies will be marked as\n * // secure, meaning they will only be transmitted over https\n * secure_cookie: false\n *\n * // should we capture a page view on page load\n * capture_pageview: true\n *\n * // if you set upgrade to be true, the library will check for\n * // a cookie from our old js library and import super\n * // properties from it, then the old cookie is deleted\n * // The upgrade config option only works in the initialization,\n * // so make sure you set it when you create the library.\n * upgrade: false\n *\n * // if this is true, session recording is always disabled.\n * disable_session_recording: false,\n *\n * // extra HTTP request headers to set for each API request, in\n * // the format {'Header-Name': value}\n * xhr_headers: {}\n *\n * // protocol for fetching in-app message resources, e.g.\n * // 'https://' or 'http://'; defaults to '//' (which defers to the\n * // current page's protocol)\n * inapp_protocol: '//'\n *\n * // whether to open in-app message link in new tab/window\n * inapp_link_new_window: false\n *\n * // a set of rrweb config options that PostHog users can configure\n * // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n * session_recording: {\n * blockClass: 'ph-no-capture',\n * blockSelector: null,\n * ignoreClass: 'ph-ignore-input',\n * maskAllInputs: true,\n * maskInputOptions: {},\n * maskInputFn: null,\n * slimDOMOptions: {},\n * collectFonts: false\n * }\n *\n * // prevent autocapture from capturing any attribute names on elements\n * mask_all_element_attributes: false\n *\n * // prevent autocapture from capturing textContent on all elements\n * mask_all_text: false\n *\n * // Anonymous users get a random UUID as their device by default.\n * // This option allows overriding that option.\n * get_device_id: (uuid) => uuid\n * }\n *\n *\n * @param {Object} config A dictionary of new configuration values to update\n */\n\n set_config(config: Partial<PostHogConfig>): void {\n const oldConfig = { ...this.config }\n if (_isObject(config)) {\n _extend(this.config, config)\n\n if (!this.get_config('persistence_name')) {\n this.config.persistence_name = this.config.cookie_name\n }\n if (!this.get_config('disable_persistence')) {\n this.config.disable_persistence = this.config.disable_cookie\n }\n\n this.persistence?.update_config(this.config)\n this.sessionPersistence?.update_config(this.config)\n\n if (localStore.is_supported() && localStore.get('ph_debug') === 'true') {\n this.config.debug = true\n }\n if (this.get_config('debug')) {\n Config.DEBUG = true\n }\n\n if (this.sessionRecording && typeof config.disable_session_recording !== 'undefined') {\n if (oldConfig.disable_session_recording !== config.disable_session_recording) {\n if (config.disable_session_recording) {\n this.sessionRecording.stopRecording()\n } else {\n this.sessionRecording.startRecordingIfEnabled()\n }\n }\n }\n }\n }\n\n /**\n * turns session recording on, and updates the config option\n * disable_session_recording to false\n */\n startSessionRecording(): void {\n this.set_config({ disable_session_recording: false })\n }\n\n /**\n * turns session recording off, and updates the config option\n * disable_session_recording to true\n */\n stopSessionRecording(): void {\n this.set_config({ disable_session_recording: true })\n }\n\n /**\n * returns a boolean indicating whether session recording\n * is currently running\n */\n sessionRecordingStarted(): boolean {\n return !!this.sessionRecording?.started()\n }\n\n /**\n * returns a boolean indicating whether the toolbar loaded\n * @param toolbarParams\n */\n\n loadToolbar(params: ToolbarParams): boolean {\n return this.toolbar.loadToolbar(params)\n }\n\n /**\n * returns the current config object for the library.\n */\n get_config<K extends keyof PostHogConfig>(prop_name: K): PostHogConfig[K] {\n return this.config?.[prop_name]\n }\n\n /**\n * Returns the value of the super property named property_name. If no such\n * property is set, get_property() will return the undefined value.\n *\n * ### Notes:\n *\n * get_property() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for '$user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.get_property('$user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the super property you want to retrieve\n */\n get_property(property_name: string): Property | undefined {\n return this.persistence?.['props'][property_name]\n }\n\n /**\n * Returns the value of the session super property named property_name. If no such\n * property is set, getSessionProperty() will return the undefined value.\n *\n * ### Notes:\n *\n * This is based on browser-level `sessionStorage`, NOT the PostHog session.\n * getSessionProperty() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for 'user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.getSessionProperty('user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the session super property you want to retrieve\n */\n getSessionProperty(property_name: string): Property | undefined {\n return this.sessionPersistence?.['props'][property_name]\n }\n\n toString(): string {\n let name = this.get_config('name') ?? PRIMARY_INSTANCE_NAME\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name\n }\n return name\n }\n\n // perform some housekeeping around GDPR opt-in/out state\n _gdpr_init(): void {\n const is_localStorage_requested = this.get_config('opt_out_capturing_persistence_type') === 'localStorage'\n\n // try to convert opt-in/out cookies to localStorage if possible\n if (is_localStorage_requested && localStore.is_supported()) {\n if (!this.has_opted_in_capturing() && this.has_opted_in_capturing({ persistence_type: 'cookie' })) {\n this.opt_in_capturing({ enable_persistence: false })\n }\n if (!this.has_opted_out_capturing() && this.has_opted_out_capturing({ persistence_type: 'cookie' })) {\n this.opt_out_capturing({ clear_persistence: false })\n }\n this.clear_opt_in_out_capturing({\n persistence_type: 'cookie',\n enable_persistence: false,\n })\n }\n\n // check whether the user has already opted out - if so, clear & disable persistence\n if (this.has_opted_out_capturing()) {\n this._gdpr_update_persistence({ clear_persistence: true })\n\n // check whether we should opt out by default\n // note: we don't clear persistence here by default since opt-out default state is often\n // used as an initial state while GDPR information is being collected\n } else if (\n !this.has_opted_in_capturing() &&\n (this.get_config('opt_out_capturing_by_default') || cookieStore.get('ph_optout'))\n ) {\n cookieStore.remove('ph_optout')\n this.opt_out_capturing({\n clear_persistence: this.get_config('opt_out_persistence_by_default'),\n })\n }\n }\n\n /**\n * Enable or disable persistence based on options\n * only enable/disable if persistence is not already in this state\n * @param {boolean} [options.clear_persistence] If true, will delete all data stored by the sdk in persistence and disable it\n * @param {boolean} [options.enable_persistence] If true, will re-enable sdk persistence\n */\n _gdpr_update_persistence(options: Partial<OptInOutCapturingOptions>): void {\n let disabled\n if (options && options['clear_persistence']) {\n disabled = true\n } else if (options && options['enable_persistence']) {\n disabled = false\n } else {\n return\n }\n\n if (!this.get_config('disable_persistence') && this.persistence?.disabled !== disabled) {\n this.persistence?.set_disabled(disabled)\n }\n if (!this.get_config('disable_persistence') && this.sessionPersistence?.disabled !== disabled) {\n this.sessionPersistence?.set_disabled(disabled)\n }\n }\n\n // call a base gdpr function after constructing the appropriate token and options args\n _gdpr_call_func<R = any>(\n func: (token: string, options: GDPROptions) => R,\n options?: Partial<OptInOutCapturingOptions>\n ): R {\n options = _extend(\n {\n capture: this.capture.bind(this),\n persistence_type: this.get_config('opt_out_capturing_persistence_type'),\n cookie_prefix: this.get_config('opt_out_capturing_cookie_prefix'),\n cookie_expiration: this.get_config('cookie_expiration'),\n cross_subdomain_cookie: this.get_config('cross_subdomain_cookie'),\n secure_cookie: this.get_config('secure_cookie'),\n },\n options || {}\n )\n\n // check if localStorage can be used for recording opt out status, fall back to cookie if not\n if (!localStore.is_supported() && options['persistence_type'] === 'localStorage') {\n options['persistence_type'] = 'cookie'\n }\n\n return func(this.get_config('token'), {\n capture: options['capture'],\n captureEventName: options['capture_event_name'],\n captureProperties: options['capture_properties'],\n persistenceType: options['persistence_type'],\n persistencePrefix: options['cookie_prefix'],\n cookieExpiration: options['cookie_expiration'],\n crossSubdomainCookie: options['cross_subdomain_cookie'],\n secureCookie: options['secure_cookie'],\n })\n }\n\n /**\n * Opt the user in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user in\n * posthog.opt_in_capturing();\n *\n * // opt user in with specific event name, properties, cookie configuration\n * posthog.opt_in_capturing({\n * capture_event_name: 'User opted in',\n * capture_event_properties: {\n * 'Email': 'jdoe@example.com'\n * },\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {function} [options.capture] Function used for capturing a PostHog event to record the opt-in action (default is this PostHog instance's capture method)\n * @param {string} [options.capture_event_name=$opt_in] Event name to be used for capturing the opt-in action\n * @param {Object} [options.capture_properties] Set of properties to be captured along with the opt-in action\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_in_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n options = _extend(\n {\n enable_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optIn, options)\n this._gdpr_update_persistence(options)\n }\n\n /**\n * Opt the user out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user out\n * posthog.opt_out_capturing();\n *\n * // opt user out with different cookie configuration from PostHog instance\n * posthog.opt_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.clear_persistence=true] If true, will delete all data stored by the sdk in persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_out_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n const _options = _extend(\n {\n clear_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n /**\n * Check whether the user has opted in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_in = posthog.has_opted_in_capturing();\n * // use has_opted_in value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-in status\n */\n has_opted_in_capturing(options?: Partial<OptInOutCapturingOptions>): boolean {\n return this._gdpr_call_func(hasOptedIn, options)\n }\n\n /**\n * Check whether the user has opted out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_out = posthog.has_opted_out_capturing();\n * // use has_opted_out value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-out status\n */\n has_opted_out_capturing(options?: Partial<OptInOutCapturingOptions>): boolean {\n return this._gdpr_call_func(hasOptedOut, options)\n }\n\n /**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // clear user's opt-in/out status\n * posthog.clear_opt_in_out_capturing();\n *\n * // clear user's opt-in/out status with specific cookie configuration - should match\n * // configuration used when opt_in_capturing/opt_out_capturing methods were called.\n * posthog.clear_opt_in_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n clear_opt_in_out_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n const _options: Partial<OptInOutCapturingOptions> = _extend(\n {\n enable_persistence: true,\n },\n options ?? {}\n )\n this._gdpr_call_func(clearOptInOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n debug(debug?: boolean): void {\n if (debug === false) {\n window.console.log(\"You've disabled debug mode.\")\n localStorage && localStorage.removeItem('ph_debug')\n this.set_config({ debug: false })\n } else {\n window.console.log(\n \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n )\n localStorage && localStorage.setItem('ph_debug', 'true')\n this.set_config({ debug: true })\n }\n }\n}\n\n_safewrap_class(PostHog, ['identify'])\n\nconst instances: Record<string, PostHog> = {}\nconst extend_mp = function () {\n // add all the sub posthog instances\n _each(instances, function (instance, name) {\n if (name !== PRIMARY_INSTANCE_NAME) {\n posthog_master[name] = instance\n }\n })\n}\n\nconst override_ph_init_func = function () {\n // we override the snippets init function to handle the case where a\n // user initializes the posthog library after the script loads & runs\n posthog_master['init'] = function (token?: string, config?: Partial<PostHogConfig>, name?: string) {\n if (name) {\n // initialize a sub library\n if (!posthog_master[name]) {\n posthog_master[name] = instances[name] = create_phlib(\n token || '',\n config || {},\n name,\n (instance: PostHog) => {\n posthog_master[name] = instances[name] = instance\n instance._loaded()\n }\n )\n }\n return posthog_master[name]\n } else {\n let instance: PostHog = posthog_master as any as PostHog\n\n if (instances[PRIMARY_INSTANCE_NAME]) {\n // main posthog lib already initialized\n instance = instances[PRIMARY_INSTANCE_NAME]\n } else if (token) {\n // intialize the main posthog lib\n instance = create_phlib(token, config || {}, PRIMARY_INSTANCE_NAME, (instance: PostHog) => {\n instances[PRIMARY_INSTANCE_NAME] = instance\n instance._loaded()\n })\n instances[PRIMARY_INSTANCE_NAME] = instance\n }\n\n ;(posthog_master as any) = instance\n if (init_type === InitType.INIT_SNIPPET) {\n ;(window as any)[PRIMARY_INSTANCE_NAME] = posthog_master\n }\n extend_mp()\n return instance\n }\n }\n}\n\nconst add_dom_loaded_handler = function () {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if ((dom_loaded_handler as any).done) {\n return\n }\n ;(dom_loaded_handler as any).done = true\n\n ENQUEUE_REQUESTS = false\n\n _each(instances, function (inst: PostHog) {\n inst._dom_loaded()\n })\n }\n\n if (document.addEventListener) {\n if (document.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler()\n } else {\n document.addEventListener('DOMContentLoaded', dom_loaded_handler, false)\n }\n }\n\n // fallback handler, always will work\n _register_event(window, 'load', dom_loaded_handler, true)\n}\n\nexport function init_from_snippet(): void {\n init_type = InitType.INIT_SNIPPET\n if (_isUndefined((window as any).posthog)) {\n ;(window as any).posthog = []\n }\n posthog_master = (window as any).posthog\n\n if (posthog_master['__loaded'] || (posthog_master['config'] && posthog_master['persistence'])) {\n // lib has already been loaded at least once; we don't want to override the global object this time so bomb early\n console.error('PostHog library has already been downloaded at least once.')\n return\n }\n\n // Load instances of the PostHog Library\n _each(posthog_master['_i'], function (item: [token: string, config: Partial<PostHogConfig>, name: string]) {\n if (item && _isArray(item)) {\n instances[item[2]] = create_phlib(...item)\n }\n })\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n\n // Fire loaded events after updating the window's posthog object\n _each(instances, function (instance) {\n instance._loaded()\n })\n\n add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n init_type = InitType.INIT_MODULE\n ;(posthog_master as any) = new PostHog()\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n add_dom_loaded_handler()\n\n return posthog_master as any\n}\n","import { SESSION_RECORDING_BATCH_KEY } from './extensions/sessionrecording'\n\n/**\n * Really a 429 response should have a `Retry-After` header which is either a date string,\n * or the number of seconds to wait before retrying\n *\n * But we can rate limit endpoints differently, so send custom header per endpoint\n * The endpoints are configurable, so we tie the headers/retries to specific batch keys\n *\n * And only support a number of seconds to wait before retrying\n */\nconst supportedRetryHeaders = {\n 'X-PostHog-Retry-After-Recordings': SESSION_RECORDING_BATCH_KEY,\n 'X-PostHog-Retry-After-Events': 'events',\n}\n\nexport class RateLimiter {\n limits: Record<string, number> = {}\n\n isRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.limits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n on429Response(response: XMLHttpRequest): void {\n if (response.status !== 429) {\n return\n }\n\n Object.entries(supportedRetryHeaders).forEach(([header, batchKey]) => {\n const responseHeader = response.getResponseHeader(header)\n if (!responseHeader) {\n return\n }\n\n let retryAfterSeconds = parseInt(responseHeader, 10)\n if (isNaN(retryAfterSeconds)) {\n retryAfterSeconds = 60\n }\n\n if (retryAfterSeconds) {\n const retryAfterMillis = retryAfterSeconds * 1000\n this.limits[batchKey] = new Date().getTime() + retryAfterMillis\n }\n })\n }\n}\n","import { gzipSync, strToU8 } from 'fflate'\nimport { _base64Encode } from './utils'\nimport { Compression, CompressionData, XHROptions } from './types'\n\nexport function decideCompression(compressionSupport: Partial<Record<Compression, boolean>>): Compression {\n if (compressionSupport[Compression.GZipJS]) {\n return Compression.GZipJS\n } else {\n return Compression.Base64\n }\n}\n\nexport function compressData(\n compression: Compression,\n jsonData: string,\n options: XHROptions\n): [CompressionData | Uint8Array, XHROptions] {\n if (compression === Compression.GZipJS) {\n // :TRICKY: This returns an UInt8Array. We don't encode this to a string - returning a blob will do this for us.\n return [\n gzipSync(strToU8(jsonData), { mtime: 0 }),\n { ...options, blob: true, urlQueryArgs: { compression: Compression.GZipJS } },\n ]\n } else {\n return [{ data: _base64Encode(jsonData) }, options]\n }\n}\n"],"names":["NodeType","__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","push","error","__spreadArray","to","from","pack","l","Array","slice","concat","isShadowRoot","_a","host","Boolean","shadowRoot","maskInputValue","maskInputOptions","tagName","type","maskInputFn","text","toLowerCase","repeat","ORIGINAL_ATTRIBUTE_NAME","canvasService","canvasCtx","_id","tagNameRegex","RegExp","IGNORED_NODE","getCssRulesString","rules","cssRules","map","getCssRuleString","join","rule","cssStringified","cssText","isCSSImportRule","styleSheet","URL_IN_CSS_REF","RELATIVE_PATH","DATA_URI","absoluteToStylesheet","href","replace","origin","quote1","path1","quote2","path2","path3","url","filePath","maybeQuote","test","indexOf","split","stack","parts","pop","_i","parts_1","part","EventType","IncrementalSource","MouseInteractions","CanvasContext","MediaInteractions","ReplayerEvents","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","absoluteToDoc","doc","attributeValue","trim","a","createElement","getHref","document","transformAttribute","name","pos","collectCharacters","regEx","chars","match","exec","substring","output","descriptorsStr","inParens","c","charAt","getAbsoluteSrcsetString","needMaskingText","node","maskTextClass","maskTextSelector","nodeType","ELEMENT_NODE","classList","contains","eIndex","className","matches","parentNode","TEXT_NODE","serializeNode","options","rootId","sheet","el","blockClass","blockSelector","inlineStylesheet","_b","maskTextFn","_c","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","__sn","docId","id","undefined","DOCUMENT_NODE","compatMode","Document","childNodes","DOCUMENT_TYPE_NODE","DocumentType","publicId","systemId","needBlock","element","_isBlockedElement","HTMLFormElement","processedTagName","getValidTagName","attributes_1","_d","attributes","_e","name_1","stylesheet","styleSheets","find","rel","_cssText","innerText","textContent","checked","selected","__context","canvas","ctx","getContext","x","width","y","height","getImageData","originalGetImageData","Uint32Array","Math","min","data","buffer","some","pixel","is2DCanvasBlank","rr_dataURL","toDataURL","quality","canvasDataURL","blankCanvas","image_1","oldValue_1","crossOrigin","recordInlineImage","naturalWidth","naturalHeight","drawImage","err","console","warn","currentSrc","complete","onload","rr_mediaState","paused","rr_mediaCurrentTime","currentTime","scrollLeft","rr_scrollLeft","scrollTop","rr_scrollTop","_f","getBoundingClientRect","class","rr_width","rr_height","src","contentDocument","rr_src","Element","isSVG","ownerSVGElement","parentTagName","isStyle","isScript","nextSibling","previousSibling","Text","CDATA_SECTION_NODE","CDATA","COMMENT_NODE","Comment","lowerIfExists","maybeAttr","serializeNodeWithId","skipChild","slimDOMOptions","onSerialize","onIframeLoad","_g","iframeLoadTimeout","_h","_j","preserveWhiteSpace","_serializedNode","sn","comment","script","as","endsWith","headFavicon","headMetaDescKeywords","headMetaSocial","property","headMetaRobots","headMetaHttpEquiv","headMetaAuthorship","headMetaVerification","slimDOMExcluded","serializedNode","recordChild","isShadowHost","headWhitespace","bypassOptions","_k","serializedChildNode","isElement","_l","_m","isShadow","iframeEl","listener","win","contentWindow","readyState","fired","blankUrl","location","addEventListener","setTimeout","timer_1","clearTimeout","onceIframeLoaded","iframeDoc","serializedIframeNode","on","fn","target","capture","passive","removeEventListener","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","getId","getNode","removeNodeFromMap","has","reset","throttle","func","wait","timeout","previous","arg","now","Date","leading","remaining","context","args","trailing","hookSetter","key","d","isRevoked","window","original","getOwnPropertyDescriptor","defineProperty","set","_this","patch","source","replacement","original_1","wrapped","defineProperties","__rrweb_original__","enumerable","getWindowHeight","innerHeight","documentElement","clientHeight","body","getWindowWidth","innerWidth","clientWidth","isBlocked","needBlock_1","closest","forEach","isIgnored","isAncestorRemoved","mirror","isTouchEvent","event","changedTouches","isIframeINode","hasShadowRoot","isNodeInLinkedList","Proxy","Reflect","get","prop","receiver","DoubleLinkedList","head","position","Error","current","index","addNode","__ln","removeNode","moveKey","parentId","isINode","MutationBuffer","frozen","locked","texts","removes","mapRemoves","movedMap","addedSet","Set","movedSet","droppedSet","processMutations","mutations","processMutation","emit","e_1","e_2","adds","addList","getNextId","ns","nextId","pushAdd","shadowHost","getRootNode","rootShadowHost","notInDoc","currentN","iframeManager","addIframe","shadowDomManager","addShadowRoot","iframe","childSn","attachIframe","observeAttachShadow","shift","isParentRemoved","e_1_1","return","isAncestorInSet","add","e_2_1","candidate","_node","payload","filter","attribute","mutationCb","e_3","e_4","oldValue","getAttribute","attributeName","item","old","setAttribute","style","styleObj","pname","newValue","getPropertyValue","newPriority","getPropertyPriority","e_3_1","e_4_1","addedNodes","genAdds","removedNodes","nodeId","deepDelete","targetId","delete","childN","init","freeze","canvasManager","unfreeze","isFrozen","lock","unlock","addsSet","MutationBuffer$1","mutationBuffers","isCSSGroupingRuleSupported","CSSGroupingRule","isCSSMediaRuleSupported","CSSMediaRule","isCSSSupportsRuleSupported","CSSSupportsRule","isCSSConditionRuleSupported","CSSConditionRule","getEventTarget","path","composedPath","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","MutationObserver","__rrMutationObserver","angularZoneSymbol","Zone","__symbol__","observer","bind","observe","attributeOldValue","characterData","characterDataOldValue","childList","subtree","initMouseInteractionObserver","mouseInteractionCb","sampling","mouseInteraction","disableMap","handlers","keys","Number","isNaN","eventKey","eventName","handler","clientX","clientY","getHandler","h","initScrollObserver","scrollCb","evt","scrollEl","scrollingElement","scroll","wrapEventWithUserTriggeredFlag","v","enable","userTriggered","INPUT_TAGS","lastInputValueMap","WeakMap","getNestedCSSRulePositions","childRule","parentRule","unshift","parentStyleSheet","recurse","initObservers","hooks","currentWindow","defaultView","mousemoveCb","viewportResizeCb","inputCb","mediaInteractionCb","styleSheetRuleCb","styleDeclarationCb","canvasMutationCb","fontCb","mutation","mousemove","viewportResize","input","mediaInteaction","styleSheetRule","styleDeclaration","canvasMutation","font","mergeHooks","mutationObserver","mousemoveHandler","timeBaseline","threshold","callbackThreshold","mousemoveCallback","positions","wrappedCb","totalOffset","timeOffset","updatePosition","DragEvent","Drag","MouseEvent","MouseMove","TouchMove","initMoveObserver","mouseInteractionHandler","scrollHandler","viewportResizeHandler","lastH","lastW","initViewportResizeObserver","inputHandler","ignoreClass","userTriggeredOnInput","eventHandler","isTrusted","parentElement","isChecked","cbWithDedup","querySelectorAll","lastInputValue","propertyDescriptor","HTMLInputElement","hookProperties","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","initInputObserver","mediaInteractionHandler","volume","muted","media","initMediaInteractionObserver","styleSheetObserver","insertRule","CSSStyleSheet","ownerNode","deleteRule","supportedNestedCSSRuleTypes","unmodifiedFunctions","entries","typeKey","initStyleSheetObserver","styleDeclarationObserver","setProperty","CSSStyleDeclaration","priority","removeProperty","remove","initStyleDeclarationObserver","fontObserver","collectFonts","fontMap","originalFontFace","FontFace","family","descriptors","fontFace","fontSource","JSON","stringify","Uint8Array","restoreHandler","fonts","initFontObserver","pluginHandlers","plugins","plugin","callback","b","disconnect","IframeManager","iframes","addLoadListener","cb","loadListener","isAttachIframe","ShadowDomManager","restorePatches","manager","HTMLElement","ownerDocument","iframeElement","manager_1","restorePatch","lookup","charCodeAt","encode","arraybuffer","bytes","len","base64","webGLVarMap","Map","saveWebGLVar","isInstanceOfWebGLObject","_typeof","list","ctor","contextMap","variableListFor","constructor","serializeArg","Float32Array","Float64Array","Int32Array","Uint16Array","Int16Array","Int8Array","Uint8ClampedArray","rr_type","values","ArrayBuffer","DataView","byteOffset","byteLength","HTMLImageElement","ImageData","serializeArgs","supportedWebGLConstructorNames","patchGLPrototype","props","getOwnPropertyNames","_loop_1","result","recordArgs","hookHandler","setter","props_1","props_1_1","wrappedEmit","takeFullSnapshot","CanvasManager","pendingCanvasMutations","rafStamps","latestId","invokeId","initCanvasMutationObserver","clear","resetObservers","startRAFTimestamping","startPendingCanvasMutationFlusher","canvasContextReset","HTMLCanvasElement","contextType","initCanvasContextObserver","canvas2DReset","props2D","CanvasRenderingContext2D","imgd","pix","props2D_1","props2D_1_1","initCanvas2DMutationObserver","canvasWebGL1and2Reset","WebGLRenderingContext","WebGL","WebGL2RenderingContext","WebGL2","initCanvasWebGLMutationObserver","requestAnimationFrame","flushPendingCanvasMutations","setLatestRAFTimestamp","timestamp","flushPendingCanvasMutationFor","valuesWithType","rest","getOwnPropertySymbols","propertyIsEnumerable","__rest","commands","wrapEvent","child","record","checkoutEveryNms","checkoutEveryNth","maskAllInputs","_maskInputOptions","_slimDOMOptions","packFn","mousemoveWait","lastFullSnapshotEvent","color","date","email","month","number","range","search","tel","time","week","textarea","select","password","NodeList","DOMTokenList","Node","polyfill","incrementalSnapshotCount","isCheckout","FullSnapshot","IncrementalSnapshot","Mutation","buf","eventProcessor","exceedCount","exceedTime","wrappedMutationEmit","wrappedScrollEmit","Scroll","wrappedCanvasMutationEmit","CanvasMutation","Meta","slimDOM","idNodeMap","snapshot","initialOffset","left","pageXOffset","top","pageYOffset","handlers_1","DomContentLoaded","observe_1","MouseInteraction","ViewportResize","Input","MediaInteraction","StyleSheetRule","StyleDeclaration","Font","Plugin","init_1","Load","addCustomEvent","tag","Custom","freezePage","StackFrame","obj","fileName","functionName","lineNumber","columnNumber","toString","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","ErrorStackParser","parse","stacktrace","parseOpera","parseV8OrIE","parseFFOrSafari","extractLocation","urlLike","line","sanitizedLine","tokens","locationParts","functionNameRegex","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","parseFloat","pathToSelector","outerHTML","localName","parent_1","domSiblings","children","sibling","isObject","isObjTooDeep","limit","keys_1","keys_1_1","stringifyOptions","numOfKeysLimit","depthOfLimit","thisPos","splice","Infinity","_obj","shouldIgnore","str","stringLengthLimit","Event","eventResult","eventValue","isArray","nodeName","defaultLogOptions","level","lengthThreshold","logger","initLogObserver","logOptions","loggerType","logCount","cancelHandlers","includes","errorHandler_1","trace","stackFrame","levelType","_logger","win$1","rrweb","rrwebRecord","version","rrwebVersion","rrwebConsoleRecord","getRecordConsolePlugin","Config","DEBUG","LIB_VERSION","ArrayProto","ObjProto","navigator","userAgent","localDomains","nativeForEach","nativeIndexOf","nativeIsArray","breaker","log","_isUndefined","_len","_key","_eachArray","_len2","_args","_key2","critical","_len3","_key3","unintializedWarning","methodName","_trim","thisArg","_each","_extend","_len4","_key5","_isArray","_isFunction","f","_includes","needle","_isObject","_isString","_isNumber","_timestamp","_safewrap","_len5","_key7","_strip_empty_properties","ret","k","LONG_STRINGS_ALLOW_LIST","_copyAndTruncateStrings","object","maxStringLength","customizer","COPY_IN_PROGRESS_SET","internalDeepCircularCopy","it","val","_base64Encode","h1","h2","h3","h4","bits","b64","ac","enc","tmp_arr","_utf8Encode","string","start","end","stringl","utftext","c1","String","fromCharCode","DEFAULT_BLOCKED_UA_STRS","_isBlockedUA","ua","customBlockedUserAgents","blockedUA","_getQueryParam","param","cleanParam","results","decodeURIComponent","_getHashParam","hash","_register_event","fixEvent","preventDefault","stopPropagation","returnValue","cancelBubble","oldSchool","useCapture","ontype","old_handler","new_handler","old_handlers","old_result","new_result","makeHandler","loadScript","scriptUrlToLoad","addScript","scriptTag","onerror","_scripts$0$parentNode","scripts","insertBefore","appendChild","_info","campaignParams","customParams","campaign_keywords","params","kwkey","kw","URL","searchEngine","referrer","searchInfo","keyword","browser","user_agent","vendor","opera","browserVersion","regex","Chrome","Safari","Opera","Firefox","Konqueror","BlackBerry","Mozilla","browserLanguage","language","userLanguage","os","os_name","os_version","device","deviceType","referringDomain","parser","properties","_info$os","$os","$os_version","$browser","$device","$device_type","$current_url","$host","$pathname","pathname","$browser_version","$browser_language","$screen_height","screen","$screen_width","$viewport_height","$viewport_width","$lib","$lib_version","$insert_id","random","$time","people_properties","_info$os2","getClassName","baseVal","getSafeText","elText","shouldCaptureElement","isSensitiveElement","isTextNode","shouldCaptureValue","isElementNode","isTag","isDocumentFragment","autocaptureCompatibleElements","curEl","classes","getDirectAndNestedSpanText","getNestedSpanText","_child$tagName","spanText","RageClick","enabled","_classCallCheck","clicks","lastClick","abs","PEOPLE_DISTINCT_ID_KEY","ALIAS_ID_KEY","EVENT_TIMERS_KEY","AUTOCAPTURE_DISABLED_SERVER_SIDE","SESSION_RECORDING_ENABLED_SERVER_SIDE","CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE","SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE","SESSION_ID","ENABLED_FEATURE_FLAGS","PERSISTENCE_EARLY_ACCESS_FEATURES","STORED_PERSON_PROPERTIES_KEY","STORED_GROUP_PROPERTIES_KEY","SURVEYS","FLAG_CALL_REPORTED","USER_STATE","POSTHOG_QUOTA_LIMITED","PERSISTENCE_RESERVED_PROPERTIES","limitText","autocapture","_initializedTokens","_isDisabledServerSide","_isAutocaptureEnabled","_setIsAutocaptureEnabled","instance","_instance$persistence","disabled_server_side","persistence","enabled_client_side","get_config","_previousElementSibling","previousElementSibling","_el","_getAugmentPropertiesFromElement","elem","attr","propertyKey","propertyValue","_getPropertiesFromElement","maskInputs","maskText","tag_name","nthChild","nthOfType","currentElem","_getDefaultProperties","eventType","$event_type","$ce_version","_extractCustomPropertyValue","customProperty","propValues","matchedElem","_getCustomProperties","targetElementList","_customProperties","eventSelector","eventElement","_getEventTarget","srcElement","_e$target","_captureEvent","_this$rageclicks","_this2","rageclicks","isRageClick","getTime","autocaptureConfig","url_allowlist","allowlist","dom_event_allowlist","element_allowlist","elementType","css_selector_allowlist","selector","parentIsUsefulElement","compStyles","getComputedStyle","shouldCaptureDomEvent","config","elementsJson","autocaptureAugmentProperties","explicitNoCapture","shouldCaptureEl","augmentProperties","$elements","_navigate","_addDomEventHandlers","_this3","_this$config","__autocapture","afterDecideResponse","response","token","register","enabledForProject","numBuckets","numEnabledBuckets","charCodeSum","isBrowserSupported","_bind_instance_methods","_safewrap_instance_methods","PERSISTENCE_ACTIVE_FEATURE_FLAGS","PERSISTENCE_OVERRIDE_FEATURE_FLAGS","PERSISTENCE_FEATURE_FLAG_PAYLOADS","filterActiveFeatureFlags","featureFlags","_step","activeFeatureFlags","_iterator","_createForOfIteratorHelper","ownProps","resArray","_entries","_step$value","_slicedToArray","PostHogFeatureFlags","_override_warning","featureFlagEventHandlers","reloadFeatureFlagsQueued","reloadFeatureFlagsInAction","_createClass","getFlagVariants","enabledFlags","get_property","overriddenFlags","finalFlags","overriddenKeys","_startReloadTimer","anon_distinct_id","$anon_distinct_id","isPaused","_reloadFeatureFlagsRequest","setReloadingPaused","personProperties","groupProperties","encoded_data","distinct_id","get_distinct_id","groups","getGroups","person_properties","group_properties","disable_flags","_send_request","method","_prepare_callback","receivedFeatureFlags","decideEndpointWasHit","getFlags","_this$instance$persis","flagValue","flagReportValue","flagCallReported","send_event","$feature_flag","$feature_flag_response","getFlagPayloads","getFeatureFlag","currentFlags","currentFlagPayloads","flags","flagPayloads","_persistence$register","$enabled_feature_flags","_persistence$register2","newFeatureFlags","newFeatureFlagPayloads","errorsWhileComputingFlags","parseFeatureFlagDecideResponse","_fireFeatureFlagsCallbacks","__loaded","unregister","flagsObj","addFeatureFlagsHandler","_this$_prepareFeature","_prepareFeatureFlagsForCallbacks","flagVariants","removeFeatureFlagsHandler","isEnrolled","_this$instance$persis5","_this$instance$persis6","enrollmentPersonProp","_defineProperty","$feature_enrollment","$set","setPersonPropertiesForFlags","newFlags","_this4","force_reload","existing_early_access_features","_this4$instance$persi","earlyAccessFeatures","flag","variantKey","reduce","res","_this$_prepareFeature2","reloadFeatureFlags","existingProperties","groupType","_objectSpread","group_type","DOMAIN_MATCH_REGEX","cookieStore","is_supported","msg","nameEQ","ca","cookie","days","cross_subdomain","is_secure","cdomain","expires","secure","hostname","domain","setTime","toUTCString","new_cookie_val","encodeURIComponent","_localStorage_supported","localStore","supported","localStorage","getItem","setItem","removeItem","COOKIE_PERSISTED_PROPERTIES","localPlusCookieStore","extend","cookiePersistedProperties","memoryStorage","memoryStore","sessionStorageSupported","sessionStore","sessionStorage","CASE_INSENSITIVE_PERSISTENCE_TYPES","PostHogPersistence","campaign_params_saved","custom_campaign_params","storage_type","storage","user_state","load","update_config","save","found","disabled","entry","expire_days","default_value","default_expiry","hasChanges","$referrer","$referring_domain","set_disabled","set_cross_subdomain","set_secure","event_name","timers","state","replacementImageURI","FULL_SNAPSHOT_EVENT_TYPE","META_EVENT_TYPE","INCREMENTAL_SNAPSHOT_EVENT_TYPE","PLUGIN_EVENT_TYPE","MUTATION_SOURCE_TYPE","MAX_MESSAGE_SIZE","CONSOLE_LOG_PLUGIN_NAME","MutationRateLimiter","_this$options$refillR","_this$options$bucketS","mutationBuckets","refillRate","bucketSize","closestSVG","_data$removes$length","_data$removes","_data$attributes$leng","_data$attributes","_data$texts$length","_data$texts","_data$adds$length","_data$adds","initialMutationCount","numberOfChanges","_this$mutationBuckets","_this$options$onBlock","_this$options","_this$getNodeOrReleva2","getNodeOrRelevantParent","max","loggedTracker","onBlockedNode","mutationCount","setInterval","refillBuckets","BASE_ENDPOINT","SESSION_RECORDING_BATCH_KEY","ACTIVE_SOURCES","SessionRecording","captureStarted","snapshots","endpoint","stopRrweb","windowId","sessionId","receivedDecide","_flushBuffer","sessionManager","isRecordingEnabled","startCaptureAndTrySendingQueuedSnapshots","stopRecording","enabled_server_side","_this$instance$get_co","recordingVersion_server_side","recorderVersion","_response$sessionReco3","_response$sessionReco5","_response$sessionReco","_response$sessionReco2","_response$sessionReco4","sessionRecording","consoleLogRecordingEnabled","startRecordingIfEnabled","_this$instance$sessio","onRRwebEmit","_captureSnapshotBuffered","_startCapture","getSessionManager","checkAndGetSessionAndWindowId","recorderJS","getRecordingVersion","__loaded_recorder_version","_onScriptLoaded","_event$data","isUserInteraction","_isInteractiveEvent","isIdle","lastActivityTimestamp","_tryTakeFullSnapshot","_this$rrwebRecord","_this$mutationRateLim","sessionRecordingOptions","recordCrossOriginIframes","userSessionRecordingOptions","_Object$entries","_Object$entries$_i","mutationRateLimiter","isConsoleLogCaptureEnabled","_addCaptureHook","_this4$rrwebRecord","rawEvent","throttledEvent","throttleMutations","_ensureMaxMessageSize","stringifiedData","matchAll","toLocaleLowerCase","size","ensureMaxMessageSize","_event","updatedPayload","truncateLargeConsoleLogs","_updateWindowAndSessionIds","$snapshot_bytes","$snapshot_data","$session_id","$window_id","flushBufferTimer","_captureSnapshot","_this$buffer","_this5","additionalBytes","transport","_noTruncate","_batchKey","_metrics","rrweb_full_snapshot","PERFORMANCE_EVENTS_MAPPING","entryType","timeOrigin","startTime","redirectStart","redirectEnd","workerStart","fetchStart","domainLookupStart","domainLookupEnd","connectStart","secureConnectionStart","connectEnd","requestStart","responseStart","responseEnd","decodedBodySize","encodedBodySize","initiatorType","nextHopProtocol","renderBlockingStatus","responseStatus","transferSize","renderTime","loadTime","domComplete","domContentLoadedEvent","domInteractive","loadEventEnd","loadEventStart","redirectCount","navigationType","unloadEventEnd","unloadEventStart","duration","ENTRY_TYPES_TO_OBSERVE","POSTHOG_PATHS_TO_IGNORE","WebPerformanceObserver","isEnabled","startObserving","stopObserving","_window","_window$PerformanceOb","supportedEntryTypes","PerformanceObserver","_forceAllowLocalhost","getEntries","_capturePerformanceEvent","entryTypes","_this$observer","buffered","_ref","remoteEnabled","capturePerformance","networkRequest","maskNetworkRequestFn","eventJson","toJSON","floor","performance","capturePerformanceEvent","exposesServerTiming","serverTiming","_this$capturePerforma","timing","Decide","_hasBootstrappedFeatureFlags","verbose","parseDecideResponse","_this$instance$webPer","_this$instance$except","resetRequestQueue","status","toolbar","webPerformance","exceptionAutocapture","compression","_step2","apiHost","_loop","_step2$value","scriptUrl","_iterator2","POSTHOG_MANAGED_HOSTS","Toolbar","toolbarParams","toolbarVersion","loadToolbar","history","stateHash","replaceState","title","userIntent","timestampToNearestThirtySeconds","toolbarUrl","disableToolbarMetrics","apiURL","instrument","paramsToPersist","_objectWithoutProperties","_excluded","maybeLoadToolbar","GDPR_DEFAULT_PERSISTENCE_PREFIX","optIn","_optInOut","optOut","hasOptedIn","_getStorageValue","hasOptedOut","respectDnt","nav","hasDntOn","dntValue","_hasDoNotTrackFlagOn","clearOptInOut","_getStorage","_getStorageKey","crossSubdomainCookie","persistenceType","persistencePrefix","optValue","cookieExpiration","secureCookie","captureEventName","captureProperties","send_instantly","RequestQueueScaffold","pollInterval","isPolling","_event_queue","_empty_queue_count","_poller","_pollInterval","interval","poll","RequestQueue","_RequestQueueScaffold","_inherits","_super","_createSuper","handlePollRequest","requests","formatQueue","_","dataKey","requestValues","request","u8","u16","u32","fleb","fdeb","clim","freb","eb","j","fl","revfl","revfd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","flm","Compression","fdm","shft","slc","subarray","wbits","wbits16","hTree","t2","sort","i0","i1","i2","maxSym","tr","mbt","ln","dt","lft","cst","i2_1","i2_2","i2_3","lc","cl","cli","cln","cls","w","clen","cf","wfblk","out","dat","wblk","final","syms","lf","df","li","bs","bl","dlt","mlb","ddt","mdb","lclt","nlc","lcdt","ndc","lcfreq","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","clct","dst","deo","et","crct","crc","cr","dopt","opt","pre","post","st","lvl","plvl","lst","msk_1","prev","bs1_1","ceil","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","ml","nl","mmd","md","ti","lin","din","dflt","mem","wbytes","gzh","filename","mtime","gzhl","gzipSync","opts","strToU8","latin1","TextEncoder","ai","addParamsToURL","urlQueryArgs","parameterOptions","halves","argSeparator","formdata","use_val","use_key","arg_separator","tph_arr","_HTTPBuildQuery","encodePostData","blob","Blob","sendBeacon","body_data","xhr","headers","retriesPerformedSoFar","retryQueue","onXHRError","_ref$timeout","onRateLimited","req","XMLHttpRequest","open","headerValue","headerName","setRequestHeader","withCredentials","onreadystatechange","responseText","enqueue","send","thirtyMinutes","RetryQueue","rateLimiter","queue","areWeOnline","onLine","_handleWeAreNowOnline","requestData","msToNextRetry","rawBackoffTime","pow","minBackoff","cappedBackoffTime","jitter","pickNextRetryDelay","retryAt","flush","toFlush","_ref2","_executeXhrRequest","isRateLimited","_ref3","on429Response","trunc","isInteger","isFinite","DIGITS","UUID","other","compareTo","diff","sign","unixTsMs","randA","randBHi","randBLo","RangeError","V7Generator","DefaultRandom","generateOrAbort","valueAfterReset","ts","resetCounter","counter","fromFieldsV7","nextUint32","getRandomValues","UUIDV7_DENY_WEAK_RNG","crypto","defaultGenerator","cursor","uuidv7","uuidv7obj","generate","MAX_SESSION_IDLE_TIMEOUT","MIN_SESSION_IDLE_TIMEOUT","SESSION_LENGTH_LIMIT","SessionIdManager","_windowId","_sessionId","_sessionStartTimestamp","_sessionActivityTimestamp","persistenceName","desiredTimeout","_sessionTimeoutMs","_window_id_storage_key","_primary_window_exists_storage_key","_canUseSessionStorage","lastWindowId","primaryWindowExists","_listenToReloadWindow","_sessionIdChangedHandlers","sessionActivityTimestamp","sessionStartTimestamp","_setSessionId","readOnly","_this$_getSessionId2","_getSessionId","lastTimestamp","startTimestamp","_getWindowId","sessionPastMaximumLength","valuesChanged","newTimestamp","_setWindowId","SentryIntegration","_posthog","organization","projectId","prefix","setupOnce","addGlobalEventProcessor","_event$exception","_exceptions$","_exceptions$2","_exceptions$3","_exceptions$4","tags","ui_host","api_host","sessionRecordingStarted","get_session_replay_url","withTimestamp","exceptions","exception","$exception_message","$exception_type","$exception_personURL","$sentry_event_id","event_id","$sentry_exception","$sentry_exception_message","$sentry_exception_type","$sentry_tags","createSegmentIntegration","posthog","Promise","resolve","enrichEvent","userId","anonymousId","additionalProperties","_calculate_event_properties","isLoaded","track","page","identify","PageViewManager","_pageViewData$maxScro","_pageViewData$maxScro2","_pageViewData$maxCont","_pageViewData$maxCont2","_pageViewData","_createPageViewData","pageViewData","scrollY","_scrollY","scrollHeight","_scrollHeight","contentY","_contentY","contentHeight","_contentHeight","lastScrollY","maxScrollY","maxScrollHeight","lastContentY","maxContentY","maxContentHeight","_prevPageViewData","prevPageViewData","_hasSeenPageView","_updateScrollData","$prev_pageview_pathname","_calculatePrevPageScrollProperties","$prev_pageview_last_scroll","$prev_pageview_last_scroll_percentage","clamp","$prev_pageview_max_scroll","$prev_pageview_max_scroll_percentage","$prev_pageview_last_content","$prev_pageview_last_content_percentage","$prev_pageview_max_content","$prev_pageview_max_content_percentage","isEvent","isInstanceOf","base","isPrimitive","isBuiltin","isDOMError","WEBPACK_ERROR_REGEXP","STACKTRACE_FRAME_LIMIT","UNKNOWN_FUNCTION","createFrame","lineno","colno","frame","function","in_app","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","winjsRegex","defaultStackParser","parsers","sortedParsers","skipFirst","frames","cleanedLine","localStack","reverse","subMatch","_extractSafariExtensi2","extractSafariExtensionDetails","_extractSafariExtensi4","isSafariExtension","isSafariWebExtension","ERROR_TYPES_PATTERN","reactMinifiedRegexp","parseStackFrames","ex","popSize","framesToPop","getPopSize","errorPropertiesFromError","$exception_stack_trace_raw","extractExceptionKeysForMessage","maxLength","serialized","errorToProperties","errorProperties","isDOMException","domException","isErrorWithStack","errorPropertiesFromString","code","isErrorEvent","isError","isPlainObject","errorPropertiesFromObject","$exception_is_synthetic","$exception_source","$exception_lineno","$exception_colno","SurveyType","SurveyQuestionType","ExceptionObserver","_console","_window$onerror","__POSTHOG_INSTRUMENTED__","originalOnErrorHandler","captureException","originalOnUnhandledRejectionHandler","onunhandledrejection","ev","reason","detail","_oO","$exception_handled","unhandledRejectionToProperties","sendExceptionEvent","stopCapturing","_window$onerror2","_window$onunhandledre","_window$onerror3","_this$remoteEnabled","autocaptureExceptionsResponse","autocaptureExceptions","errors_to_ignore","dropRules","errorsToIgnore","startCapturing","debugLog","propertiesToSend","posthogHost","InitType","init_type","posthog_master","PostHogSurveys","forceReload","existingSurveys","surveys","getSurveys","targetingMatchedSurveys","survey","start_date","end_date","_survey$conditions","_survey$conditions2","conditions","urlCheck","selectorCheck","querySelector","linked_flag_key","targeting_flag_key","linkedFlagCheck","isFeatureEnabled","targetingFlagCheck","supportedRetryHeaders","RateLimiter","batchKey","retryAfter","limits","header","responseHeader","getResponseHeader","retryAfterSeconds","parseInt","retryAfterMillis","__NOOP","__NOOPTIONS","PRIMARY_INSTANCE_NAME","USE_XHR","ENQUEUE_REQUESTS","defaultConfig","_document$location","_document$location$ho","_window$location","api_method","api_transport","rageclick","cross_subdomain_cookie","persistence_name","cookie_name","loaded","store_google","custom_blocked_useragents","save_referrer","capture_pageview","capture_pageleave","debug","cookie_expiration","upgrade","disable_session_recording","disable_persistence","disable_cookie","enable_recording_console_log","secure_cookie","protocol","ip","opt_out_capturing_by_default","opt_out_persistence_by_default","opt_out_capturing_persistence_type","opt_out_capturing_cookie_prefix","opt_in_site_apps","property_blacklist","respect_dnt","sanitize_properties","xhr_headers","inapp_protocol","inapp_link_new_window","request_batching","properties_string_max_length","session_recording","mask_all_element_attributes","mask_all_text","advanced_disable_decide","advanced_disable_feature_flags","advanced_disable_feature_flags_on_first_load","advanced_disable_toolbar_metrics","on_xhr_error","statusText","get_device_id","uuid","_onCapture","capture_performance","callback_fn","bootstrap","disable_compression","session_idle_timeout_seconds","create_phlib","createComplete","callbacksHandled","initComplete","syncCode","handleCallback","callbackName","INIT_MODULE","PostHog","_init","startObservingIfEnabled","pageViewManager","startMeasuringScrollPosition","_execute_array","people","segmentIntegration","__captureHooks","__request_queue","_jsc","setProps","setPersonProperties","set_once","_loaded","_window$rrweb","_config$bootstrap","_triggered_notifs","_window$rrweb2","segmentRegister","updateInitComplete","set_config","_requestQueue","_handle_queued_event","_retryQueue","sessionPersistence","_gdpr_init","segment","user","set_user_state","then","distinctID","_config$bootstrap2","_config$bootstrap3","deviceID","isIdentifiedID","$device_id","_config$bootstrap4","_config$bootstrap7","activeFlags","_config$bootstrap5","_config$bootstrap5$fe","_config$bootstrap6","_config$bootstrap6$fe","featureFlagPayloads","_config$bootstrap8","_config$bootstrap8$fe","_config$bootstrap9","_config$bootstrap9$fe","register_once","self","_handle_unload","disableDecide","_start_queue_if_opted_in","_this$_requestQueue","has_opted_out_capturing","_toConsumableArray","jsc","randomized_cb","callback_string","_this$_requestQueue2","_this$_retryQueue","unload","jsonData","__compress_and_send_json_request","compressData","GZipJS","Base64","_compressData2","_compressData","_options","DEFAULT_OPTIONS","useSendBeacon","_s$parentNode","async","defer","getElementsByTagName","array","fn_name","alias_calls","other_calls","capturing_calls","execute","calls","caller","_this$config$bootstra","_this$config$bootstra2","_this$exceptionAutoca","silenceErrors","optedOut","userOptedOut","update_search_keyword","update_campaign_params","update_referrer_info","has_unique_traits","_invokeCaptureHooks","eventData","event_properties","start_timestamp","remove_event_timer","persistenceProps","infoProperties","_this$sessionManager$","performanceProperties","doPageView","doPageLeave","duration_in_ms","toFixed","blacklisted_prop","_this$persistence","_this$persistence2","_this$sessionPersiste","_this$persistence3","_this$sessionPersiste2","getFeatureFlagPayload","_unused","updateEarlyAccessFeatureEnrollment","getEarlyAccessFeatures","onFeatureFlags","_this$sessionManager$2","_this$sessionManager","onSessionId","getActiveMatchingSurveys","new_distinct_id","userPropertiesToSet","userPropertiesToSetOnce","previous_distinct_id","$user_id","device_id","$had_persisted_distinct_id","isKnownAnonymous","get_user_state","$set_once","setAnonymousDistinctId","groupKey","groupPropertiesToSet","existingGroups","resetGroupPropertiesForFlags","$groups","$group_type","$group_key","$group_set","setGroupPropertiesForFlags","resetPersonPropertiesForFlags","reset_device_id","_this$persistence4","_this$sessionPersiste3","_this$persistence5","_this$sessionManager2","resetSessionId","_this$sessionManager$3","_this$sessionManager3","_this$sessionManager$4","_options$timestampLoo","LOOK_BACK","timestampLookBack","recordingStartTime","alias","_register_single","_this$persistence6","_this$sessionPersiste4","oldConfig","_this$sessionRecordin","started","prop_name","property_name","_this$persistence7","_this$sessionPersiste5","_this$get_config","has_opted_in_capturing","persistence_type","opt_in_capturing","enable_persistence","opt_out_capturing","clear_persistence","clear_opt_in_out_capturing","_gdpr_update_persistence","_this$persistence8","_this$sessionPersiste6","_this$persistence9","_this$sessionPersiste7","cookie_prefix","_gdpr_call_func","klass","functions","_safewrap_class","instances","override_ph_init_func","INIT_SNIPPET","add_dom_loaded_handler","dom_loaded_handler","inst","_dom_loaded"],"mappings":"6BAAIA,ECeAC,EAAW,WAQX,OAPAA,EAAWC,OAAOC,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAII,KADTL,EAAIG,UAAUF,GACOJ,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,IAE9E,OAAON,GAEJH,EAASa,MAAMC,KAAMP,UAC/B;;;;;;;;;;;;;;kFAcD,SAASQ,EAASC,GACd,IAAIZ,EAAsB,mBAAXa,QAAyBA,OAAOC,SAAUC,EAAIf,GAAKY,EAAEZ,GAAIC,EAAI,EAC5E,GAAIc,EAAG,OAAOA,EAAEP,KAAKI,GACrB,GAAIA,GAAyB,iBAAbA,EAAER,OAAqB,MAAO,CAC1CY,KAAM,WAEF,OADIJ,GAAKX,GAAKW,EAAER,SAAQQ,OAAI,GACrB,CAAEK,MAAOL,GAAKA,EAAEX,KAAMiB,MAAON,EACvC,GAEL,MAAM,IAAIO,UAAUnB,EAAI,0BAA4B,kCACvD,CAED,SAASoB,EAAOR,EAAGV,GACf,IAAIa,EAAsB,mBAAXF,QAAyBD,EAAEC,OAAOC,UACjD,IAAKC,EAAG,OAAOH,EACf,IAAmBS,EAAYC,EAA3BrB,EAAIc,EAAEP,KAAKI,GAAOW,EAAK,GAC3B,IACI,WAAc,IAANrB,GAAgBA,KAAM,MAAQmB,EAAIpB,EAAEe,QAAQE,MAAMK,EAAGC,KAAKH,EAAEJ,MADxE,CAGA,MAAOQ,GAASH,EAAI,CAAEG,MAAOA,EAAU,CAC/B,QACJ,IACQJ,IAAMA,EAAEH,OAASH,EAAId,EAAC,SAAac,EAAEP,KAAKP,EACjD,CACO,QAAE,GAAIqB,EAAG,MAAMA,EAAEG,KAAQ,CACpC,CACD,OAAOF,CACV,CAED,SAASG,EAAcC,EAAIC,EAAMC,GAC7B,GAAIA,GAA6B,IAArB1B,UAAUC,OAAc,IAAK,IAA4BmB,EAAxBtB,EAAI,EAAG6B,EAAIF,EAAKxB,OAAYH,EAAI6B,EAAG7B,KACxEsB,GAAQtB,KAAK2B,IACRL,IAAIA,EAAKQ,MAAMzB,UAAU0B,MAAMxB,KAAKoB,EAAM,EAAG3B,IAClDsB,EAAGtB,GAAK2B,EAAK3B,IAGrB,OAAO0B,EAAGM,OAAOV,GAAMQ,MAAMzB,UAAU0B,MAAMxB,KAAKoB,GACrD,iyJD9DD,SAASM,EAAahC,GAClB,IAAIiC,EACAC,EAAoB,QAAZD,EAAKjC,SAAsB,IAAPiC,OAAgB,EAASA,EAAGC,KAC5D,OAAOC,QAAQD,GAAQA,EAAKE,YAAcF,EAAKE,aAAepC,EACjE,CACD,SAASqC,EAAeJ,GACpB,IAAIK,EAAmBL,EAAGK,iBAAkBC,EAAUN,EAAGM,QAASC,EAAOP,EAAGO,KAAMzB,EAAQkB,EAAGlB,MAAO0B,EAAcR,EAAGQ,YACjHC,EAAO3B,GAAS,GAUpB,OATIuB,EAAiBC,EAAQI,gBACzBL,EAAiBE,MAEbE,EADAD,EACOA,EAAYC,GAGZ,IAAIE,OAAOF,EAAKxC,SAGxBwC,CACV,EA9BD,SAAWjD,GACPA,EAASA,EAAQ,SAAe,GAAK,WACrCA,EAASA,EAAQ,aAAmB,GAAK,eACzCA,EAASA,EAAQ,QAAc,GAAK,UACpCA,EAASA,EAAQ,KAAW,GAAK,OACjCA,EAASA,EAAQ,MAAY,GAAK,QAClCA,EAASA,EAAQ,QAAc,GAAK,SANxC,CAAA,CAOGA,IAAaA,EAAW,CAAhB,IAwBX,IAAIoD,EAA0B,qBAoB9B,IAyDIC,EACAC,EA1DAC,EAAM,EACNC,EAAe,IAAIC,OAAO,gBAC1BC,GAAgB,EAcpB,SAASC,EAAkBtD,GACvB,IACI,IAAIuD,EAAQvD,EAAEuD,OAASvD,EAAEwD,SACzB,OAAOD,EAAQxB,MAAMH,KAAK2B,GAAOE,IAAIC,GAAkBC,KAAK,IAAM,IAFtE,CAIA,MAAOlC,GACH,OAAO,IACV,CACJ,CACD,SAASiC,EAAiBE,GACtB,IAAIC,EAAiBD,EAAKE,QAC1B,GASJ,SAAyBF,GACrB,MAAO,eAAgBA,CAC1B,CAXOG,CAAgBH,GAChB,IACIC,EAAiBP,EAAkBM,EAAKI,aAAeH,CAC1D,CACD,MAAO1B,GACN,CAEL,OAAO0B,CACV,CAwBD,IAAII,EAAiB,6CACjBC,EAAgB,sDAChBC,EAAW,wBACf,SAASC,EAAqBN,EAASO,GACnC,OAAQP,GAAW,IAAIQ,QAAQL,GAAgB,SAAUM,EAAQC,EAAQC,EAAOC,EAAQC,EAAOC,GAC3F,IAlBeC,EAkBXC,EAAWL,GAASE,GAASC,EAC7BG,EAAaP,GAAUE,GAAU,GACrC,IAAKI,EACD,OAAOP,EAEX,IAAKL,EAAcc,KAAKF,GACpB,MAAO,OAASC,EAAaD,EAAWC,EAAa,IAEzD,GAAIZ,EAASa,KAAKF,GACd,MAAO,OAASC,EAAaD,EAAWC,EAAa,IAEzD,GAAoB,MAAhBD,EAAS,GACT,MAAO,OAASC,KA9BLF,EA8BiCR,GA5B5CY,QAAQ,OAAS,EACZJ,EAAIK,MAAM,KAAKlD,MAAM,EAAG,GAAG2B,KAAK,KAGhCkB,EAAIK,MAAM,KAAK,IAEZA,MAAM,KAAK,GAsBiCJ,GAAYC,EAAa,IAEjF,IAAII,EAAQd,EAAKa,MAAM,KACnBE,EAAQN,EAASI,MAAM,KAC3BC,EAAME,MACN,IAAK,IAAIC,EAAK,EAAGC,EAAUH,EAAOE,EAAKC,EAAQnF,OAAQkF,IAAM,CACzD,IAAIE,EAAOD,EAAQD,GACN,MAATE,IAGc,OAATA,EACLL,EAAME,MAGNF,EAAM3D,KAAKgE,GAElB,CACD,MAAO,OAAST,EAAaI,EAAMxB,KAAK,KAAOoB,EAAa,GAC/D,GACJ,CACD,IEpJIU,EAUAC,EAiBAC,EAcAC,EAMAC,EAOAC,EF8FAC,EAAoB,qBACpBC,EAA0B,qBA2D9B,SAASC,EAAcC,EAAKC,GACxB,IAAKA,GAA4C,KAA1BA,EAAeC,OAClC,OAAOD,EAEX,IAAIE,EAAIH,EAAII,cAAc,KAE1B,OADAD,EAAEhC,KAAO8B,EACFE,EAAEhC,IACZ,CAID,SAASkC,IACL,IAAIF,EAAIG,SAASF,cAAc,KAE/B,OADAD,EAAEhC,KAAO,GACFgC,EAAEhC,IACZ,CACD,SAASoC,EAAmBP,EAAKzD,EAASiE,EAAMzF,GAC5C,MAAa,QAATyF,GAA4B,SAATA,GAAmBzF,GAGxB,eAATyF,GAAyBzF,GAAsB,MAAbA,EAAM,GAFtCgF,EAAcC,EAAKjF,GAKZ,eAATyF,IACLzF,GACa,UAAZwB,GAAmC,OAAZA,GAAgC,OAAZA,EAG9B,WAATiE,GAAqBzF,EAtFlC,SAAiCiF,EAAKC,GAClC,GAA8B,KAA1BA,EAAeC,OACf,OAAOD,EAEX,IAAIQ,EAAM,EACV,SAASC,EAAkBC,GACvB,IAAIC,EACAC,EAAQF,EAAMG,KAAKb,EAAec,UAAUN,IAChD,OAAII,GACAD,EAAQC,EAAM,GACdJ,GAAOG,EAAM1G,OACN0G,GAEJ,EACV,CAED,IADA,IAAII,EAAS,GAETN,EAAkBZ,KACdW,GAAOR,EAAe/F,SAFjB,CAKT,IAAIyE,EAAM+B,EAAkBb,GAC5B,GAAsB,MAAlBlB,EAAI7C,OAAO,GACX6C,EAAMoB,EAAcC,EAAKrB,EAAIoC,UAAU,EAAGpC,EAAIzE,OAAS,IACvD8G,EAAO1F,KAAKqD,OAEX,CACD,IAAIsC,EAAiB,GACrBtC,EAAMoB,EAAcC,EAAKrB,GAEzB,IADA,IAAIuC,GAAW,IACF,CACT,IAAIC,EAAIlB,EAAemB,OAAOX,GAC9B,GAAU,KAANU,EAAU,CACVH,EAAO1F,MAAMqD,EAAMsC,GAAgBf,QACnC,KACH,CACI,GAAKgB,EAWI,MAANC,IACAD,GAAW,OAZC,CAChB,GAAU,MAANC,EAAW,CACXV,GAAO,EACPO,EAAO1F,MAAMqD,EAAMsC,GAAgBf,QACnC,KACH,CACc,MAANiB,IACLD,GAAW,EAElB,CAMDD,GAAkBE,EAClBV,GAAO,CACV,CACJ,CACJ,CACD,OAAOO,EAAOvD,KAAK,KACtB,CA8Bc4D,CAAwBrB,EAAKjF,GAEtB,UAATyF,GAAoBzF,EAClBmD,EAAqBnD,EAAOsF,KAElB,WAAZ9D,GAAiC,SAATiE,GAAmBzF,EACzCgF,EAAcC,EAAKjF,GAGnBA,EAZAgF,EAAcC,EAAKjF,EAcjC,CAoBD,SAASuG,EAAgBC,EAAMC,EAAeC,GAC1C,IAAKF,EACD,OAAO,EAEX,GAAIA,EAAKG,WAAaH,EAAKI,aAAc,CACrC,GAA6B,iBAAlBH,GACP,GAAID,EAAKK,UAAUC,SAASL,GACxB,OAAO,OAIX,IAAK,IAAIM,EAAS,EAAGA,EAASP,EAAKK,UAAU1H,OAAQ4H,IAAU,CAC3D,IAAIC,EAAYR,EAAKK,UAAUE,GAC/B,GAAIN,EAAc1C,KAAKiD,GACnB,OAAO,CAEd,CAEL,SAAIN,IACIF,EAAKS,QAAQP,KAIdH,EAAgBC,EAAKU,WAAYT,EAAeC,EAC1D,CACD,OAAIF,EAAKG,SAAaH,EAAKW,UAChBZ,EAAgBC,EAAKU,WAAYT,EAAeC,EAG9D,CAqCD,SAASU,EAAcnI,EAAGoI,GACtB,IAAInG,EAEAoG,EAtPqBC,EA6HPC,EAwHdvC,EAAMoC,EAAQpC,IAAKwC,EAAaJ,EAAQI,WAAYC,EAAgBL,EAAQK,cAAejB,EAAgBY,EAAQZ,cAAeC,EAAmBW,EAAQX,iBAAkBiB,EAAmBN,EAAQM,iBAAkBC,EAAKP,EAAQ9F,iBAAkBA,OAA0B,IAAPqG,EAAgB,CAAhB,EAAqBA,EAAIC,EAAaR,EAAQQ,WAAYnG,EAAc2F,EAAQ3F,YAAaoG,EAAKT,EAAQU,eAAgBA,OAAwB,IAAPD,EAAgB,CAAhB,EAAqBA,EAAIE,EAAeX,EAAQW,aAAcC,EAAeZ,EAAQY,aAAcC,EAAkBb,EAAQa,gBAE1hB,GAAIjD,EAAIkD,KAAM,CACV,IAAIC,EAAQnD,EAAIkD,KAAKE,GACrBf,EAAmB,IAAVc,OAAcE,EAAYF,CACtC,CACD,OAAQnJ,EAAE0H,UACN,KAAK1H,EAAEsJ,cACH,MAAqB,eAAjBtJ,EAAEuJ,WACK,CACH/G,KAAM/C,EAAS+J,SACfC,WAAY,GACZF,WAAYvJ,EAAEuJ,WACdlB,OAAQA,GAIL,CACH7F,KAAM/C,EAAS+J,SACfC,WAAY,GACZpB,OAAQA,GAGpB,KAAKrI,EAAE0J,mBACH,MAAO,CACHlH,KAAM/C,EAASkK,aACfnD,KAAMxG,EAAEwG,KACRoD,SAAU5J,EAAE4J,SACZC,SAAU7J,EAAE6J,SACZxB,OAAQA,GAEhB,KAAKrI,EAAE2H,aAIH,IAHA,IAAImC,EAvHhB,SAA2BC,EAASvB,EAAYC,GAC5C,GAA0B,iBAAfD,GACP,GAAIuB,EAAQnC,UAAUC,SAASW,GAC3B,OAAO,OAIX,IAAK,IAAIV,EAAS,EAAGA,EAASiC,EAAQnC,UAAU1H,OAAQ4H,IAAU,CAC9D,IAAIC,EAAYgC,EAAQnC,UAAUE,GAClC,GAAIU,EAAW1D,KAAKiD,GAChB,OAAO,CAEd,CAEL,QAAIU,GACOsB,EAAQ/B,QAAQS,EAG9B,CAqG2BuB,CAAkBhK,EAAGwI,EAAYC,GAC7ClG,EAvThB,SAAyBwH,GACrB,GAAIA,aAAmBE,gBACnB,MAAO,OAEX,IAAIC,EAAmBH,EAAQxH,QAAQI,cAAcuD,OACrD,OAAIjD,EAAa6B,KAAKoF,GACX,MAEJA,CACV,CA8SyBC,CAAgBnK,GAC1BoK,EAAe,CAAA,EACVhF,EAAK,EAAGiF,EAAKxI,MAAMH,KAAK1B,EAAEsK,YAAalF,EAAKiF,EAAGnK,OAAQkF,IAAM,CAClE,IAAImF,EAAKF,EAAGjF,GAAKoF,EAASD,EAAG/D,KAAMzF,EAAQwJ,EAAGxJ,MAC9CqJ,EAAaI,GAAUjE,EAAmBP,EAAKzD,EAASiI,EAAQzJ,EACnE,CACD,GAAgB,SAAZwB,GAAsBmG,EAAkB,CACxC,IAAI+B,EAAa5I,MAAMH,KAAKsE,EAAI0E,aAAaC,MAAK,SAAU7K,GACxD,OAAOA,EAAEqE,OAASnE,EAAEmE,IACvB,IACGP,EAAU,KACV6G,IACA7G,EAAUR,EAAkBqH,IAE5B7G,WACOwG,EAAaQ,WACbR,EAAajG,KACpBiG,EAAaS,SAAW3G,EAAqBN,EAAS6G,EAAWtG,MAExE,CACD,GAAgB,UAAZ5B,GACAvC,EAAEsI,SACAtI,EAAE8K,WACA9K,EAAE+K,aACF,IAAI7E,OAAOhG,QACX0D,EAAUR,EAAkBpD,EAAEsI,UAE9B8B,EAAaS,SAAW3G,EAAqBN,EAASyC,MAG9D,GAAgB,UAAZ9D,GACY,aAAZA,GACY,WAAZA,EAAsB,CAClBxB,EAAQf,EAAEe,MACY,UAAtBqJ,EAAa5H,MACS,aAAtB4H,EAAa5H,MACS,WAAtB4H,EAAa5H,MACS,WAAtB4H,EAAa5H,MACbzB,EACAqJ,EAAarJ,MAAQsB,EAAe,CAChCG,KAAM4H,EAAa5H,KACnBD,QAASA,EACTxB,MAAOA,EACPuB,iBAAkBA,EAClBG,YAAaA,IAGZzC,EAAEgL,UACPZ,EAAaY,QAAUhL,EAAEgL,QAEhC,CASD,GARgB,WAAZzI,IACIvC,EAAEiL,WAAa3I,EAAgB,OAC/B8H,EAAaa,UAAW,SAGjBb,EAAaa,UAGZ,WAAZ1I,GAAwByG,EACxB,GAAoB,OAAhBhJ,EAAEkL,WA5YtB,SAAyBC,GACrB,IAAIC,EAAMD,EAAOE,WAAW,MAC5B,IAAKD,EACD,OAAO,EAEX,IADA,IACSE,EAAI,EAAGA,EAAIH,EAAOI,MAAOD,GADlB,GAEZ,IAAK,IAAIE,EAAI,EAAGA,EAAIL,EAAOM,OAAQD,GAFvB,GAEuC,CAC/C,IAAIE,EAAeN,EAAIM,aACnBC,EAAuB9I,KAA2B6I,EAChDA,EAAa7I,GACb6I,EAEN,GADkB,IAAIE,YAAYD,EAAqBrL,KAAK8K,EAAKE,EAAGE,EAAGK,KAAKC,IAPpE,GAOmFX,EAAOI,MAAQD,GAAIO,KAAKC,IAP3G,GAO0HX,EAAOM,OAASD,IAAIO,KAAKC,QAC3IC,MAAK,SAAUC,GAAS,OAAiB,IAAVA,KAC3C,OAAO,CACd,CAEL,OAAO,CACV,EA4XwBC,CAAgBnM,KACjBoK,EAAagC,WAAapM,EAAEqM,UAAUvD,EAAetG,KAAMsG,EAAewD,eAG7E,KAAM,cAAetM,GAAI,CAC1B,IAAIuM,EAAgBvM,EAAEqM,UAAUvD,EAAetG,KAAMsG,EAAewD,SAChEE,EAAclG,SAASF,cAAc,UACzCoG,EAAYjB,MAAQvL,EAAEuL,MACtBiB,EAAYf,OAASzL,EAAEyL,OAEnBc,IADqBC,EAAYH,UAAUvD,EAAetG,KAAMsG,EAAewD,WAE/ElC,EAAagC,WAAaG,EAEjC,CAEL,GAAgB,QAAZhK,GAAqBwG,EAAc,CAC9BjG,IACDA,EAAgBkD,EAAII,cAAc,UAClCrD,EAAYD,EAAcuI,WAAW,OAEzC,IAAIoB,EAAUzM,EACV0M,EAAaD,EAAQE,YACzBF,EAAQE,YAAc,YACtB,IAAIC,EAAoB,WACpB,IACI9J,EAAcyI,MAAQkB,EAAQI,aAC9B/J,EAAc2I,OAASgB,EAAQK,cAC/B/J,EAAUgK,UAAUN,EAAS,EAAG,GAChCrC,EAAagC,WAAatJ,EAAcuJ,UAAUvD,EAAetG,KAAMsG,EAAewD,QAJ1F,CAMA,MAAOU,GACHC,QAAQC,KAAK,yBAA2BT,EAAQU,WAAa,YAAcH,EAC9E,CACDN,EACOtC,EAAauC,YAAcD,SACrBtC,EAAauC,aAE1BF,EAAQW,UAAqC,IAAzBX,EAAQI,aAC5BD,IAEAH,EAAQY,OAAST,CACxB,CAaD,GAZgB,UAAZrK,GAAmC,UAAZA,IACvB6H,EAAakD,cAAgBtN,EAAEuN,OACzB,SACA,SACNnD,EAAaoD,oBAAsBxN,EAAEyN,aAErCzN,EAAE0N,aACFtD,EAAauD,cAAgB3N,EAAE0N,YAE/B1N,EAAE4N,YACFxD,EAAayD,aAAe7N,EAAE4N,WAE9B9D,EAAW,CACX,IAAIgE,EAAK9N,EAAE+N,wBAAyBxC,EAAQuC,EAAGvC,MAAOE,EAASqC,EAAGrC,OAClErB,EAAe,CACX4D,MAAS5D,EAAY,MACrB6D,SAAU1C,EAAQ,KAClB2C,UAAWzC,EAAS,KAE3B,CAOD,MANgB,WAAZlJ,GAAyB0G,EAAgBmB,EAAa+D,OACjDnO,EAAEoO,kBACHhE,EAAaiE,OAASjE,EAAa+D,YAEhC/D,EAAa+D,KAEjB,CACH3L,KAAM/C,EAAS6O,QACf/L,QAASA,EACT+H,WAAYF,EACZX,WAAY,GACZ8E,OA/RMhG,EA+RcvI,EA9RzBmC,QAAuB,QAAfoG,EAAGhG,SAAqBgG,EAAGiG,uBA8RJnF,GAC1BS,UAAWA,EACXzB,OAAQA,GAEhB,KAAKrI,EAAEkI,UACH,IAAIuG,EAAgBzO,EAAEiI,YAAcjI,EAAEiI,WAAW1F,QAC7CwI,EAAc/K,EAAE+K,YAChB2D,EAA4B,UAAlBD,QAAmCpF,EAC7CsF,GAA6B,WAAlBF,QAAoCpF,EACnD,GAAIqF,GAAW3D,EAAa,CACxB,IACQ/K,EAAE4O,aAAe5O,EAAE6O,kBAEgB,QAA7B5M,EAAKjC,EAAEiI,WAAWK,aAA0B,IAAPrG,OAAgB,EAASA,EAAGqB,YACvEyH,GA1aKzC,EA0a6BtI,EAAEiI,WAAWK,OAzatDhF,SACPzB,MAAMH,KAAK4G,EAAMhF,UACdC,KAAI,SAAUG,GAAQ,OAAOA,EAAKE,SAAW,EADhD,IAEGH,KAAK,IACR,GAiaM,CAOA,MAAOuJ,GACHC,QAAQC,KAAK,wDAA0DF,EAAKhN,EAC/E,CACD+K,EAAc7G,EAAqB6G,EAAa1E,IACnD,CAYD,OAXIsI,KACA5D,EAAc,uBAEb2D,IACAC,IACDrH,EAAgBtH,EAAGwH,EAAeC,IAClCsD,IACAA,EAAcnC,EACRA,EAAWmC,GACXA,EAAY3G,QAAQ,QAAS,MAEhC,CACH5B,KAAM/C,EAASqP,KACf/D,YAAaA,GAAe,GAC5B2D,QAASA,EACTrG,OAAQA,GAEhB,KAAKrI,EAAE+O,mBACH,MAAO,CACHvM,KAAM/C,EAASuP,MACfjE,YAAa,GACb1C,OAAQA,GAEhB,KAAKrI,EAAEiP,aACH,MAAO,CACHzM,KAAM/C,EAASyP,QACfnE,YAAa/K,EAAE+K,aAAe,GAC9B1C,OAAQA,GAEhB,QACI,OAAO,EAElB,CACD,SAAS8G,EAAcC,GACnB,YAAkB/F,IAAd+F,EACO,GAGAA,EAAUzM,aAExB,CAwED,SAAS0M,EAAoBrP,EAAGoI,GAC5B,IAqBIgB,EArBApD,EAAMoC,EAAQpC,IAAKzC,EAAM6E,EAAQ7E,IAAKiF,EAAaJ,EAAQI,WAAYC,EAAgBL,EAAQK,cAAejB,EAAgBY,EAAQZ,cAAeC,EAAmBW,EAAQX,iBAAkBxF,EAAKmG,EAAQkH,UAAWA,OAAmB,IAAPrN,GAAwBA,EAAI0G,EAAKP,EAAQM,iBAAkBA,OAA0B,IAAPC,GAAuBA,EAAIE,EAAKT,EAAQ9F,iBAAkBA,OAA0B,IAAPuG,EAAgB,CAAhB,EAAqBA,EAAID,EAAaR,EAAQQ,WAAYnG,EAAc2F,EAAQ3F,YAAa8M,EAAiBnH,EAAQmH,eAAgBlF,EAAKjC,EAAQU,eAAgBA,OAAwB,IAAPuB,EAAgB,CAAhB,EAAqBA,EAAIE,EAAKnC,EAAQW,aAAcA,OAAsB,IAAPwB,GAAwBA,EAAIuD,EAAK1F,EAAQY,aAAcA,OAAsB,IAAP8E,GAAwBA,EAAI0B,EAAcpH,EAAQoH,YAAaC,EAAerH,EAAQqH,aAAcC,EAAKtH,EAAQuH,kBAAmBA,OAA2B,IAAPD,EAAgB,IAAOA,EAAIE,EAAKxH,EAAQa,gBAAiBA,OAAyB,IAAP2G,EAAgB,WAAc,OAAO,CAArC,EAAgDA,EACj9BC,EAAKzH,EAAQ0H,mBAAoBA,OAA4B,IAAPD,GAAuBA,EAC7EE,EAAkB5H,EAAcnI,EAAG,CACnCgG,IAAKA,EACLwC,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClBiB,iBAAkBA,EAClBpG,iBAAkBA,EAClBsG,WAAYA,EACZnG,YAAaA,EACbqG,eAAgBA,EAChBC,aAAcA,EACdC,aAAcA,EACdC,gBAAiBA,IAErB,IAAK8G,EAED,OADA9C,QAAQC,KAAKlN,EAAG,kBACT,KAIPoJ,EADA,SAAUpJ,EACLA,EAAEkJ,KAAKE,IA/FpB,SAAyB4G,EAAIT,GACzB,GAAIA,EAAeU,SAAWD,EAAGxN,OAAS/C,EAASyP,QAC/C,OAAO,EAEN,GAAIc,EAAGxN,OAAS/C,EAAS6O,QAAS,CACnC,GAAIiB,EAAeW,SACC,WAAfF,EAAGzN,SACgB,SAAfyN,EAAGzN,SACsB,YAAtByN,EAAG1F,WAAWM,KACO,WAArBoF,EAAG1F,WAAW6F,IACF,SAAfH,EAAGzN,SACsB,aAAtByN,EAAG1F,WAAWM,KACgB,iBAAvBoF,EAAG1F,WAAWnG,MACrB6L,EAAG1F,WAAWnG,KAAKiM,SAAS,QACpC,OAAO,EAEN,GAAIb,EAAec,cACH,SAAfL,EAAGzN,SAA4C,kBAAtByN,EAAG1F,WAAWM,KACrB,SAAfoF,EAAGzN,UACC4M,EAAca,EAAG1F,WAAW9D,MAAMK,MAAM,sCACC,qBAAtCsI,EAAca,EAAG1F,WAAW9D,OACS,SAArC2I,EAAca,EAAG1F,WAAWM,MACS,qBAArCuE,EAAca,EAAG1F,WAAWM,MACS,kBAArCuE,EAAca,EAAG1F,WAAWM,OACxC,OAAO,EAEN,GAAmB,SAAfoF,EAAGzN,QAAoB,CAC5B,GAAIgN,EAAee,sBACfnB,EAAca,EAAG1F,WAAW9D,MAAMK,MAAM,0BACxC,OAAO,EAEN,GAAI0I,EAAegB,iBACnBpB,EAAca,EAAG1F,WAAWkG,UAAU3J,MAAM,sBACzCsI,EAAca,EAAG1F,WAAW9D,MAAMK,MAAM,mBACF,cAAtCsI,EAAca,EAAG1F,WAAW9D,OAChC,OAAO,EAEN,GAAI+I,EAAekB,iBACmB,WAAtCtB,EAAca,EAAG1F,WAAW9D,OACa,cAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,YAAtC2I,EAAca,EAAG1F,WAAW9D,OAChC,OAAO,EAEN,GAAI+I,EAAemB,wBACYrH,IAAhC2G,EAAG1F,WAAW,cACd,OAAO,EAEN,GAAIiF,EAAeoB,qBACmB,WAAtCxB,EAAca,EAAG1F,WAAW9D,OACa,cAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,cAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,cAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,WAAtC2I,EAAca,EAAG1F,WAAW9D,OAC5B2I,EAAca,EAAG1F,WAAWkG,UAAU3J,MAAM,cAC5CsI,EAAca,EAAG1F,WAAWkG,UAAU3J,MAAM,cAChD,OAAO,EAEN,GAAI0I,EAAeqB,uBACmB,6BAAtCzB,EAAca,EAAG1F,WAAW9D,OACa,wBAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,eAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,oBAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,cAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,iBAAtC2I,EAAca,EAAG1F,WAAW9D,OACU,+BAAtC2I,EAAca,EAAG1F,WAAW9D,OAChC,OAAO,CAEd,CACJ,CACD,OAAO,CACV,CA2BYqK,CAAgBd,EAAiBR,KACpCO,GACEC,EAAgBvN,OAAS/C,EAASqP,MACjCiB,EAAgBrB,SAChBqB,EAAgBhF,YAAY3G,QAAQ,cAAe,IAAIlE,QAnmBzD8C,IAomBEG,EAKT,IAAI2N,EAAiBnR,OAAOC,OAAOmQ,EAAiB,CAAE3G,GAAIA,IAE1D,GADApJ,EAAEkJ,KAAO4H,EACL1H,IAAOjG,EACP,OAAO,KAEXI,EAAI6F,GAAMpJ,EACNwP,GACAA,EAAYxP,GAEhB,IAAI+Q,GAAezB,EAOnB,GANIwB,EAAetO,OAAS/C,EAAS6O,UACjCyC,EAAcA,IAAgBD,EAAehH,iBACtCgH,EAAehH,UAClB9J,EAAEoC,aACF0O,EAAeE,cAAe,KAEjCF,EAAetO,OAAS/C,EAAS+J,UAClCsH,EAAetO,OAAS/C,EAAS6O,UACjCyC,EAAa,CACTxB,EAAe0B,gBACflB,EAAgBvN,OAAS/C,EAAS6O,SACN,SAA5ByB,EAAgBxN,UAChBuN,GAAqB,GAwBzB,IAtBA,IAAIoB,EAAgB,CAChBlL,IAAKA,EACLzC,IAAKA,EACLiF,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClB6H,UAAWA,EACX5G,iBAAkBA,EAClBpG,iBAAkBA,EAClBsG,WAAYA,EACZnG,YAAaA,EACb8M,eAAgBA,EAChBzG,eAAgBA,EAChBC,aAAcA,EACdC,aAAcA,EACd8G,mBAAoBA,EACpBN,YAAaA,EACbC,aAAcA,EACdE,kBAAmBA,EACnB1G,gBAAiBA,GAEZ7D,EAAK,EAAG+L,EAAKtP,MAAMH,KAAK1B,EAAEyJ,YAAarE,EAAK+L,EAAGjR,OAAQkF,IAAM,EAE9DgM,EAAsB/B,EADb8B,EAAG/L,GACsC8L,KAElDJ,EAAerH,WAAWnI,KAAK8P,EAEtC,CACD,GA5sBR,SAAmBpR,GACf,OAAOA,EAAE0H,WAAa1H,EAAE2H,YAC3B,CA0sBW0J,CAAUrR,IAAMA,EAAEoC,WAClB,IAAK,IAAIkP,EAAK,EAAGC,EAAK1P,MAAMH,KAAK1B,EAAEoC,WAAWqH,YAAa6H,EAAKC,EAAGrR,OAAQoR,IAAM,CAC7E,IACIF,KAAsB/B,EADbkC,EAAGD,GACsCJ,MAElDE,EAAoBI,UAAW,EAC/BV,EAAerH,WAAWnI,KAAK8P,GAEtC,CAER,CAqCD,OApCIpR,EAAEiI,YAAcjG,EAAahC,EAAEiI,cAC/B6I,EAAeU,UAAW,GAE1BV,EAAetO,OAAS/C,EAAS6O,SACN,WAA3BwC,EAAevO,SA3bvB,SAA0BkP,EAAUC,EAAU/B,GAC1C,IAAIgC,EAAMF,EAASG,cACnB,GAAKD,EAAL,CAGA,IACIE,EADAC,GAAQ,EAEZ,IACID,EAAaF,EAAIrL,SAASuL,UAD9B,CAGA,MAAOtQ,GACH,MACH,CACD,GAAmB,aAAfsQ,EAAJ,CAcA,IAAIE,EAAW,cACXJ,EAAIK,SAAS7N,OAAS4N,GACtBN,EAAStD,MAAQ4D,GACA,KAAjBN,EAAStD,IAIbsD,EAASQ,iBAAiB,OAAQP,GAH9BQ,WAAWR,EAAU,EALxB,KAbD,CACI,IAAIS,EAAUD,YAAW,WAChBJ,IACDJ,IACAI,GAAQ,EAHQ,GAKrBnC,GACH8B,EAASQ,iBAAiB,QAAQ,WAC9BG,aAAaD,GACbL,GAAQ,EACRJ,MAGP,CAtBA,CA+BJ,CAyZOW,CAAiBrS,GAAG,WAChB,IAAIsS,EAAYtS,EAAEoO,gBAClB,GAAIkE,GAAa7C,EAAc,CAC3B,IAAI8C,EAAuBlD,EAAoBiD,EAAW,CACtDtM,IAAKsM,EACL/O,IAAKA,EACLiF,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClB6H,WAAW,EACX5G,iBAAkBA,EAClBpG,iBAAkBA,EAClBsG,WAAYA,EACZnG,YAAaA,EACb8M,eAAgBA,EAChBzG,eAAgBA,EAChBC,aAAcA,EACdC,aAAcA,EACd8G,mBAAoBA,EACpBN,YAAaA,EACbC,aAAcA,EACdE,kBAAmBA,EACnB1G,gBAAiBA,IAEjBsJ,GACA9C,EAAazP,EAAGuS,EAEvB,CA5BW,GA6Bb5C,GAEAmB,CACV,CGlwBD,SAAS0B,EAAGhQ,EAAMiQ,EAAIC,QACH,IAAXA,IAAqBA,EAASpM,UAClC,IAAI8B,EAAU,CAAEuK,SAAS,EAAMC,SAAS,GAExC,OADAF,EAAOT,iBAAiBzP,EAAMiQ,EAAIrK,GAC3B,WAAc,OAAOsK,EAAOG,oBAAoBrQ,EAAMiQ,EAAIrK,GACpE,EDRD,SAAW7C,GACPA,EAAUA,EAAS,iBAAuB,GAAK,mBAC/CA,EAAUA,EAAS,KAAW,GAAK,OACnCA,EAAUA,EAAS,aAAmB,GAAK,eAC3CA,EAAUA,EAAS,oBAA0B,GAAK,sBAClDA,EAAUA,EAAS,KAAW,GAAK,OACnCA,EAAUA,EAAS,OAAa,GAAK,SACrCA,EAAUA,EAAS,OAAa,GAAK,QAPzC,CAAA,CAQGA,IAAcA,EAAY,CAAjB,IAEZ,SAAWC,GACPA,EAAkBA,EAAiB,SAAe,GAAK,WACvDA,EAAkBA,EAAiB,UAAgB,GAAK,YACxDA,EAAkBA,EAAiB,iBAAuB,GAAK,mBAC/DA,EAAkBA,EAAiB,OAAa,GAAK,SACrDA,EAAkBA,EAAiB,eAAqB,GAAK,iBAC7DA,EAAkBA,EAAiB,MAAY,GAAK,QACpDA,EAAkBA,EAAiB,UAAgB,GAAK,YACxDA,EAAkBA,EAAiB,iBAAuB,GAAK,mBAC/DA,EAAkBA,EAAiB,eAAqB,GAAK,iBAC7DA,EAAkBA,EAAiB,eAAqB,GAAK,iBAC7DA,EAAkBA,EAAiB,KAAW,IAAM,OACpDA,EAAkBA,EAAiB,IAAU,IAAM,MACnDA,EAAkBA,EAAiB,KAAW,IAAM,OACpDA,EAAkBA,EAAiB,iBAAuB,IAAM,kBAdpE,CAAA,CAeGA,IAAsBA,EAAoB,CAAzB,IAEpB,SAAWC,GACPA,EAAkBA,EAAiB,QAAc,GAAK,UACtDA,EAAkBA,EAAiB,UAAgB,GAAK,YACxDA,EAAkBA,EAAiB,MAAY,GAAK,QACpDA,EAAkBA,EAAiB,YAAkB,GAAK,cAC1DA,EAAkBA,EAAiB,SAAe,GAAK,WACvDA,EAAkBA,EAAiB,MAAY,GAAK,QACpDA,EAAkBA,EAAiB,KAAW,GAAK,OACnDA,EAAkBA,EAAiB,WAAiB,GAAK,aACzDA,EAAkBA,EAAiB,mBAAyB,GAAK,qBACjEA,EAAkBA,EAAiB,SAAe,GAAK,WACvDA,EAAkBA,EAAiB,YAAkB,IAAM,aAX/D,CAAA,CAYGA,IAAsBA,EAAoB,CAAzB,IAEpB,SAAWC,GACPA,EAAcA,EAAc,MAAQ,GAAK,KACzCA,EAAcA,EAAa,MAAY,GAAK,QAC5CA,EAAcA,EAAa,OAAa,GAAK,QAHjD,CAAA,CAIGA,IAAkBA,EAAgB,CAArB,IAEhB,SAAWC,GACPA,EAAkBA,EAAiB,KAAW,GAAK,OACnDA,EAAkBA,EAAiB,MAAY,GAAK,QACpDA,EAAkBA,EAAiB,OAAa,GAAK,SACrDA,EAAkBA,EAAiB,aAAmB,GAAK,cAJ/D,CAAA,CAKGA,IAAsBA,EAAoB,CAAzB,IAEpB,SAAWC,GACPA,EAAc,MAAY,QAC1BA,EAAc,MAAY,QAC1BA,EAAc,OAAa,SAC3BA,EAAc,OAAa,SAC3BA,EAAc,OAAa,SAC3BA,EAAc,sBAA4B,yBAC1CA,EAAc,oBAA0B,wBACxCA,EAAc,kBAAwB,sBACtCA,EAAc,UAAgB,aAC9BA,EAAc,QAAc,WAC5BA,EAAc,iBAAuB,oBACrCA,EAAc,UAAgB,aAC9BA,EAAc,YAAkB,eAChCA,EAAc,MAAY,QAC1BA,EAAc,YAAkB,eAChCA,EAAc,SAAe,WAhBjC,CAAA,CAiBGA,IAAmBA,EAAiB,CAAA,IChCvC,IAAIkN,EAAiC,4NAKjCC,GAAU,CACVxP,IAAK,CADK,EAEVyP,MAAO,WAEH,OADA/F,QAAQ1L,MAAMuR,IACN,CAJF,EAMVG,QAAS,WAEL,OADAhG,QAAQ1L,MAAMuR,GACP,IARD,EAUVI,kBAAmB,WACfjG,QAAQ1L,MAAMuR,EAXR,EAaVK,IAAK,WAED,OADAlG,QAAQ1L,MAAMuR,IACP,CAfD,EAiBVM,MAAO,WACHnG,QAAQ1L,MAAMuR,EACjB,GAYL,SAASO,GAASC,EAAMC,EAAMnL,QACV,IAAZA,IAAsBA,EAAU,CAAA,GACpC,IAAIoL,EAAU,KACVC,EAAW,EACf,OAAO,SAAUC,GACb,IAAIC,EAAMC,KAAKD,MACVF,IAAgC,IAApBrL,EAAQyL,UACrBJ,EAAWE,GAEf,IAAIG,EAAYP,GAAQI,EAAMF,GAC1BM,EAAUvT,KACVwT,EAAO/T,UACP6T,GAAa,GAAKA,EAAYP,GAC1BC,IACApB,aAAaoB,GACbA,EAAU,MAEdC,EAAWE,EACXL,EAAK/S,MAAMwT,EAASC,IAEdR,IAAgC,IAArBpL,EAAQ6L,WACzBT,EAAUtB,YAAW,WACjBuB,GAA+B,IAApBrL,EAAQyL,QAAoB,EAAID,KAAKD,MAChDH,EAAU,KACVF,EAAK/S,MAAMwT,EAASC,EAHJ,GAIjBF,IAGd,CACD,SAASI,GAAWxB,EAAQyB,EAAKC,EAAGC,EAAW1C,QAC/B,IAARA,IAAkBA,EAAM2C,QAC5B,IAAIC,EAAW5C,EAAIhS,OAAO6U,yBAAyB9B,EAAQyB,GAc3D,OAbAxC,EAAIhS,OAAO8U,eAAe/B,EAAQyB,EAAKE,EACjCD,EACA,CACEM,IAAK,SAAU3T,GACX,IAAI4T,EAAQnU,KACZ0R,YAAW,WACPkC,EAAEM,IAAIpU,KAAKqU,EAAO5T,EADZ,GAEP,GACCwT,GAAYA,EAASG,KACrBH,EAASG,IAAIpU,KAAKE,KAAMO,EAE/B,IAEF,WAAc,OAAOmT,GAAWxB,EAAQyB,EAAKI,GAAY,CAAA,GAAI,GACvE,CACD,SAASK,GAAMC,EAAQrO,EAAMsO,GACzB,IACI,KAAMtO,KAAQqO,GACV,OAAO,WAAY,EAEvB,IAAIE,EAAaF,EAAOrO,GACpBwO,EAAUF,EAAYC,GAW1B,MAVuB,mBAAZC,IACPA,EAAQ5U,UAAY4U,EAAQ5U,WAAa,CAAA,EACzCT,OAAOsV,iBAAiBD,EAAS,CAC7BE,mBAAoB,CAChBC,YAAY,EACZpU,MAAOgU,MAInBF,EAAOrO,GAAQwO,EACR,WACHH,EAAOrO,GAAQuO,EAjBvB,CAoBA,MAAO9S,GACH,OAAO,WAAY,CACtB,CACJ,CACD,SAASmT,KACL,OAAQd,OAAOe,aACV/O,SAASgP,iBAAmBhP,SAASgP,gBAAgBC,cACrDjP,SAASkP,MAAQlP,SAASkP,KAAKD,YACvC,CACD,SAASE,KACL,OAAQnB,OAAOoB,YACVpP,SAASgP,iBAAmBhP,SAASgP,gBAAgBK,aACrDrP,SAASkP,MAAQlP,SAASkP,KAAKG,WACvC,CACD,SAASC,GAAUrO,EAAMiB,GACrB,IAAKjB,EACD,OAAO,EAEX,GAAIA,EAAKG,WAAaH,EAAKI,aAAc,CACrC,IAAIkO,GAAc,EAClB,GAA0B,iBAAfrN,EAAyB,CAChC,QAAqBa,IAAjB9B,EAAKuO,QACL,OAA0C,OAAnCvO,EAAKuO,QAAQ,IAAMtN,GAG1BqN,EAActO,EAAKK,UAAUC,SAASW,EAE7C,MAEGjB,EAAKK,UAAUmO,SAAQ,SAAUhO,GACzBS,EAAW1D,KAAKiD,KAChB8N,GAAc,MAI1B,OAAOA,GAAeD,GAAUrO,EAAKU,WAAYO,EACpD,CACD,OAAIjB,EAAKG,SAAaH,EAAKW,UAChB0N,GAAUrO,EAAKU,WAAYO,EAGzC,CACD,SAASwN,GAAUhW,GACf,MAAI,SAAUA,GACHA,EAAEkJ,KAAKE,KAAOjG,CAG5B,CACD,SAAS8S,GAAkBvD,EAAQwD,GAC/B,GAAIlU,EAAa0Q,GACb,OAAO,EAEX,IAAItJ,EAAK8M,EAAOlD,MAAMN,GACtB,OAAKwD,EAAO/C,IAAI/J,MAGZsJ,EAAOzK,YACPyK,EAAOzK,WAAWP,WAAagL,EAAOpJ,kBAGrCoJ,EAAOzK,YAGLgO,GAAkBvD,EAAOzK,WAAYiO,GAC/C,CACD,SAASC,GAAaC,GAClB,OAAOjU,QAAQiU,EAAMC,eACxB,CA6PD,SAASC,GAAc/O,GACnB,MAAI,SAAUA,IACFA,EAAK2B,KAAK1G,OAAS/C,EAAS6O,SAAiC,WAAtB/G,EAAK2B,KAAK3G,QAGhE,CAwBD,SAASgU,GAAcvW,GACnB,OAAOmC,QAAQnC,aAA6B,EAASA,EAAEoC,WAC1D,CC3eD,SAASoU,GAAmBxW,GACxB,MAAO,SAAUA,CACpB,CD4DqB,oBAAXsU,QAA0BA,OAAOmC,OAASnC,OAAOoC,UACxD3D,GAAU,IAAI0D,MAAM1D,GAAS,CACzB4D,IAAK,SAAUjE,EAAQkE,EAAMC,GAIzB,MAHa,QAATD,GACA3J,QAAQ1L,MAAMuR,GAEX4D,QAAQC,IAAIjE,EAAQkE,EAAMC,EACpC,KClET,IAAIC,GAAoB,WACpB,SAASA,IACLtW,KAAKN,OAAS,EACdM,KAAKuW,KAAO,IACf,CAqED,OApEAD,EAAiB1W,UAAUuW,IAAM,SAAUK,GACvC,GAAIA,GAAYxW,KAAKN,OACjB,MAAM,IAAI+W,MAAM,kCAGpB,IADA,IAAIC,EAAU1W,KAAKuW,KACVI,EAAQ,EAAGA,EAAQH,EAAUG,IAClCD,GAAWA,aAAyC,EAASA,EAAQpW,OAAS,KAElF,OAAOoW,GAEXJ,EAAiB1W,UAAUgX,QAAU,SAAUpX,GAC3C,IAAIuH,EAAO,CACPxG,MAAOf,EACPyT,SAAU,KACV3S,KAAM,MAGV,GADAd,EAAEqX,KAAO9P,EACLvH,EAAE6O,iBAAmB2H,GAAmBxW,EAAE6O,iBAAkB,CAC5D,IAAIqI,EAAUlX,EAAE6O,gBAAgBwI,KAAKvW,KACrCyG,EAAKzG,KAAOoW,EACZ3P,EAAKkM,SAAWzT,EAAE6O,gBAAgBwI,KAClCrX,EAAE6O,gBAAgBwI,KAAKvW,KAAOyG,EAC1B2P,IACAA,EAAQzD,SAAWlM,EAN3B,MASK,GAAIvH,EAAE4O,aACP4H,GAAmBxW,EAAE4O,cACrB5O,EAAE4O,YAAYyI,KAAK5D,SAAU,CACzByD,EAAUlX,EAAE4O,YAAYyI,KAAK5D,SACjClM,EAAKkM,SAAWyD,EAChB3P,EAAKzG,KAAOd,EAAE4O,YAAYyI,KAC1BrX,EAAE4O,YAAYyI,KAAK5D,SAAWlM,EAC1B2P,IACAA,EAAQpW,KAAOyG,EAEtB,MAEO/G,KAAKuW,OACLvW,KAAKuW,KAAKtD,SAAWlM,GAEzBA,EAAKzG,KAAON,KAAKuW,KACjBvW,KAAKuW,KAAOxP,EAEhB/G,KAAKN,UAET4W,EAAiB1W,UAAUkX,WAAa,SAAUtX,GAC9C,IAAIkX,EAAUlX,EAAEqX,KACX7W,KAAKuW,OAGLG,EAAQzD,UAOTyD,EAAQzD,SAAS3S,KAAOoW,EAAQpW,KAC5BoW,EAAQpW,OACRoW,EAAQpW,KAAK2S,SAAWyD,EAAQzD,YARpCjT,KAAKuW,KAAOG,EAAQpW,KAChBN,KAAKuW,OACLvW,KAAKuW,KAAKtD,SAAW,OASzBzT,EAAEqX,aACKrX,EAAEqX,KAEb7W,KAAKN,WAEF4W,CACV,CA1EuB,GA2EpBS,GAAU,SAAUnO,EAAIoO,GAAY,MAAO,GAAGzV,OAAOqH,EAAI,KAAKrH,OAAOyV,EAAY,EACrF,SAASC,GAAQzX,GACb,MAAO,SAAUA,CACpB,CACD,IAAI0X,GAAkB,WAClB,SAASA,IACL,IAAI/C,EAAQnU,KACZA,KAAKmX,QAAS,EACdnX,KAAKoX,QAAS,EACdpX,KAAKqX,MAAQ,GACbrX,KAAK8J,WAAa,GAClB9J,KAAKsX,QAAU,GACftX,KAAKuX,WAAa,GAClBvX,KAAKwX,SAAW,GAChBxX,KAAKyX,SAAW,IAAIC,IACpB1X,KAAK2X,SAAW,IAAID,IACpB1X,KAAK4X,WAAa,IAAIF,IACtB1X,KAAK6X,iBAAmB,SAAUC,GAC9BA,EAAUvC,QAAQpB,EAAM4D,iBACxB5D,EAAM6D,QAEVhY,KAAKgY,KAAO,WACR,IAAIC,EAAKxW,EAAIyW,EAAK/P,EAClB,IAAIgM,EAAMgD,SAAUhD,EAAMiD,OAA1B,CAwEA,IArEA,IAAIe,EAAO,GACPC,EAAU,IAAI9B,GACd+B,EAAY,SAAU7Y,GAGtB,IAFA,IAAI8Y,EAAK9Y,EACL+Y,EAAS5V,EACN4V,IAAW5V,GAEd4V,GADAD,EAAKA,GAAMA,EAAGlK,cACC+F,EAAMuB,OAAOlD,MAAM8F,GAEtC,OAAOC,GAEPC,EAAU,SAAUhZ,GAMpB,IALA,IAAIiC,EAAI0G,EAAIE,EAAIwB,EAAIE,EAChB0O,EAAajZ,EAAEkZ,YACc,QAA1BjX,EAAKjC,EAAEkZ,qBAAkC,IAAPjX,OAAgB,EAASA,EAAGC,KAC/D,KACFiX,EAAiBF,EAC4J,QAAzKpQ,EAA2G,QAArGF,EAAKwQ,aAAuD,EAASA,EAAeD,mBAAgC,IAAPvQ,OAAgB,EAASA,EAAGrI,KAAK6Y,UAAoC,IAAPtQ,OAAgB,EAASA,EAAG3G,MACjNiX,GAC+K,QAAzK5O,EAA2G,QAArGF,EAAK8O,aAAuD,EAASA,EAAeD,mBAAgC,IAAP7O,OAAgB,EAASA,EAAG/J,KAAK6Y,UAAoC,IAAP5O,OAAgB,EAASA,EAAGrI,OAC3M,KACZ,IAAIkX,IAAYzE,EAAM3O,IAAI6B,SAAS7H,IACX,OAAnBmZ,GAA4BxE,EAAM3O,IAAI6B,SAASsR,IACpD,GAAKnZ,EAAEiI,aAAcmR,EAArB,CAGA,IAAI5B,EAAWxV,EAAahC,EAAEiI,YACxB0M,EAAMuB,OAAOlD,MAAMiG,GACnBtE,EAAMuB,OAAOlD,MAAMhT,EAAEiI,YACvB8Q,EAASF,EAAU7Y,GACvB,IAAkB,IAAdwX,IAA+B,IAAZuB,EACnB,OAAOH,EAAQxB,QAAQpX,GAE3B,IAAIgQ,EAAKX,EAAoBrP,EAAG,CAC5BgG,IAAK2O,EAAM3O,IACXzC,IAAKoR,EAAMuB,OAAO3S,IAClBiF,WAAYmM,EAAMnM,WAClBC,cAAekM,EAAMlM,cACrBjB,cAAemN,EAAMnN,cACrBC,iBAAkBkN,EAAMlN,iBACxB6H,WAAW,EACX5G,iBAAkBiM,EAAMjM,iBACxBpG,iBAAkBqS,EAAMrS,iBACxBsG,WAAY+L,EAAM/L,WAClBnG,YAAakS,EAAMlS,YACnB8M,eAAgBoF,EAAMpF,eACtBvG,aAAc2L,EAAM3L,aACpBD,aAAc4L,EAAM5L,aACpByG,YAAa,SAAU6J,GACf/C,GAAc+C,IACd1E,EAAM2E,cAAcC,UAAUF,GAE9B9C,GAAcvW,IACd2U,EAAM6E,iBAAiBC,cAAczZ,EAAEoC,WAAYkE,SApB/B,EAuB5BmJ,aAAc,SAAUiK,EAAQC,GAC5BhF,EAAM2E,cAAcM,aAAaF,EAAQC,GACzChF,EAAM6E,iBAAiBK,oBAAoBH,EAC9C,IAED1J,GACA2I,EAAKrX,KAAK,CACNkW,SAAUA,EACVuB,OAAQA,EACRxR,KAAMyI,GAxCb,GA4CE2E,EAAMoD,WAAW7X,QACpByU,EAAMuB,OAAOhD,kBAAkByB,EAAMoD,WAAW+B,SAEpD,IACI,IAAK,IAAIjR,EAAKpI,EAASkU,EAAMwD,UAAW9N,EAAKxB,EAAG/H,QAASuJ,EAAGrJ,KAAMqJ,EAAKxB,EAAG/H,OAAQ,CAC9E,IAAId,EAAIqK,EAAGtJ,MACPgZ,GAAgBpF,EAAMmD,QAAS9X,EAAG2U,EAAMuB,UACvCvB,EAAMwD,SAAShF,IAAInT,EAAEiI,aAG1B+Q,EAAQhZ,EACX,CARL,CAUA,MAAOga,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQ3P,IAAOA,EAAGrJ,OAASiB,EAAK4G,EAAGoR,SAAShY,EAAG3B,KAAKuI,EACnD,CACO,QAAE,GAAI4P,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,IACI,IAAK,IAAIgJ,EAAK9J,EAASkU,EAAMsD,UAAWnK,EAAKvD,EAAGzJ,QAASgN,EAAG9M,KAAM8M,EAAKvD,EAAGzJ,OAAQ,CAC1Ed,EAAI8N,EAAG/M,MACNmZ,GAAgBvF,EAAMyD,WAAYpY,IAClC+Z,GAAgBpF,EAAMmD,QAAS9X,EAAG2U,EAAMuB,QAGpCgE,GAAgBvF,EAAMwD,SAAUnY,GACrCgZ,EAAQhZ,GAGR2U,EAAMyD,WAAW+B,IAAIna,GANrBgZ,EAAQhZ,EAQf,CAbL,CAeA,MAAOoa,GAAS1B,EAAM,CAAEnX,MAAO6Y,EAAU,CACjC,QACJ,IACQtM,IAAOA,EAAG9M,OAAS2H,EAAK4B,EAAG0P,SAAStR,EAAGrI,KAAKiK,EACnD,CACO,QAAE,GAAImO,EAAK,MAAMA,EAAInX,KAAQ,CACxC,CAED,IADA,IAAI8Y,EAAY,KACTzB,EAAQ1Y,QAAQ,CACnB,IAAIqH,EAAO,KACX,GAAI8S,EAAW,CACX,IAAI7C,EAAW7C,EAAMuB,OAAOlD,MAAMqH,EAAUtZ,MAAMkH,YAC9C8Q,EAASF,EAAUwB,EAAUtZ,QACf,IAAdyW,IAA+B,IAAZuB,IACnBxR,EAAO8S,EAEd,CACD,IAAK9S,EACD,IAAK,IAAI4P,EAAQyB,EAAQ1Y,OAAS,EAAGiX,GAAS,EAAGA,IAAS,CACtD,IAAImD,EAAQ1B,EAAQjC,IAAIQ,GACxB,GAAImD,EAAO,CACH9C,EAAW7C,EAAMuB,OAAOlD,MAAMsH,EAAMvZ,MAAMkH,YAC1C8Q,EAASF,EAAUyB,EAAMvZ,OAC7B,IAAkB,IAAdyW,IAA+B,IAAZuB,EAAe,CAClCxR,EAAO+S,EACP,KACH,CACJ,CACJ,CAEL,IAAK/S,EAAM,CACP,KAAOqR,EAAQ7B,MACX6B,EAAQtB,WAAWsB,EAAQ7B,KAAKhW,OAEpC,KACH,CACDsZ,EAAY9S,EAAKkM,SACjBmF,EAAQtB,WAAW/P,EAAKxG,OACxBiY,EAAQzR,EAAKxG,MAChB,CACD,IAAIwZ,EAAU,CACV1C,MAAOlD,EAAMkD,MACRtU,KAAI,SAAUb,GAAQ,MAAQ,CAC/B0G,GAAIuL,EAAMuB,OAAOlD,MAAMtQ,EAAK6E,MAC5BxG,MAAO2B,EAAK3B,MACX,IACAyZ,QAAO,SAAU9X,GAAQ,OAAOiS,EAAMuB,OAAO/C,IAAIzQ,EAAK0G,GAAM,IACjEkB,WAAYqK,EAAMrK,WACb/G,KAAI,SAAUkX,GAAa,MAAQ,CACpCrR,GAAIuL,EAAMuB,OAAOlD,MAAMyH,EAAUlT,MACjC+C,WAAYmQ,EAAUnQ,WACrB,IACAkQ,QAAO,SAAUC,GAAa,OAAO9F,EAAMuB,OAAO/C,IAAIsH,EAAUrR,GAAM,IAC3E0O,QAASnD,EAAMmD,QACfa,KAAMA,IAEL4B,EAAQ1C,MAAM3X,QACdqa,EAAQjQ,WAAWpK,QACnBqa,EAAQzC,QAAQ5X,QAChBqa,EAAQ5B,KAAKzY,UAGlByU,EAAMkD,MAAQ,GACdlD,EAAMrK,WAAa,GACnBqK,EAAMmD,QAAU,GAChBnD,EAAMsD,SAAW,IAAIC,IACrBvD,EAAMwD,SAAW,IAAID,IACrBvD,EAAMyD,WAAa,IAAIF,IACvBvD,EAAMqD,SAAW,GACjBrD,EAAM+F,WAAWH,GA9KhB,GAgLL/Z,KAAK+X,gBAAkB,SAAU1X,GAC7B,IAAI8Z,EAAK1Y,EAAI2Y,EAAKjS,EAClB,IAAIqN,GAAUnV,EAAE6R,QAGhB,OAAQ7R,EAAE2B,MACN,IAAK,gBACD,IAAIzB,EAAQF,EAAE6R,OAAO3H,YAChB6K,GAAU/U,EAAE6R,OAAQiC,EAAMnM,aAAezH,IAAUF,EAAEga,UACtDlG,EAAMkD,MAAMvW,KAAK,CACbP,MAAOuG,EAAgBzG,EAAE6R,OAAQiC,EAAMnN,cAAemN,EAAMlN,mBAAqB1G,EAC3E4T,EAAM/L,WACF+L,EAAM/L,WAAW7H,GACjBA,EAAMqD,QAAQ,QAAS,KAC3BrD,EACNwG,KAAM1G,EAAE6R,SAGhB,MAEJ,IAAK,aACD,IAAIA,EAAS7R,EAAE6R,OACX3R,EAAQF,EAAE6R,OAAOoI,aAAaja,EAAEka,eAUpC,GATwB,UAApBla,EAAEka,gBACFha,EAAQsB,EAAe,CACnBC,iBAAkBqS,EAAMrS,iBACxBC,QAAS1B,EAAE6R,OAAOnQ,QAClBC,KAAM3B,EAAE6R,OAAOoI,aAAa,QAC5B/Z,MAAOA,EACP0B,YAAakS,EAAMlS,eAGvBmT,GAAU/U,EAAE6R,OAAQiC,EAAMnM,aAAezH,IAAUF,EAAEga,SACrD,OAEJ,IAAIG,EAAOrG,EAAMrK,WAAWK,MAAK,SAAUxE,GAAK,OAAOA,EAAEoB,OAAS1G,EAAE6R,MAAS,IAQ7E,GAPKsI,IACDA,EAAO,CACHzT,KAAM1G,EAAE6R,OACRpI,WAAY,CAAA,GAEhBqK,EAAMrK,WAAWhJ,KAAK0Z,IAEF,UAApBna,EAAEka,cAA2B,CAC7B,IAAIE,EAAMtG,EAAM3O,IAAII,cAAc,QAC9BvF,EAAEga,UACFI,EAAIC,aAAa,QAASra,EAAEga,eAEFxR,IAA1B2R,EAAK1Q,WAAW6Q,OACU,OAA1BH,EAAK1Q,WAAW6Q,QAChBH,EAAK1Q,WAAW6Q,MAAQ,IAE5B,IAAIC,EAAWJ,EAAK1Q,WAAW6Q,MAC/B,IACI,IAAK,IAAItS,EAAKpI,EAASoB,MAAMH,KAAKgR,EAAOyI,QAAS9Q,EAAKxB,EAAG/H,QAASuJ,EAAGrJ,KAAMqJ,EAAKxB,EAAG/H,OAAQ,CACxF,IAAIua,EAAQhR,EAAGtJ,MACXua,EAAW5I,EAAOyI,MAAMI,iBAAiBF,GACzCG,EAAc9I,EAAOyI,MAAMM,oBAAoBJ,GAC/CC,IAAaL,EAAIE,MAAMI,iBAAiBF,IACxCG,IAAgBP,EAAIE,MAAMM,oBAAoBJ,KAE1CD,EAASC,GADO,KAAhBG,EACkBF,EAGA,CAACA,EAAUE,GAGxC,CAdL,CAgBA,MAAOE,GAASf,EAAM,CAAEpZ,MAAOma,EAAU,CACjC,QACJ,IACQrR,IAAOA,EAAGrJ,OAASiB,EAAK4G,EAAGoR,SAAShY,EAAG3B,KAAKuI,EACnD,CACO,QAAE,GAAI8R,EAAK,MAAMA,EAAIpZ,KAAQ,CACxC,CACD,IACI,IAAK,IAAIgJ,EAAK9J,EAASoB,MAAMH,KAAKuZ,EAAIE,QAASrN,EAAKvD,EAAGzJ,QAASgN,EAAG9M,KAAM8M,EAAKvD,EAAGzJ,OAAQ,CACjFua,EAAQvN,EAAG/M,MAC8B,KAAzC2R,EAAOyI,MAAMI,iBAAiBF,KAC9BD,EAASC,IAAS,EAEzB,CANL,CAQA,MAAOM,GAASf,EAAM,CAAErZ,MAAOoa,EAAU,CACjC,QACJ,IACQ7N,IAAOA,EAAG9M,OAAS2H,EAAK4B,EAAG0P,SAAStR,EAAGrI,KAAKiK,EACnD,CACO,QAAE,GAAIqQ,EAAK,MAAMA,EAAIrZ,KAAQ,CACxC,CACJ,MAEGyZ,EAAK1Q,WAAWzJ,EAAEka,eAAiBxU,EAAmBoO,EAAM3O,IAAKnF,EAAE6R,OAAOnQ,QAAS1B,EAAEka,cAAeha,GAExG,MAEJ,IAAK,YACDF,EAAE+a,WAAW7F,SAAQ,SAAU/V,GAAK,OAAO2U,EAAMkH,QAAQ7b,EAAGa,EAAE6R,WAC9D7R,EAAEib,aAAa/F,SAAQ,SAAU/V,GAC7B,IAAI+b,EAASpH,EAAMuB,OAAOlD,MAAMhT,GAC5BwX,EAAWxV,EAAanB,EAAE6R,QACxBiC,EAAMuB,OAAOlD,MAAMnS,EAAE6R,OAAOxQ,MAC5ByS,EAAMuB,OAAOlD,MAAMnS,EAAE6R,QACvBkD,GAAU/U,EAAE6R,OAAQiC,EAAMnM,aAAewN,GAAUhW,KAGnD2U,EAAMsD,SAAS9E,IAAInT,IACnBgc,GAAWrH,EAAMsD,SAAUjY,GAC3B2U,EAAMyD,WAAW+B,IAAIna,IAEhB2U,EAAMsD,SAAS9E,IAAItS,EAAE6R,UAAuB,IAAZqJ,GAChC9F,GAAkBpV,EAAE6R,OAAQiC,EAAMuB,UAClCvB,EAAMwD,SAAShF,IAAInT,IACxB2U,EAAMqD,SAAST,GAAQwE,EAAQvE,IAC/BwE,GAAWrH,EAAMwD,SAAUnY,GAG3B2U,EAAMmD,QAAQxW,KAAK,CACfkW,SAAUA,EACVpO,GAAI2S,EACJvK,WAAUxP,EAAanB,EAAE6R,cAAiBrJ,KAGlDsL,EAAMoD,WAAWzW,KAAKtB,SAMtCQ,KAAKqb,QAAU,SAAU7b,EAAG0S,GACxB,IAAIA,IAAUkD,GAAUlD,EAAQiC,EAAMnM,YAAtC,CAGA,GAAIiP,GAAQzX,GAAI,CACZ,GAAIgW,GAAUhW,GACV,OAEJ2U,EAAMwD,SAASgC,IAAIna,GACnB,IAAIic,EAAW,KACXvJ,GAAU+E,GAAQ/E,KAClBuJ,EAAWvJ,EAAOxJ,KAAKE,IAEvB6S,IACAtH,EAAMqD,SAAST,GAAQvX,EAAEkJ,KAAKE,GAAI6S,KAAa,EAEtD,MAEGtH,EAAMsD,SAASkC,IAAIna,GACnB2U,EAAMyD,WAAW8D,OAAOlc,GAEvB4V,GAAU5V,EAAG2U,EAAMnM,aACpBxI,EAAEyJ,WAAWsM,SAAQ,SAAUoG,GAAU,OAAOxH,EAAMkH,QAAQM,KAnBjE,EAqBR,CAkDD,OAjDAzE,EAAetX,UAAUgc,KAAO,SAAUhU,GACtC,IAAIuM,EAAQnU,KACZ,CACI,aACA,aACA,gBACA,gBACA,mBACA,mBACA,mBACA,aACA,cACA,eACA,eACA,iBACA,MACA,SACA,gBACA,mBACA,iBACFuV,SAAQ,SAAU5B,GAChBQ,EAAMR,GAAO/L,EAAQ+L,OAG7BuD,EAAetX,UAAUic,OAAS,WAC9B7b,KAAKmX,QAAS,EACdnX,KAAK8b,cAAcD,UAEvB3E,EAAetX,UAAUmc,SAAW,WAChC/b,KAAKmX,QAAS,EACdnX,KAAK8b,cAAcC,WACnB/b,KAAKgY,QAETd,EAAetX,UAAUoc,SAAW,WAChC,OAAOhc,KAAKmX,QAEhBD,EAAetX,UAAUqc,KAAO,WAC5Bjc,KAAKoX,QAAS,EACdpX,KAAK8b,cAAcG,QAEvB/E,EAAetX,UAAUsc,OAAS,WAC9Blc,KAAKoX,QAAS,EACdpX,KAAK8b,cAAcI,SACnBlc,KAAKgY,QAETd,EAAetX,UAAUgT,MAAQ,WAC7B5S,KAAKgZ,iBAAiBpG,QACtB5S,KAAK8b,cAAclJ,SAEhBsE,CACV,CAlZqB,GAmZtB,SAASsE,GAAWW,EAAS3c,GACzB2c,EAAQT,OAAOlc,GACfA,EAAEyJ,WAAWsM,SAAQ,SAAUoG,GAAU,OAAOH,GAAWW,EAASR,KACvE,CACD,SAASpC,GAAgBjC,EAAS9X,EAAGkW,GACjC,IAAIjO,EAAajI,EAAEiI,WACnB,IAAKA,EACD,OAAO,EAEX,IAAIuP,EAAWtB,EAAOlD,MAAM/K,GAC5B,QAAI6P,EAAQ7L,MAAK,SAAU9K,GAAK,OAAOA,EAAEiI,KAAOoO,CAAW,KAGpDuC,GAAgBjC,EAAS7P,EAAYiO,EAC/C,CACD,SAASgE,GAAgBxF,EAAK1U,GAC1B,IAAIiI,EAAajI,EAAEiI,WACnB,QAAKA,MAGDyM,EAAIvB,IAAIlL,IAGLiS,GAAgBxF,EAAKzM,GAC/B,CAED,IAAA2U,GAAelF,GC7fXmF,GAAkB,GAClBC,GAAwD,oBAApBC,gBACpCC,GAAkD,oBAAjBC,aACjCC,GAAwD,oBAApBC,gBACpCC,GAA0D,oBAArBC,iBACzC,SAASC,GAAelH,GACpB,IACI,GAAI,iBAAkBA,EAAO,CACzB,IAAImH,EAAOnH,EAAMoH,eACjB,GAAID,EAAKrd,OACL,OAAOqd,EAAK,EAHpB,MAMK,GAAI,SAAUnH,GAASA,EAAMmH,KAAKrd,OACnC,OAAOkW,EAAMmH,KAAK,GAEtB,OAAOnH,EAAM1D,MAVjB,CAYA,MAAOzQ,GACH,OAAOmU,EAAM1D,MAChB,CACJ,CACD,SAAS+K,GAAqBrV,EAASsV,GACnC,IAAIzb,EAAI0G,EACJgV,EAAiB,IAAIjG,GACzBmF,GAAgBvb,KAAKqc,GACrBA,EAAevB,KAAKhU,GACpB,IAAIwV,EAAuBtJ,OAAOuJ,kBAC9BvJ,OAAOwJ,qBACPC,EAAqJ,QAAhIpV,EAA4E,QAAtE1G,EAAgB,OAAXqS,aAA8B,IAAXA,YAAoB,EAASA,OAAO0J,YAAyB,IAAP/b,OAAgB,EAASA,EAAGgc,kBAA+B,IAAPtV,OAAgB,EAASA,EAAGrI,KAAK2B,EAAI,oBAClM8b,GACAzJ,OAAOyJ,KACPH,EAAuBtJ,OAAOyJ,IAElC,IAAIG,EAAW,IAAIN,EAAqBD,EAAetF,iBAAiB8F,KAAKR,IAS7E,OARAO,EAASE,QAAQV,EAAQ,CACrBpT,YAAY,EACZ+T,mBAAmB,EACnBC,eAAe,EACfC,uBAAuB,EACvBC,WAAW,EACXC,SAAS,IAENP,CACV,CAoDD,SAASQ,GAA6Bzc,GAClC,IAAI0c,EAAqB1c,EAAG0c,mBAAoB3Y,EAAM/D,EAAG+D,IAAKkQ,EAASjU,EAAGiU,OAAQ1N,EAAavG,EAAGuG,WAAYoW,EAAW3c,EAAG2c,SAC5H,IAAkC,IAA9BA,EAASC,iBACT,OAAO,WAAY,EAEvB,IAAIC,GAA2C,IAA9BF,EAASC,uBACQxV,IAA9BuV,EAASC,iBACP,CAAA,EACAD,EAASC,iBACXE,EAAW,GAgCf,OAXApf,OAAOqf,KAAKvZ,GACP+U,QAAO,SAAUrG,GAClB,OAAO8K,OAAOC,MAAMD,OAAO9K,MACtBA,EAAI/D,SAAS,eACM,IAApB0O,EAAW3K,EAClB,IACI4B,SAAQ,SAAUoJ,GACnB,IAAIC,EAAYD,EAASxc,cACrB0c,EA5BS,SAAUF,GACvB,OAAO,SAAU/I,GACb,IAAI1D,EAAS4K,GAAelH,GAC5B,IAAIR,GAAUlD,EAAQlK,GAAtB,CAGA,IAAIpH,EAAI+U,GAAaC,GAASA,EAAMC,eAAe,GAAKD,EACxD,GAAKhV,EAAL,CAGA,IAAIgI,EAAK8M,EAAOlD,MAAMN,GAClB4M,EAAUle,EAAEke,QAASC,EAAUne,EAAEme,QACrCZ,EAAmB,CACfnc,KAAMiD,EAAkB0Z,GACxB/V,GAAIA,EACJkC,EAAGgU,EACH9T,EAAG+T,GAPN,CAJA,GAuBSC,CAAWL,GACzBJ,EAASzd,KAAKkR,EAAG4M,EAAWC,EAASrZ,OAElC,WACH+Y,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CACD,SAASC,GAAmBzd,GACxB,IAAI0d,EAAW1d,EAAG0d,SAAU3Z,EAAM/D,EAAG+D,IAAKkQ,EAASjU,EAAGiU,OAAQ1N,EAAavG,EAAGuG,WAuB9E,OAAOgK,EAAG,SAtBWa,IAAS,SAAUuM,GACpC,IAAIlN,EAAS4K,GAAesC,GAC5B,GAAKlN,IAAUkD,GAAUlD,EAAQlK,GAAjC,CAGA,IAAIY,EAAK8M,EAAOlD,MAAMN,GACtB,GAAIA,IAAW1M,EAAK,CAChB,IAAI6Z,EAAY7Z,EAAI8Z,kBAAoB9Z,EAAIsP,gBAC5CqK,EAAS,CACLvW,GAAIA,EACJkC,EAAGuU,EAASnS,WACZlC,EAAGqU,EAASjS,WAEnB,MAEG+R,EAAS,CACLvW,GAAIA,EACJkC,EAAGoH,EAAOhF,WACVlC,EAAGkH,EAAO9E,WAdjB,CAiBJ,GAtBoG3L,EAAG2c,SAsB5FmB,QAAU,KACc/Z,EACvC,CAmBD,SAASga,GAA+BC,EAAGC,GACvC,IAAInf,EAAQrB,EAAS,CAAD,EAAKugB,GAGzB,OAFKC,UACMnf,EAAMof,cACVpf,CACV,CACD,IAAIqf,GAAa,CAAC,QAAS,WAAY,UACnCC,GAAoB,IAAIC,QAmF5B,SAASC,GAA0B7c,GAsB/B,OApBA,SAAiB8c,EAAW/Z,GACxB,GAAKqW,IACD0D,EAAUC,sBAAsB1D,iBAC/BC,IACGwD,EAAUC,sBAAsBxD,cACnCC,IACGsD,EAAUC,sBAAsBtD,iBACnCC,IACGoD,EAAUC,sBAAsBpD,iBAAmB,CACvD,IACIlG,EADQtV,MAAMH,KAAK8e,EAAUC,WAAWnd,UAC1ByB,QAAQyb,GAC1B/Z,EAAIia,QAAQvJ,EACf,KACI,CAEGA,EADQtV,MAAMH,KAAK8e,EAAUG,iBAAiBrd,UAChCyB,QAAQyb,GAC1B/Z,EAAIia,QAAQvJ,EACf,CACD,OAAO1Q,CACV,CACMma,CAAQld,EArBC,GAsBnB,CAqTD,SAASmd,GAAcngB,EAAGogB,GACtB,IAAIrI,EAAKxW,OACK,IAAV6e,IAAoBA,EAAQ,CAAA,GAChC,IAAIC,EAAgBrgB,EAAEsF,IAAIgb,YAC1B,IAAKD,EACD,OAAO,WAAY,GAtH3B,SAAoBrgB,EAAGogB,GACnB,IAAIpG,EAAaha,EAAEga,WAAYuG,EAAcvgB,EAAEugB,YAAatC,EAAqBje,EAAEie,mBAAoBgB,EAAWjf,EAAEif,SAAUuB,EAAmBxgB,EAAEwgB,iBAAkBC,EAAUzgB,EAAEygB,QAASC,EAAqB1gB,EAAE0gB,mBAAoBC,EAAmB3gB,EAAE2gB,iBAAkBC,EAAqB5gB,EAAE4gB,mBAAoBC,EAAmB7gB,EAAE6gB,iBAAkBC,EAAS9gB,EAAE8gB,OACzW9gB,EAAEga,WAAa,WAEX,IADA,IAAIva,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMW,UACNX,EAAMW,SAASlhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAE7Dua,EAAWna,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAE1DO,EAAEugB,YAAc,WAEZ,IADA,IAAI9gB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMY,WACNZ,EAAMY,UAAUnhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAE9D8gB,EAAY1gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAE3DO,EAAEie,mBAAqB,WAEnB,IADA,IAAIxe,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMjC,kBACNiC,EAAMjC,iBAAiBte,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAErEwe,EAAmBpe,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAElEO,EAAEif,SAAW,WAET,IADA,IAAIxf,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMf,QACNe,EAAMf,OAAOxf,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAE3Dwf,EAASpf,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAExDO,EAAEwgB,iBAAmB,WAEjB,IADA,IAAI/gB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMa,gBACNb,EAAMa,eAAephB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAEnE+gB,EAAiB3gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAEhEO,EAAEygB,QAAU,WAER,IADA,IAAIhhB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMc,OACNd,EAAMc,MAAMrhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAE1DghB,EAAQ5gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAEvDO,EAAE0gB,mBAAqB,WAEnB,IADA,IAAIjhB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMe,iBACNf,EAAMe,gBAAgBthB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAEpEihB,EAAmB7gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAElEO,EAAE2gB,iBAAmB,WAEjB,IADA,IAAIlhB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMgB,gBACNhB,EAAMgB,eAAevhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAEnEkhB,EAAiB9gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAEhEO,EAAE4gB,mBAAqB,WAEnB,IADA,IAAInhB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMiB,kBACNjB,EAAMiB,iBAAiBxhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAErEmhB,EAAmB/gB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAElEO,EAAE6gB,iBAAmB,WAEjB,IADA,IAAIphB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMkB,gBACNlB,EAAMkB,eAAezhB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAEnEohB,EAAiBhhB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,KAEhEO,EAAE8gB,OAAS,WAEP,IADA,IAAIrhB,EAAI,GACCiF,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpCjF,EAAEiF,GAAMnF,UAAUmF,GAElB0b,EAAMmB,MACNnB,EAAMmB,KAAK1hB,MAAMugB,EAAOtf,EAAc,GAAIN,EAAOf,IAAI,IAEzDqhB,EAAOjhB,WAAM,EAAQiB,EAAc,GAAIN,EAAOf,IAAI,IAEzD,CAQG+hB,CAAWxhB,EAAGogB,GACd,IAAIqB,EAAmB1E,GAAqB/c,EAAGA,EAAEsF,KAC7Coc,EA3jBR,SAA0BngB,GACtB,IAAIgf,EAAchf,EAAGgf,YAAarC,EAAW3c,EAAG2c,SAAU5Y,EAAM/D,EAAG+D,IAAKkQ,EAASjU,EAAGiU,OACpF,IAA2B,IAAvB0I,EAAS8C,UACT,OAAO,WAAY,EAEvB,IAKIW,EALAC,EAA0C,iBAAvB1D,EAAS8C,UAAyB9C,EAAS8C,UAAY,GAC1Ea,EAA0D,iBAA/B3D,EAAS4D,kBAClC5D,EAAS4D,kBACT,IACFC,EAAY,GAEZC,EAAYrP,IAAS,SAAUwB,GAC/B,IAAI8N,EAAc/O,KAAKD,MAAQ0O,EAC/BpB,EAAYwB,EAAUlf,KAAI,SAAUpD,GAEhC,OADAA,EAAEyiB,YAAcD,EACTxiB,KACP0U,GACJ4N,EAAY,GACZJ,EAAe,IAPK,GAQrBE,GACCM,EAAiBxP,IAAS,SAAUuM,GACpC,IAAIlN,EAAS4K,GAAesC,GACxB3d,EAAKkU,GAAayJ,GAChBA,EAAIvJ,eAAe,GACnBuJ,EAAKN,EAAUrd,EAAGqd,QAASC,EAAUtd,EAAGsd,QACzC8C,IACDA,EAAezO,KAAKD,OAExB8O,EAAUnhB,KAAK,CACXgK,EAAGgU,EACH9T,EAAG+T,EACHnW,GAAI8M,EAAOlD,MAAMN,GACjBkQ,WAAYhP,KAAKD,MAAQ0O,IAE7BK,EAA+B,oBAAdI,WAA6BlD,aAAekD,UACvDtd,EAAkBud,KAClBnD,aAAeoD,WACXxd,EAAkByd,UAClBzd,EAAkB0d,UAlBH,GAmB1BZ,EAAW,CACVrO,UAAU,IAEV8K,EAAW,CACXvM,EAAG,YAAaqQ,EAAgB7c,GAChCwM,EAAG,YAAaqQ,EAAgB7c,GAChCwM,EAAG,OAAQqQ,EAAgB7c,IAE/B,OAAO,WACH+Y,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CAygB0B0D,CAAiBziB,GACpC0iB,EAA0B1E,GAA6Bhe,GACvD2iB,EAAgB3D,GAAmBhf,GACnC4iB,EApcR,SAAoCrhB,GAChC,IAAIif,EAAmBjf,EAAGif,iBACtBqC,GAAS,EACTC,GAAS,EAab,OAAOhR,EAAG,SAZYa,IAAS,WAC3B,IAAI5H,EAAS2J,KACT7J,EAAQkK,KACR8N,IAAU9X,GAAU+X,IAAUjY,IAC9B2V,EAAiB,CACb3V,MAAO0T,OAAO1T,GACdE,OAAQwT,OAAOxT,KAEnB8X,EAAQ9X,EACR+X,EAAQjY,EATc,GAW3B,KACkC+I,OACxC,CAmb+BmP,CAA2B/iB,GACnDgjB,EA3aR,SAA2BzhB,GACvB,IAAIkf,EAAUlf,EAAGkf,QAASnb,EAAM/D,EAAG+D,IAAKkQ,EAASjU,EAAGiU,OAAQ1N,EAAavG,EAAGuG,WAAYmb,EAAc1hB,EAAG0hB,YAAarhB,EAAmBL,EAAGK,iBAAkBG,EAAcR,EAAGQ,YAAamc,EAAW3c,EAAG2c,SAAUgF,EAAuB3hB,EAAG2hB,qBAC9O,SAASC,EAAazN,GAClB,IAAI1D,EAAS4K,GAAelH,GACxB+J,EAAgB/J,EAAM0N,UAG1B,GAFIpR,GAA6B,WAAnBA,EAAOnQ,UACjBmQ,EAASA,EAAOqR,eACfrR,GACAA,EAAOnQ,WACR6d,GAAWrb,QAAQ2N,EAAOnQ,SAAW,KACrCqT,GAAUlD,EAAQlK,GAHtB,CAMA,IAAIhG,EAAOkQ,EAAOlQ,KAClB,IAAIkQ,EAAO9K,UAAUC,SAAS8b,GAA9B,CAGA,IAAIjhB,EAAOgQ,EAAO3R,MACdijB,GAAY,EACH,UAATxhB,GAA6B,aAATA,EACpBwhB,EAAYtR,EAAO1H,SAEd1I,EAAiBoQ,EAAOnQ,QAAQI,gBACrCL,EAAiBE,MACjBE,EAAOL,EAAe,CAClBC,iBAAkBA,EAClBC,QAASmQ,EAAOnQ,QAChBC,KAAMA,EACNzB,MAAO2B,EACPD,YAAaA,KAGrBwhB,EAAYvR,EAAQsN,GAA+B,CAAEtd,KAAMA,EAAMshB,UAAWA,EAAW7D,cAAeA,GAAiByD,IACvH,IAAIpd,EAAOkM,EAAOlM,KACL,UAAThE,GAAoBgE,GAAQwd,GAC5Bhe,EACKke,iBAAiB,6BAAgCniB,OAAOyE,EAAM,OAC9DuP,SAAQ,SAAUxN,GACfA,IAAOmK,GACPuR,EAAY1b,EAAIyX,GAA+B,CAC3Ctd,KAAM6F,EAAGxH,MACTijB,WAAYA,EACZ7D,eAAe,GAChByD,MA3Bd,CAJA,CAmCJ,CACD,SAASK,EAAYvR,EAAQuN,GACzB,IAAIkE,EAAiB9D,GAAkB1J,IAAIjE,GAC3C,IAAKyR,GACDA,EAAezhB,OAASud,EAAEvd,MAC1ByhB,EAAeH,YAAc/D,EAAE+D,UAAW,CAC1C3D,GAAkB3L,IAAIhC,EAAQuN,GAC9B,IAAI7W,EAAK8M,EAAOlD,MAAMN,GACtByO,EAAQzhB,EAASA,EAAS,CAAD,EAAKugB,GAAI,CAAE7W,GAAIA,IAC3C,CACJ,CACD,IACI2V,GAD4B,SAAnBH,EAASgD,MAAmB,CAAC,UAAY,CAAC,QAAS,WAC1Cre,KAAI,SAAU6b,GAAa,OAAO5M,EAAG4M,EAAWyE,EAAc7d,EAAO,IACvFoe,EAAqBzkB,OAAO6U,yBAAyB6P,iBAAiBjkB,UAAW,SACjFkkB,EAAiB,CACjB,CAACD,iBAAiBjkB,UAAW,SAC7B,CAACikB,iBAAiBjkB,UAAW,WAC7B,CAACmkB,kBAAkBnkB,UAAW,SAC9B,CAACokB,oBAAoBpkB,UAAW,SAChC,CAACmkB,kBAAkBnkB,UAAW,iBAC9B,CAACqkB,kBAAkBrkB,UAAW,aAWlC,OATIgkB,GAAsBA,EAAmB1P,KACzCqK,EAASzd,KAAKf,MAAMwe,EAAUvd,EAAc,GAAIN,EAAOojB,EAAe/gB,KAAI,SAAUpD,GAChF,OAAO+T,GAAW/T,EAAE,GAAIA,EAAE,GAAI,CAC1BuU,IAAK,WACDmP,EAAa,CAAEnR,OAAQlS,MAC1B,GAER,MAAI,IAEF,WACHue,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CA0VsBiF,CAAkBhkB,GACjCikB,EArMR,SAAsC1iB,GAClC,IAAImf,EAAqBnf,EAAGmf,mBAAoB5Y,EAAavG,EAAGuG,WAAY0N,EAASjU,EAAGiU,OAAQ0I,EAAW3c,EAAG2c,SAC1GS,EAAU,SAAU7c,GACpB,OAAO6Q,IAAS,SAAU+C,GACtB,IAAI1D,EAAS4K,GAAelH,GAC5B,GAAK1D,IAAUkD,GAAUlD,EAAQlK,GAAjC,CAGA,IAAIvG,EAAKyQ,EAAQjF,EAAcxL,EAAGwL,YAAamX,EAAS3iB,EAAG2iB,OAAQC,EAAQ5iB,EAAG4iB,MAC9EzD,EAAmB,CACf5e,KAAMA,EACN4G,GAAI8M,EAAOlD,MAAMN,GACjBjF,YAAaA,EACbmX,OAAQA,EACRC,MAAOA,GAPV,CASJ,GAAEjG,EAASkG,OAAS,MAErB/F,EAAW,CACXvM,EAAG,OAAQ6M,EAAQ,IACnB7M,EAAG,QAAS6M,EAAQ,IACpB7M,EAAG,SAAU6M,EAAQ,IACrB7M,EAAG,eAAgB6M,EAAQ,KAE/B,OAAO,WACHN,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CA0KiCsF,CAA6BrkB,GACvDskB,EAnUR,SAAgC/iB,EAAI0G,GAChC,IAAI0Y,EAAmBpf,EAAGof,iBAAkBnL,EAASjU,EAAGiU,OACpDvE,EAAMhJ,EAAGgJ,IACTsT,EAAatT,EAAIuT,cAAc9kB,UAAU6kB,WAC7CtT,EAAIuT,cAAc9kB,UAAU6kB,WAAa,SAAUvhB,EAAMyT,GACrD,IAAI/N,EAAK8M,EAAOlD,MAAMxS,KAAK2kB,WAO3B,OANY,IAAR/b,GACAiY,EAAiB,CACbjY,GAAIA,EACJuP,KAAM,CAAC,CAAEjV,KAAMA,EAAMyT,MAAOA,MAG7B8N,EAAW1kB,MAAMC,KAAMP,YAElC,IAAImlB,EAAazT,EAAIuT,cAAc9kB,UAAUglB,WAC7CzT,EAAIuT,cAAc9kB,UAAUglB,WAAa,SAAUjO,GAC/C,IAAI/N,EAAK8M,EAAOlD,MAAMxS,KAAK2kB,WAO3B,OANY,IAAR/b,GACAiY,EAAiB,CACbjY,GAAIA,EACJ0O,QAAS,CAAC,CAAEX,MAAOA,MAGpBiO,EAAW7kB,MAAMC,KAAMP,YAElC,IAAIolB,EAA8B,CAAA,EAC9BvI,GACAuI,EAA4BtI,gBAAkBpL,EAAIoL,iBAG9CC,KACAqI,EAA4BpI,aAAetL,EAAIsL,cAE/CG,KACAiI,EAA4BhI,iBAAmB1L,EAAI0L,kBAEnDH,KACAmI,EAA4BlI,gBAAkBxL,EAAIwL,kBAG1D,IAAImI,EAAsB,CAAA,EAmC1B,OAlCA3lB,OAAO4lB,QAAQF,GAA6BtP,SAAQ,SAAU9T,GAC1D,IAAI0G,EAAKzH,EAAOe,EAAI,GAAIujB,EAAU7c,EAAG,GAAInG,EAAOmG,EAAG,GACnD2c,EAAoBE,GAAW,CAC3BP,WAAYziB,EAAKpC,UAAU6kB,WAC3BG,WAAY5iB,EAAKpC,UAAUglB,YAE/B5iB,EAAKpC,UAAU6kB,WAAa,SAAUvhB,EAAMyT,GACxC,IAAI/N,EAAK8M,EAAOlD,MAAMxS,KAAKmgB,iBAAiBwE,WAc5C,OAbY,IAAR/b,GACAiY,EAAiB,CACbjY,GAAIA,EACJuP,KAAM,CACF,CACIjV,KAAMA,EACNyT,MAAO3V,EAAcA,EAAc,GAAIN,EAAOqf,GAA0B/f,QAAQ,GAAQ,CACpF2W,GAAS,IACV,OAKZmO,EAAoBE,GAASP,WAAW1kB,MAAMC,KAAMP,YAE/DuC,EAAKpC,UAAUglB,WAAa,SAAUjO,GAClC,IAAI/N,EAAK8M,EAAOlD,MAAMxS,KAAKmgB,iBAAiBwE,WAO5C,OANY,IAAR/b,GACAiY,EAAiB,CACbjY,GAAIA,EACJ0O,QAAS,CAAC,CAAEX,MAAO3V,EAAcA,EAAc,GAAIN,EAAOqf,GAA0B/f,QAAQ,GAAQ,CAAC2W,IAAQ,OAG9GmO,EAAoBE,GAASJ,WAAW7kB,MAAMC,KAAMP,eAG5D,WACH0R,EAAIuT,cAAc9kB,UAAU6kB,WAAaA,EACzCtT,EAAIuT,cAAc9kB,UAAUglB,WAAaA,EACzCzlB,OAAO4lB,QAAQF,GAA6BtP,SAAQ,SAAU9T,GAC1D,IAAI0G,EAAKzH,EAAOe,EAAI,GAAIujB,EAAU7c,EAAG,GAAInG,EAAOmG,EAAG,GACnDnG,EAAKpC,UAAU6kB,WAAaK,EAAoBE,GAASP,WACzDziB,EAAKpC,UAAUglB,WAAaE,EAAoBE,GAASJ,cAGpE,CA+O4BK,CAAuB/kB,EAAG,CAAEiR,IAAKoP,IACtD2E,EA/OR,SAAsCzjB,EAAI0G,GACtC,IAAI2Y,EAAqBrf,EAAGqf,mBAAoBpL,EAASjU,EAAGiU,OACxDvE,EAAMhJ,EAAGgJ,IACTgU,EAAchU,EAAIiU,oBAAoBxlB,UAAUulB,YACpDhU,EAAIiU,oBAAoBxlB,UAAUulB,YAAc,SAAUnV,EAAUzP,EAAO8kB,GACvE,IAAI5jB,EAAI0G,EACJS,EAAK8M,EAAOlD,MAAiG,QAA1FrK,EAAgC,QAA1B1G,EAAKzB,KAAKigB,kBAA+B,IAAPxe,OAAgB,EAASA,EAAG0e,wBAAqC,IAAPhY,OAAgB,EAASA,EAAGwc,WAYrJ,OAXY,IAAR/b,GACAkY,EAAmB,CACflY,GAAIA,EACJsL,IAAK,CACDlE,SAAUA,EACVzP,MAAOA,EACP8kB,SAAUA,GAEd1O,MAAOoJ,GAA0B/f,KAAKigB,cAGvCkF,EAAYplB,MAAMC,KAAMP,YAEnC,IAAI6lB,EAAiBnU,EAAIiU,oBAAoBxlB,UAAU0lB,eAevD,OAdAnU,EAAIiU,oBAAoBxlB,UAAU0lB,eAAiB,SAAUtV,GACzD,IAAIvO,EAAI0G,EACJS,EAAK8M,EAAOlD,MAAiG,QAA1FrK,EAAgC,QAA1B1G,EAAKzB,KAAKigB,kBAA+B,IAAPxe,OAAgB,EAASA,EAAG0e,wBAAqC,IAAPhY,OAAgB,EAASA,EAAGwc,WAUrJ,OATY,IAAR/b,GACAkY,EAAmB,CACflY,GAAIA,EACJ2c,OAAQ,CACJvV,SAAUA,GAEd2G,MAAOoJ,GAA0B/f,KAAKigB,cAGvCqF,EAAevlB,MAAMC,KAAMP,YAE/B,WACH0R,EAAIiU,oBAAoBxlB,UAAUulB,YAAcA,EAChDhU,EAAIiU,oBAAoBxlB,UAAU0lB,eAAiBA,EAE1D,CAwMkCE,CAA6BtlB,EAAG,CAC3DiR,IAAKoP,IAELkF,EAAevlB,EAAEwlB,aA9KzB,SAA0BjkB,GACtB,IAAIuf,EAASvf,EAAGuf,OAAQxb,EAAM/D,EAAG+D,IAC7B2L,EAAM3L,EAAIgb,YACd,IAAKrP,EACD,OAAO,WAAY,EAEvB,IAAIoN,EAAW,GACXoH,EAAU,IAAI7F,QACd8F,EAAmBzU,EAAI0U,SAC3B1U,EAAI0U,SAAW,SAAkBC,EAAQzR,EAAQ0R,GAC7C,IAAIC,EAAW,IAAIJ,EAAiBE,EAAQzR,EAAQ0R,GAUpD,OATAJ,EAAQzR,IAAI8R,EAAU,CAClBF,OAAQA,EACRta,OAA0B,iBAAX6I,EACf0R,YAAaA,EACbE,WAA8B,iBAAX5R,EACbA,EAEE6R,KAAKC,UAAU9kB,MAAMH,KAAK,IAAIklB,WAAW/R,OAE9C2R,GAEX,IAAIK,EAAiBjS,GAAM5O,EAAI8gB,MAAO,OAAO,SAAUvS,GACnD,OAAO,SAAUiS,GAQb,OAPAtU,YAAW,WACP,IAAI/R,EAAIgmB,EAAQxP,IAAI6P,GAChBrmB,IACAqhB,EAAOrhB,GACPgmB,EAAQjK,OAAOsK,GAJb,GAMP,GACIjS,EAAShU,MAAMC,KAAM,CAACgmB,IAEpC,IAKD,OAJAzH,EAASzd,MAAK,WACVqQ,EAAI0U,SAAWD,KAEnBrH,EAASzd,KAAKulB,GACP,WACH9H,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CAqIuCsH,CAAiBrmB,GAAK,aACtDsmB,EAAiB,GACrB,IACI,IAAK,IAAIre,EAAKlI,EAASC,EAAEumB,SAAUpe,EAAKF,EAAG7H,QAAS+H,EAAG7H,KAAM6H,EAAKF,EAAG7H,OAAQ,CACzE,IAAIomB,EAASre,EAAG9H,MAChBimB,EAAe1lB,KAAK4lB,EAAOhJ,SAASgJ,EAAOC,SAAUpG,EAAemG,EAAO9e,SAC9E,CAJL,CAMA,MAAO4R,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQnR,IAAOA,EAAG7H,OAASiB,EAAK0G,EAAGsR,SAAShY,EAAG3B,KAAKqI,EACnD,CACO,QAAE,GAAI8P,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,OAAO,WACHsb,GAAgB9G,SAAQ,SAAUqR,GAAK,OAAOA,EAAEhU,WAChD+O,EAAiBkF,aACjBjF,IACAgB,IACAC,IACAC,IACAI,IACAiB,IACAK,IACAU,IACAO,IACAe,EAAejR,SAAQ,SAAU0J,GAAK,OAAOA,OAEpD,CCrpBD,IAAI6H,GAAiB,WACjB,SAASA,EAAclf,GACnB5H,KAAK+mB,QAAU,IAAIjH,QACnB9f,KAAKka,WAAatS,EAAQsS,UAC7B,CAwBD,OAvBA4M,EAAclnB,UAAUmZ,UAAY,SAAU9H,GAC1CjR,KAAK+mB,QAAQ7S,IAAIjD,GAAU,IAE/B6V,EAAclnB,UAAUonB,gBAAkB,SAAUC,GAChDjnB,KAAKknB,aAAeD,GAExBH,EAAclnB,UAAUwZ,aAAe,SAAUnI,EAAUkI,GACvD,IAAI1X,EACJzB,KAAKka,WAAW,CACZ/B,KAAM,CACF,CACInB,SAAU/F,EAASvI,KAAKE,GACxB2P,OAAQ,KACRxR,KAAMoS,IAGd7B,QAAS,GACTD,MAAO,GACPvN,WAAY,GACZqd,gBAAgB,IAES,QAA5B1lB,EAAKzB,KAAKknB,oBAAiC,IAAPzlB,GAAyBA,EAAG3B,KAAKE,KAAMiR,IAEzE6V,CACV,CA7BoB,GCIjBM,GAAoB,WACpB,SAASA,EAAiBxf,GACtB5H,KAAKqnB,eAAiB,GACtBrnB,KAAKka,WAAatS,EAAQsS,WAC1Bla,KAAKmf,SAAWvX,EAAQuX,SACxBnf,KAAK0Q,cAAgB9I,EAAQ8I,cAC7B1Q,KAAK0V,OAAS9N,EAAQ8N,OACtB,IAAI4R,EAAUtnB,KACdA,KAAKqnB,eAAevmB,KAAKsT,GAAMmT,YAAY3nB,UAAW,gBAAgB,SAAUmU,GAC5E,OAAO,WACH,IAAInS,EAAamS,EAAShU,MAAMC,KAAMP,WAGtC,OAFIO,KAAK4B,YACL0lB,EAAQrO,cAAcjZ,KAAK4B,WAAY5B,KAAKwnB,eACzC5lB,EALe,IAQjC,CAqBD,OApBAwlB,EAAiBxnB,UAAUqZ,cAAgB,SAAUrX,EAAY4D,GAC7DyX,GAAqB/d,EAASA,EAAS,CAAD,EAAKc,KAAK0Q,eAAgB,CAAElL,IAAKA,EAAK0U,WAAYla,KAAKka,WAAYxE,OAAQ1V,KAAK0V,OAAQsD,iBAAkBhZ,OAAS4B,GACzJsd,GAAmBhgB,EAASA,EAAS,CAAD,EAAKc,KAAK0Q,eAAgB,CAAEyO,SAAUnf,KAAKmf,SAAU3Z,IAAK5D,EAAY8T,OAAQ1V,KAAK0V,WAE3H0R,EAAiBxnB,UAAUyZ,oBAAsB,SAAUoO,GACvD,GAAIA,EAAcrW,cAAe,CAC7B,IAAIsW,EAAY1nB,KAChBA,KAAKqnB,eAAevmB,KAAKsT,GAAMqT,EAAcrW,cAAcmW,YAAY3nB,UAAW,gBAAgB,SAAUmU,GACxG,OAAO,WACH,IAAInS,EAAamS,EAAShU,MAAMC,KAAMP,WAGtC,OAFIO,KAAK4B,YACL8lB,EAAUzO,cAAcjZ,KAAK4B,WAAY6lB,EAAc7Z,iBACpDhM,EALe,IAQjC,GAELwlB,EAAiBxnB,UAAUgT,MAAQ,WAC/B5S,KAAKqnB,eAAe9R,SAAQ,SAAUoS,GAAgB,OAAOA,QAE1DP,CACV,CAtCuB,GCIxB,IAHA,IAAIhhB,GAAQ,mEAERwhB,GAA+B,oBAAfxB,WAA6B,GAAK,IAAIA,WAAW,KAC5D7mB,GAAI,EAAGA,GAAI6G,GAAM1G,OAAQH,KAC9BqoB,GAAOxhB,GAAMyhB,WAAWtoB,KAAMA,GAElC,IAAIuoB,GAAS,SAAUC,GACnB,IAAyCxoB,EAArCyoB,EAAQ,IAAI5B,WAAW2B,GAAiBE,EAAMD,EAAMtoB,OAAQwoB,EAAS,GACzE,IAAK3oB,EAAI,EAAGA,EAAI0oB,EAAK1oB,GAAK,EACtB2oB,GAAU9hB,GAAM4hB,EAAMzoB,IAAM,GAC5B2oB,GAAU9hB,IAAmB,EAAX4hB,EAAMzoB,KAAW,EAAMyoB,EAAMzoB,EAAI,IAAM,GACzD2oB,GAAU9hB,IAAuB,GAAf4hB,EAAMzoB,EAAI,KAAY,EAAMyoB,EAAMzoB,EAAI,IAAM,GAC9D2oB,GAAU9hB,GAAqB,GAAf4hB,EAAMzoB,EAAI,IAQ9B,OANI0oB,EAAM,GAAM,EACZC,EAASA,EAAO3hB,UAAU,EAAG2hB,EAAOxoB,OAAS,GAAK,IAE7CuoB,EAAM,GAAM,IACjBC,EAASA,EAAO3hB,UAAU,EAAG2hB,EAAOxoB,OAAS,GAAK,MAE/CwoB,CACV,ECvBGC,GAAc,IAAIC,IAYtB,IAAIC,GAAe,SAAU9nB,EAAO4Q,EAAKvG,GACrC,GAAKrK,IACC+nB,GAAwB/nB,EAAO4Q,IAAyB,WAAjBoX,EAAOhoB,IADpD,CAGA,IACIioB,EAhBR,SAAyB5d,EAAK6d,GAC1B,IAAIC,EAAaP,GAAYhS,IAAIvL,GAQjC,OAPK8d,IACDA,EAAa,IAAIN,IACjBD,GAAYjU,IAAItJ,EAAK8d,IAEpBA,EAAW/V,IAAI8V,IAChBC,EAAWxU,IAAIuU,EAAM,IAElBC,EAAWvS,IAAIsS,EACzB,CAMcE,CAAgB/d,EADhBrK,EAAMqoB,YAAY5iB,MAEzB2Q,EAAQ6R,EAAKjkB,QAAQhE,GAKzB,OAJe,IAAXoW,IACAA,EAAQ6R,EAAK9oB,OACb8oB,EAAK1nB,KAAKP,IAEPoW,CARH,CASP,EACD,SAASkS,GAAatoB,EAAO4Q,EAAKvG,GAC9B,OAAIrK,aAAiBc,MACVd,EAAMwC,KAAI,SAAUmQ,GAAO,OAAO2V,GAAa3V,EAAK/B,EAAKvG,EAAO,IAExD,OAAVrK,EACEA,EAEFA,aAAiBuoB,cACtBvoB,aAAiBwoB,cACjBxoB,aAAiByoB,YACjBzoB,aAAiB6K,aACjB7K,aAAiB6lB,YACjB7lB,aAAiB0oB,aACjB1oB,aAAiB2oB,YACjB3oB,aAAiB4oB,WACjB5oB,aAAiB6oB,kBAEV,CACHC,QAFS9oB,EAAMqoB,YAAY5iB,KAG3BwN,KAAM,CAACrU,OAAOmqB,OAAO/oB,KAGpBA,aAAiBgpB,YAGf,CACHF,QAHS9oB,EAAMqoB,YAAY5iB,KAI3BkiB,OAHSJ,GAAOvnB,IAMfA,aAAiBipB,SAEf,CACHH,QAFS9oB,EAAMqoB,YAAY5iB,KAG3BwN,KAAM,CACFqV,GAAatoB,EAAMiL,OAAQ2F,EAAKvG,GAChCrK,EAAMkpB,WACNlpB,EAAMmpB,aAITnpB,aAAiBopB,iBAGf,CACHN,QAHS9oB,EAAMqoB,YAAY5iB,KAI3B2H,IAHMpN,EAAMoN,KAMXpN,aAAiBqpB,UAEf,CACHP,QAFS9oB,EAAMqoB,YAAY5iB,KAG3BwN,KAAM,CAACqV,GAAatoB,EAAMgL,KAAM4F,EAAKvG,GAAMrK,EAAMwK,MAAOxK,EAAM0K,SAG7Dqd,GAAwB/nB,EAAO4Q,IAAyB,WAAjBoX,EAAOhoB,GAG5C,CACH8oB,QAHS9oB,EAAMqoB,YAAY5iB,KAI3B2Q,MAHQ0R,GAAa9nB,EAAO4Q,EAAKvG,IAMlCrK,CACV,CACD,IAAIspB,GAAgB,SAAUrW,EAAMrC,EAAKvG,GACrC,OAAO5J,EAAc,GAAIN,EAAO8S,IAAO,GAAOzQ,KAAI,SAAUmQ,GAAO,OAAO2V,GAAa3V,EAAK/B,EAAKvG,EAAO,GAC3G,EACG0d,GAA0B,SAAU/nB,EAAO4Q,GAC3C,IAaI2Y,EAbwB,CACxB,kBACA,cACA,mBACA,eACA,oBACA,cACA,6BACA,eACA,uBACA,yBACA,6BAEuD9P,QAAO,SAAUhU,GAAQ,MAA4B,mBAAdmL,EAAInL,EAAuB,IAC7H,OAAOrE,QAAQmoB,EAA+B3f,MAAK,SAAUnE,GAAQ,OAAOzF,aAAiB4Q,EAAInL,EAAlF,IAClB,EC5GD,SAAS+jB,GAAiBnqB,EAAWoC,EAAMilB,EAAIjf,EAAY0N,EAAQvE,GAC/D,IAAI8G,EAAKxW,EACL8c,EAAW,GACXyL,EAAQ7qB,OAAO8qB,oBAAoBrqB,GACnCsqB,EAAU,SAAU9T,GACpB,IACI,GAA+B,mBAApBxW,EAAUwW,GACjB,MAAO,WAEX,IAAIiQ,EAAiBjS,GAAMxU,EAAWwW,GAAM,SAAUrC,GAClD,OAAO,WAEH,IADA,IAAIP,EAAO,GACF5O,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpC4O,EAAK5O,GAAMnF,UAAUmF,GAEzB,IAAIulB,EAASpW,EAAShU,MAAMC,KAAMwT,GAElC,GADA6U,GAAa8B,EAAQhZ,EAAKvR,IACrBwV,GAAUpV,KAAK2K,OAAQ3C,GAAa,CAC5B0N,EAAOlD,MAAMxS,KAAK2K,QAA3B,IACIyf,EAAaP,GAAc7oB,EAAc,GAAIN,EAAO8S,IAAO,GAAQrC,EAAKvR,GACxEqhB,EAAW,CACXjf,KAAMA,EACNgO,SAAUoG,EACV5C,KAAM4W,GAEVnD,EAAGjnB,KAAK2K,OAAQsW,EACnB,CACD,OAAOkJ,EAEd,IACD5L,EAASzd,KAAKulB,EAzBlB,CA2BA,MAAOle,GACH,IAAIkiB,EAAc3W,GAAW9T,EAAWwW,EAAM,CAC1ClC,IAAK,SAAUuL,GACXwH,EAAGjnB,KAAK2K,OAAQ,CACZ3I,KAAMA,EACNgO,SAAUoG,EACV5C,KAAM,CAACiM,GACP6K,QAAQ,GAEf,IAEL/L,EAASzd,KAAKupB,EACjB,GAEL,IACI,IAAK,IAAIE,EAAUtqB,EAAS+pB,GAAQQ,EAAYD,EAAQjqB,QAASkqB,EAAUhqB,KAAMgqB,EAAYD,EAAQjqB,OAAQ,CAEzG4pB,EADWM,EAAUjqB,MAExB,CAJL,CAMA,MAAOiZ,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQgR,IAAcA,EAAUhqB,OAASiB,EAAK8oB,EAAQ9Q,SAAShY,EAAG3B,KAAKyqB,EACtE,CACO,QAAE,GAAItS,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,OAAOwd,CACV,CC5DD,ICOIkM,GACAC,GDRAC,GAAiB,WACjB,SAASA,EAAc/iB,GACnB5H,KAAK4qB,uBAAyB,IAAIxC,IAClCpoB,KAAK6qB,UAAY,CAAEC,SAAU,EAAGC,SAAU,MAC1C/qB,KAAKmX,QAAS,EACdnX,KAAKoX,QAAS,EACdpX,KAAK+X,gBAAkB,SAAU7F,EAAQ+O,KACtBjhB,KAAK6qB,UAAUE,UAC1B/qB,KAAK6qB,UAAUC,WAAa9qB,KAAK6qB,UAAUE,WAC9B/qB,KAAK6qB,UAAUE,WAC5B/qB,KAAK6qB,UAAUE,SAAW/qB,KAAK6qB,UAAUC,UACxC9qB,KAAK4qB,uBAAuBjY,IAAIT,IACjClS,KAAK4qB,uBAAuB1W,IAAIhC,EAAQ,IAE5ClS,KAAK4qB,uBAAuBzU,IAAIjE,GAAQpR,KAAKmgB,IAEjDjhB,KAAKka,WAAatS,EAAQsS,WAC1Bla,KAAK0V,OAAS9N,EAAQ8N,QACO,IAAzB9N,EAAQY,cACRxI,KAAKgrB,2BAA2BpjB,EAAQuJ,IAAKvJ,EAAQI,WAC5D,CAgED,OA/DA2iB,EAAc/qB,UAAUgT,MAAQ,WAC5B5S,KAAK4qB,uBAAuBK,QAC5BjrB,KAAKkrB,gBAAkBlrB,KAAKkrB,kBAEhCP,EAAc/qB,UAAUic,OAAS,WAC7B7b,KAAKmX,QAAS,GAElBwT,EAAc/qB,UAAUmc,SAAW,WAC/B/b,KAAKmX,QAAS,GAElBwT,EAAc/qB,UAAUqc,KAAO,WAC3Bjc,KAAKoX,QAAS,GAElBuT,EAAc/qB,UAAUsc,OAAS,WAC7Blc,KAAKoX,QAAS,GAElBuT,EAAc/qB,UAAUorB,2BAA6B,SAAU7Z,EAAKnJ,GAChEhI,KAAKmrB,uBACLnrB,KAAKorB,oCACL,IAAIC,EE1CZ,SAAmCla,EAAKnJ,GACpC,IAAIuW,EAAW,GACf,IACI,IAAI8H,EAAiBjS,GAAMjD,EAAIma,kBAAkB1rB,UAAW,cAAc,SAAUmU,GAChF,OAAO,SAAUwX,GAEb,IADA,IAAI/X,EAAO,GACF5O,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpC4O,EAAK5O,EAAK,GAAKnF,UAAUmF,GAM7B,OAJKwQ,GAAUpV,KAAMgI,IACX,cAAehI,OACjBA,KAAK0K,UAAY6gB,GAElBxX,EAAShU,MAAMC,KAAMgB,EAAc,CAACuqB,GAAc7qB,EAAO8S,IAAO,IAE9E,IACD+K,EAASzd,KAAKulB,EAdlB,CAgBA,MAAO5kB,GACHgL,QAAQ1L,MAAM,yDACjB,CACD,OAAO,WACHwd,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CFkBgCuM,CAA0Bra,EAAKnJ,GACpDyjB,EG1CZ,SAAsCxE,EAAI9V,EAAKnJ,EAAY0N,GACvD,IAAIuC,EAAKxW,EACL8c,EAAW,GACXmN,EAAUvsB,OAAO8qB,oBAAoB9Y,EAAIwa,yBAAyB/rB,WAClEsqB,EAAU,SAAU9T,GACpB,IACI,GAA4D,mBAAjDjF,EAAIwa,yBAAyB/rB,UAAUwW,GAC9C,MAAO,WAEX,IAAIiQ,EAAiBjS,GAAMjD,EAAIwa,yBAAyB/rB,UAAWwW,GAAM,SAAUrC,GAC/E,OAAO,WAGH,IAFA,IAAII,EAAQnU,KACRwT,EAAO,GACF5O,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpC4O,EAAK5O,GAAMnF,UAAUmF,GAsBzB,OApBKwQ,GAAUpV,KAAK2K,OAAQ3C,IACxB0J,YAAW,WACP,IAAI0Y,EAAappB,EAAc,GAAIN,EAAO8S,IAAO,GACjD,GAAa,cAAT4C,GACIgU,EAAW,IACXA,EAAW,aAAckB,kBAAmB,CAC5C,IAAI3gB,EAASyf,EAAW,GACpBxf,EAAMD,EAAOE,WAAW,MACxB+gB,EAAOhhB,aAAiC,EAASA,EAAIM,aAAa,EAAG,EAAGP,EAAOI,MAAOJ,EAAOM,QAC7F4gB,EAAMD,aAAmC,EAASA,EAAKrgB,KAC3D6e,EAAW,GAAKlE,KAAKC,UAAU0F,EAClC,CAEL5E,EAAG9S,EAAMxJ,OAAQ,CACb3I,KAAMkD,EAAc,MACpB8K,SAAUoG,EACV5C,KAAM4W,GAfJ,GAiBP,GAEArW,EAAShU,MAAMC,KAAMwT,GAEnC,IACD+K,EAASzd,KAAKulB,EAlClB,CAoCA,MAAOle,GACH,IAAIkiB,EAAc3W,GAAWvC,EAAIwa,yBAAyB/rB,UAAWwW,EAAM,CACvElC,IAAK,SAAUuL,GACXwH,EAAGjnB,KAAK2K,OAAQ,CACZ3I,KAAMkD,EAAc,MACpB8K,SAAUoG,EACV5C,KAAM,CAACiM,GACP6K,QAAQ,GAEf,IAEL/L,EAASzd,KAAKupB,EACjB,GAEL,IACI,IAAK,IAAIyB,EAAY7rB,EAASyrB,GAAUK,EAAcD,EAAUxrB,QAASyrB,EAAYvrB,KAAMurB,EAAcD,EAAUxrB,OAE/G4pB,EADW6B,EAAYxrB,MAF/B,CAMA,MAAOiZ,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQuS,IAAgBA,EAAYvrB,OAASiB,EAAKqqB,EAAUrS,SAAShY,EAAG3B,KAAKgsB,EAC5E,CACO,QAAE,GAAI7T,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,OAAO,WACHwd,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CH7B2B+M,CAA6BhsB,KAAK+X,gBAAgB4F,KAAK3d,MAAOmR,EAAKnJ,EAAYhI,KAAK0V,QACpGuW,EDmBZ,SAAyChF,EAAI9V,EAAKnJ,EAAY0N,GAC1D,IAAI6I,EAAW,GAKf,OAJAA,EAASzd,KAAKf,MAAMwe,EAAUvd,EAAc,GAAIN,EAAOqpB,GAAiB5Y,EAAI+a,sBAAsBtsB,UAAWsF,EAAcinB,MAAOlF,EAAIjf,EAAY0N,EAAQvE,KAAO,SACvH,IAA/BA,EAAIib,wBACX7N,EAASzd,KAAKf,MAAMwe,EAAUvd,EAAc,GAAIN,EAAOqpB,GAAiB5Y,EAAIib,uBAAuBxsB,UAAWsF,EAAcmnB,OAAQpF,EAAIjf,EAAY0N,EAAQvE,KAAO,IAEhK,WACHoN,EAAShJ,SAAQ,SAAU0J,GAAK,OAAOA,OAE9C,CC5BmCqN,CAAgCtsB,KAAK+X,gBAAgB4F,KAAK3d,MAAOmR,EAAKnJ,EAAYhI,KAAK0V,QACnH1V,KAAKkrB,eAAiB,WAClBG,IACAI,IACAQ,MAGRtB,EAAc/qB,UAAUwrB,kCAAoC,WACxD,IAAIjX,EAAQnU,KACZusB,uBAAsB,WAAc,OAAOpY,EAAMqY,6BAAgC,KAErF7B,EAAc/qB,UAAUurB,qBAAuB,WAC3C,IAAIhX,EAAQnU,KAKZusB,uBAJ4B,SAAxBE,EAAkCC,GAClCvY,EAAM0W,UAAUC,SAAW4B,EAC3BH,sBAAsBE,OAI9B9B,EAAc/qB,UAAU4sB,4BAA8B,WAClD,IAAIrY,EAAQnU,KACZA,KAAK4qB,uBAAuBrV,SAAQ,SAAU+T,EAAQ3e,GAClD,IAAI/B,EAAKuL,EAAMuB,OAAOlD,MAAM7H,GAC5BwJ,EAAMwY,8BAA8BhiB,EAAQ/B,MAEhD2jB,uBAAsB,WAAc,OAAOpY,EAAMqY,6BAAgC,KAErF7B,EAAc/qB,UAAU+sB,8BAAgC,SAAUhiB,EAAQ/B,GACtE,IAAI5I,KAAKmX,SAAUnX,KAAKoX,OAAxB,CAGA,IAAIwV,EAAiB5sB,KAAK4qB,uBAAuBzU,IAAIxL,GACrD,GAAKiiB,IAA0B,IAARhkB,EAAvB,CAEA,IAAI0gB,EAASsD,EAAe7pB,KAAI,SAAUxC,GACtCA,EAAMyB,KAAM,IAAI6qB,EVxD5B,SAAgBvtB,EAAGsB,GACf,IAAIvB,EAAI,CAAA,EACR,IAAK,IAAIM,KAAKL,EAAOH,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,IAAMiB,EAAE2D,QAAQ5E,GAAK,IAC9EN,EAAEM,GAAKL,EAAEK,IACb,GAAS,MAALL,GAAqD,mBAAjCH,OAAO2tB,sBACtB,KAAIvtB,EAAI,EAAb,IAAgBI,EAAIR,OAAO2tB,sBAAsBxtB,GAAIC,EAAII,EAAED,OAAQH,IAC3DqB,EAAE2D,QAAQ5E,EAAEJ,IAAM,GAAKJ,OAAOS,UAAUmtB,qBAAqBjtB,KAAKR,EAAGK,EAAEJ,MACvEF,EAAEM,EAAEJ,IAAMD,EAAEK,EAAEJ,IAFF,CAIxB,OAAOF,CACV,CU8CkC2tB,CAAOzsB,EAAO,CAAC,SACtC,OAAOssB,CACV,IACG7qB,EAAO4qB,EAAe,GAAG5qB,KAC7BhC,KAAKka,WAAW,CAAEtR,GAAIA,EAAI5G,KAAMA,EAAMirB,SAAU3D,IAChDtpB,KAAK4qB,uBAAuBlP,OAAO/Q,EAP/B,CAHH,GAYEggB,CACV,CArFoB,GCIrB,SAASuC,GAAUtsB,GACf,OAAO1B,EAASA,EAAS,CAAD,EAAK0B,GAAI,CAAE8rB,UAAWtZ,KAAKD,OACtD,CAGD,IAAIuC,GTHO,CACH3S,IAAK,CADF,EAEHyP,MAAO,SAAUhT,GACb,OAAKA,GAAMA,EAAEkJ,KAGNlJ,EAAEkJ,KAAKE,IAFF,CAJb,EAQH6J,QAAS,SAAU7J,GACf,OAAO5I,KAAK+C,IAAI6F,IAAO,IATxB,EAWH8J,kBAAmB,SAAUlT,GACzB,IAAI2U,EAAQnU,KACR4I,EAAKpJ,EAAEkJ,MAAQlJ,EAAEkJ,KAAKE,UACnB5I,KAAK+C,IAAI6F,GACZpJ,EAAEyJ,YACFzJ,EAAEyJ,WAAWsM,SAAQ,SAAU4X,GAC3B,OAAOhZ,EAAMzB,kBAAkBya,KAjBxC,EAqBHxa,IAAK,SAAU/J,GACX,OAAO5I,KAAK+C,IAAIlD,eAAe+I,EAtBhC,EAwBHgK,MAAO,WACH5S,KAAK+C,IAAM,EACd,GStBT,SAASqqB,GAAOxlB,QACI,IAAZA,IAAsBA,EAAU,CAAA,GACpC,IAAIoQ,EAAOpQ,EAAQoQ,KAAMqV,EAAmBzlB,EAAQylB,iBAAkBC,EAAmB1lB,EAAQ0lB,iBAAkB7rB,EAAKmG,EAAQI,WAAYA,OAAoB,IAAPvG,EAAgB,WAAaA,EAAI0G,EAAKP,EAAQK,cAAeA,OAAuB,IAAPE,EAAgB,KAAOA,EAAIE,EAAKT,EAAQub,YAAaA,OAAqB,IAAP9a,EAAgB,YAAcA,EAAIwB,EAAKjC,EAAQZ,cAAeA,OAAuB,IAAP6C,EAAgB,UAAYA,EAAIE,EAAKnC,EAAQX,iBAAkBA,OAA0B,IAAP8C,EAAgB,KAAOA,EAAIuD,EAAK1F,EAAQM,iBAAkBA,OAA0B,IAAPoF,GAAuBA,EAAIigB,EAAgB3lB,EAAQ2lB,cAAeC,EAAoB5lB,EAAQ9F,iBAAkB2rB,EAAkB7lB,EAAQmH,eAAgB9M,EAAc2F,EAAQ3F,YAAamG,EAAaR,EAAQQ,WAAYkY,EAAQ1Y,EAAQ0Y,MAAOoN,EAAS9lB,EAAQ8lB,OAAQxe,EAAKtH,EAAQwW,SAAUA,OAAkB,IAAPlP,EAAgB,CAAhB,EAAqBA,EAAIye,EAAgB/lB,EAAQ+lB,cAAeve,EAAKxH,EAAQY,aAAcA,OAAsB,IAAP4G,GAAwBA,EAAIC,EAAKzH,EAAQwb,qBAAsBA,OAA8B,IAAP/T,GAAwBA,EAAIsB,EAAK/I,EAAQ8d,aAAcA,OAAsB,IAAP/U,GAAwBA,EAAIG,EAAKlJ,EAAQW,aAAcA,OAAsB,IAAPuI,GAAwBA,EAAI2V,EAAU7e,EAAQ6e,QAAS1V,EAAKnJ,EAAQa,gBAAiBA,OAAyB,IAAPsI,EAAgB,WAAc,OAAO,CAArC,EAAgDA,EACzyC,IAAKiH,EACD,MAAM,IAAIvB,MAAM,kCAEE5N,IAAlB8kB,QAAsD9kB,IAAvBuV,EAAS8C,YACxC9C,EAAS8C,UAAYyM,GAEzB,IAuCIC,EAvCA9rB,GAAqC,IAAlByrB,EACjB,CACEM,OAAO,EACPC,MAAM,EACN,kBAAkB,EAClBC,OAAO,EACPC,OAAO,EACPC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,KAAK,EACLlsB,MAAM,EACNmsB,MAAM,EACNlqB,KAAK,EACLmqB,MAAM,EACNC,UAAU,EACVC,QAAQ,EACRC,UAAU,QAEU5lB,IAAtB2kB,EACIA,EACA,CAAEiB,UAAU,GAClB1f,GAAqC,IAApB0e,GAAgD,QAApBA,EAC3C,CACE/d,QAAQ,EACRD,SAAS,EACTI,aAAa,EACbY,gBAAgB,EAChBV,gBAAgB,EAChBE,gBAAgB,EAChBC,mBAAmB,EACnBE,sBAAsB,EACtBD,mBAAwC,QAApBsd,EACpB3d,qBAA0C,QAApB2d,GAExBA,GAEI,ITuJd,SAAkBtc,QACF,IAARA,IAAkBA,EAAM2C,QACxB,aAAc3C,IAAQA,EAAIud,SAAS9uB,UAAU2V,UAC7CpE,EAAIud,SAAS9uB,UAAU2V,QAAUlU,MAAMzB,UAClC2V,SAEL,iBAAkBpE,IAAQA,EAAIwd,aAAa/uB,UAAU2V,UACrDpE,EAAIwd,aAAa/uB,UAAU2V,QAAUlU,MAAMzB,UACtC2V,SAEJqZ,KAAKhvB,UAAUyH,WAChBunB,KAAKhvB,UAAUyH,SAAW,SAAkBN,GACxC,KAAM,KAAKtH,WACP,MAAM,IAAIgB,UAAU,0BAExB,GACI,GAAIT,OAAS+G,EACT,OAAO,QAELA,EAAOA,GAAQA,EAAKU,YAC9B,OAAO,GAGlB,CS7KGonB,GAEA,IAAIC,EAA2B,EAuB/BrE,GAAc,SAAU7pB,EAAGmuB,GACvB,IAAIttB,EAQJ,KAPmC,QAA7BA,EAAK4a,GAAgB,UAAuB,IAAP5a,OAAgB,EAASA,EAAGua,aACnEpb,EAAEoB,OAAS+C,EAAUiqB,cACnBpuB,EAAEoB,OAAS+C,EAAUkqB,qBACnBruB,EAAE2K,KAAK8I,SAAWrP,EAAkBkqB,UACxC7S,GAAgB9G,SAAQ,SAAU4Z,GAAO,OAAOA,EAAIpT,cAExD/D,EA9BiB,SAAUpX,GAC3B,IAAIqX,EAAKxW,EACT,IACI,IAAK,IAAI0G,EAAKlI,EAASwmB,GAAW,IAAKpe,EAAKF,EAAG7H,QAAS+H,EAAG7H,KAAM6H,EAAKF,EAAG7H,OAAQ,CAC7E,IAAIomB,EAASre,EAAG9H,MACZmmB,EAAO0I,iBACPxuB,EAAI8lB,EAAO0I,eAAexuB,GAEjC,CANL,CAQA,MAAO4Y,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQnR,IAAOA,EAAG7H,OAASiB,EAAK0G,EAAGsR,SAAShY,EAAG3B,KAAKqI,EACnD,CACO,QAAE,GAAI8P,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CAID,OAHI2sB,IACA9sB,EAAI8sB,EAAO9sB,IAERA,EAUFwuB,CAAexuB,GAAImuB,GACpBnuB,EAAEoB,OAAS+C,EAAUiqB,aACrBpB,EAAwBhtB,EACxBkuB,EAA2B,OAE1B,GAAIluB,EAAEoB,OAAS+C,EAAUkqB,oBAAqB,CAC/C,GAAIruB,EAAE2K,KAAK8I,SAAWrP,EAAkBkqB,UACpCtuB,EAAE2K,KAAK4b,eACP,OAEJ2H,IACA,IAAIO,EAAc/B,GAAoBwB,GAA4BxB,EAC9DgC,EAAajC,GACbzsB,EAAE8rB,UAAYkB,EAAsBlB,UAAYW,GAChDgC,GAAeC,IACf5E,IAAiB,EAExB,GAEL,IAAI6E,EAAsB,SAAUlvB,GAChCoqB,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkBkqB,UAAY7uB,OAG3DmvB,EAAoB,SAAU7vB,GAC9B,OAAO8qB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkByqB,QAAU9vB,OAGzD+vB,EAA4B,SAAU/vB,GACtC,OAAO8qB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB2qB,gBAAkBhwB,OAGjEmZ,EAAgB,IAAIgO,GAAc,CAClC5M,WAAYqV,IAEZzT,EAAgB,IAAI6O,GAAc,CAClCniB,aAAcA,EACd0R,WAAYwV,EACZve,IAAK2C,OACL9L,WAAYA,EACZ0N,OAAQA,KAERsD,EAAmB,IAAIoO,GAAiB,CACxClN,WAAYqV,EACZpQ,SAAUqQ,EACV9e,cAAe,CACX1I,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClBiB,iBAAkBA,EAClBpG,iBAAkBA,EAClBsG,WAAYA,EACZnG,YAAaA,EACbuG,aAAcA,EACdD,aAAcA,EACd6V,SAAUA,EACVrP,eAAgBA,EAChB+J,cAAeA,EACfgD,cAAeA,GAEnBpG,OAAQA,KAEZgV,GAAmB,SAAUqE,GACzB,IAAIttB,EAAI0G,EAAIE,EAAIwB,OACG,IAAfklB,IAAyBA,GAAa,GAC1CtE,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAU6qB,KAChBrkB,KAAM,CACF5H,KAAMmQ,OAAOtC,SAAS7N,KACtBoH,MAAOkK,KACPhK,OAAQ2J,QAEZma,GACJ1S,GAAgB9G,SAAQ,SAAU4Z,GAAO,OAAOA,EAAIlT,UACpD,IAAIlS,EAAKrJ,EZwlBjB,SAAkBlB,EAAGoI,GACjB,IAAInG,EAAKmG,GAAW,CAApB,EAAwBO,EAAK1G,EAAGuG,WAAYA,OAAoB,IAAPG,EAAgB,WAAaA,EAAIE,EAAK5G,EAAGwG,cAAeA,OAAuB,IAAPI,EAAgB,KAAOA,EAAIwB,EAAKpI,EAAGuF,cAAeA,OAAuB,IAAP6C,EAAgB,UAAYA,EAAIE,EAAKtI,EAAGwF,iBAAkBA,OAA0B,IAAP8C,EAAgB,KAAOA,EAAIuD,EAAK7L,EAAGyG,iBAAkBA,OAA0B,IAAPoF,GAAuBA,EAAI4B,EAAKzN,EAAG8G,aAAcA,OAAsB,IAAP2G,GAAwBA,EAAIE,EAAK3N,EAAG+G,aAAcA,OAAsB,IAAP4G,GAAwBA,EAAIC,EAAK5N,EAAG8rB,cAAeA,OAAuB,IAAPle,GAAwBA,EAAIjH,EAAa3G,EAAG2G,WAAYnG,EAAcR,EAAGQ,YAAa0O,EAAKlP,EAAGouB,QAASA,OAAiB,IAAPlf,GAAwBA,EAAIrI,EAAiB7G,EAAG6G,eAAgBgH,EAAqB7N,EAAG6N,mBAAoBN,EAAcvN,EAAGuN,YAAaC,EAAexN,EAAGwN,aAAcE,EAAoB1N,EAAG0N,kBAAmB2B,EAAKrP,EAAGgH,gBACr2BqnB,EAAY,CAAA,EA0ChB,MAAO,CACHjhB,EAAoBrP,EAAG,CACnBgG,IAAKhG,EACLuD,IAAK+sB,EACL9nB,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClB6H,WAAW,EACX5G,iBAAkBA,EAClBpG,kBAnDiC,IAAlByrB,EACjB,CACEM,OAAO,EACPC,MAAM,EACN,kBAAkB,EAClBC,OAAO,EACPC,OAAO,EACPC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,KAAK,EACLlsB,MAAM,EACNmsB,MAAM,EACNlqB,KAAK,EACLmqB,MAAM,EACNC,UAAU,EACVC,QAAQ,EACRC,UAAU,IAEM,IAAlBlB,EACI,CACEkB,UAAU,GAEZlB,EA6BFnlB,WAAYA,EACZnG,YAAaA,EACb8M,gBA9ByB,IAAZ8gB,GAAgC,QAAZA,EAEjC,CACIngB,QAAQ,EACRD,SAAS,EACTI,aAAa,EACbY,gBAAgB,EAChBX,qBAAkC,QAAZ+f,EACtB9f,gBAAgB,EAChBE,gBAAgB,EAChBC,mBAAmB,EACnBC,oBAAoB,EACpBC,sBAAsB,IAEhB,IAAZyf,EACI,CADJ,EAEIA,EAeFvnB,eAAgBA,EAChBC,aAAcA,EACdC,aAAcA,EACd8G,mBAAoBA,EACpBN,YAAaA,EACbC,aAAcA,EACdE,kBAAmBA,EACnB1G,qBAhE24B,IAAPqI,EAAgB,WAAc,OAAO,CAArC,EAAgDA,IAkEx7Bgf,EAEP,CY7pBuBC,CAASjqB,SAAU,CAC/BkC,WAAYA,EACZC,cAAeA,EACfjB,cAAeA,EACfC,iBAAkBA,EAClBiB,iBAAkBA,EAClBqlB,cAAezrB,EACfsG,WAAYA,EACZynB,QAAS9gB,EACTvG,aAAcA,EACdD,aAAcA,EACdyG,YAAa,SAAUxP,GACfsW,GAActW,IACdsZ,EAAcC,UAAUvZ,GAExBuW,GAAcvW,IACdwZ,EAAiBC,cAAczZ,EAAEoC,WAAYkE,SAhBtB,EAmB/BmJ,aAAc,SAAUiK,EAAQC,GAC5BL,EAAcM,aAAaF,EAAQC,GACnCH,EAAiBK,oBAAoBH,EArBV,EAuB/BzQ,gBAAiBA,IACjB,GAAI1B,EAAOgD,EAAG,GAAI+lB,EAAY/lB,EAAG,GACrC,IAAKhD,EACD,OAAO0F,QAAQC,KAAK,mCAExBgJ,GAAO3S,IAAM+sB,EACbrF,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAUiqB,aAChBzjB,KAAM,CACFxE,KAAMA,EACNipB,cAAe,CACXC,UAA6BpnB,IAAvBiL,OAAOoc,YACPpc,OAAOoc,aACO,OAAbpqB,eAAkC,IAAbA,cAAsB,EAASA,SAASgP,gBAAgB5H,cAC+D,QAAzI/E,EAAkF,QAA5E1G,EAAkB,OAAbqE,eAAkC,IAAbA,cAAsB,EAASA,SAASkP,YAAyB,IAAPvT,OAAgB,EAASA,EAAG8hB,qBAAkC,IAAPpb,OAAgB,EAASA,EAAG+E,cACjK,OAAbpH,eAAkC,IAAbA,cAAsB,EAASA,SAASkP,KAAK9H,aACnE,EACRijB,SAA4BtnB,IAAvBiL,OAAOsc,YACNtc,OAAOsc,aACO,OAAbtqB,eAAkC,IAAbA,cAAsB,EAASA,SAASgP,gBAAgB1H,aAC+D,QAAzIvD,EAAkF,QAA5ExB,EAAkB,OAAbvC,eAAkC,IAAbA,cAAsB,EAASA,SAASkP,YAAyB,IAAP3M,OAAgB,EAASA,EAAGkb,qBAAkC,IAAP1Z,OAAgB,EAASA,EAAGuD,aACjK,OAAbtH,eAAkC,IAAbA,cAAsB,EAASA,SAASkP,KAAK5H,YACnE,OAIpBiP,GAAgB9G,SAAQ,SAAU4Z,GAAO,OAAOA,EAAIjT,aAExD,IACI,IAAImU,GAAa,GACjBA,GAAWvvB,KAAKkR,EAAG,oBAAoB,WACnCyY,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAUurB,iBAChB/kB,KAAM,CAAA,IAHI,KAMlB,IAAIglB,GAAY,SAAU/qB,GACtB,IAAI/D,EACJ,OAAO4e,GAAc,CACjBnG,WAAYqV,EACZ9O,YAAa,SAAUwB,EAAW5N,GAC9B,OAAOoW,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAM,CACF8I,OAAQA,EACR4N,UAAWA,KAPN,EAWjB9D,mBAAoB,SAAUvK,GAC1B,OAAO6W,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkBwrB,kBAAoB5c,KAdtD,EAiBjBuL,SAAUqQ,EACV9O,iBAAkB,SAAU9M,GACxB,OAAO6W,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkByrB,gBAAkB7c,KArBpD,EAwBjB+M,QAAS,SAAUlB,GACf,OAAOgL,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB0rB,OAASjR,KA3B3C,EA8BjBmB,mBAAoB,SAAUjhB,GAC1B,OAAO8qB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB2rB,kBAAoBhxB,KAjCtD,EAoCjBkhB,iBAAkB,SAAUlgB,GACxB,OAAO8pB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB4rB,gBAAkBjwB,KAvCpD,EA0CjBmgB,mBAAoB,SAAUngB,GAC1B,OAAO8pB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB6rB,kBAAoBlwB,KA7CtD,EAgDjBogB,iBAAkB2O,EAClB1O,OAAQ,SAAUrhB,GACd,OAAO8qB,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUkqB,oBAChB1jB,KAAMrM,EAAS,CAAEmV,OAAQrP,EAAkB8rB,MAAQnxB,KApD1C,EAuDjBqI,WAAYA,EACZmb,YAAaA,EACbnc,cAAeA,EACfC,iBAAkBA,EAClBnF,iBAAkBA,EAClBoG,iBAAkBA,EAClBkW,SAAUA,EACV5V,aAAcA,EACdD,aAAcA,EACd6a,qBAAsBA,EACtBsC,aAAcA,EACdlgB,IAAKA,EACLvD,YAAaA,EACbmG,WAAYA,EACZH,cAAeA,EACf8G,eAAgBA,EAChB2G,OAAQA,GACRoD,cAAeA,EACfE,iBAAkBA,EAClB8C,cAAeA,EACf2K,SAA2H,QAAhHhlB,EAAKglB,aAAyC,EAASA,EAAQzM,QAAO,SAAUra,GAAK,OAAOA,EAAE+d,QAAW,WAAsB,IAAPjc,OAAgB,EAASA,EAAGsB,KAAI,SAAUpD,GAAK,MAAQ,CACtL+d,SAAU/d,EAAE+d,SACZ9V,QAASjI,EAAEiI,QACX+e,SAAU,SAAU5M,GAChB,OAAO0Q,GAAYyC,GAAU,CACzBlrB,KAAM+C,EAAUgsB,OAChBxlB,KAAM,CACFmb,OAAQ/mB,EAAEqG,KACV+T,QAASA,KAGpB,EAXuJ,MAYjJ,IACZuG,IAEPxH,EAAckO,iBAAgB,SAAU/V,GACpCof,GAAWvvB,KAAKyvB,GAAUtf,EAASrD,qBAEvC,IAAIojB,GAAS,WACTtG,KACA2F,GAAWvvB,KAAKyvB,GAAUzqB,YAe9B,MAb4B,gBAAxBA,SAASuL,YACe,aAAxBvL,SAASuL,WACT2f,KAGAX,GAAWvvB,KAAKkR,EAAG,QAAQ,WACvByY,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAUksB,KAChB1lB,KAAM,CAAA,KAEVylB,OACDld,SAEA,WACHuc,GAAW9a,SAAQ,SAAU0J,GAAK,OAAOA,OAzHjD,CA4HA,MAAOle,GACH0L,QAAQC,KAAK3L,EAChB,CACJ,CACDqsB,GAAO8D,eAAiB,SAAUC,EAAKpX,GACnC,IAAK0Q,GACD,MAAM,IAAIhU,MAAM,iDAEpBgU,GAAYyC,GAAU,CAClBlrB,KAAM+C,EAAUqsB,OAChB7lB,KAAM,CACF4lB,IAAKA,EACLpX,QAASA,KAGpB,EACDqT,GAAOiE,WAAa,WAChBhV,GAAgB9G,SAAQ,SAAU4Z,GAAO,OAAOA,EAAItT,WACvD,EACDuR,GAAO1C,iBAAmB,SAAUqE,GAChC,IAAKrE,GACD,MAAM,IAAIjU,MAAM,mDAEpBiU,GAAiBqE,EACpB,EACD3B,GAAO1X,OAASA,GGvXhB,IAAI4b,GAAc,WACd,SAASA,EAAWC,GAChBvxB,KAAKwxB,SAAWD,EAAIC,UAAY,GAChCxxB,KAAKyxB,aAAeF,EAAIE,cAAgB,GACxCzxB,KAAK0xB,WAAaH,EAAIG,WACtB1xB,KAAK2xB,aAAeJ,EAAII,YAC3B,CAgBD,OAfAL,EAAW1xB,UAAUgyB,SAAW,WAC5B,IAAIF,EAAa1xB,KAAK0xB,YAAc,GAChCC,EAAe3xB,KAAK2xB,cAAgB,GACxC,OAAI3xB,KAAKyxB,aACGzxB,KAAKyxB,aACT,KACAzxB,KAAKwxB,SACL,IACAE,EACA,IACAC,EACA,IAED3xB,KAAKwxB,SAAW,IAAME,EAAa,IAAMC,GAE7CL,CACV,CAvBiB,GAwBdO,GAA8B,eAC9BC,GAAyB,iCACzBC,GAA4B,8BAC5BC,GAAmB,CACnBC,MAAO,SAAUlxB,GACb,IAAKA,EACD,MAAO,GAEX,QAAgC,IAArBA,EAAMmxB,iBACuB,IAA7BnxB,EAAM,mBACb,OAAOf,KAAKmyB,WAAWpxB,GAEtB,GAAIA,EAAM0D,OAAS1D,EAAM0D,MAAM4B,MAAMyrB,IACtC,OAAO9xB,KAAKoyB,YAAYrxB,GAEvB,GAAIA,EAAM0D,MACX,OAAOzE,KAAKqyB,gBAAgBtxB,GAG5B,MAAM,IAAI0V,MAAM,kCAhBL,EAmBnB6b,gBAAiB,SAAUC,GACvB,IAA8B,IAA1BA,EAAQhuB,QAAQ,KAChB,MAAO,CAACguB,GAEZ,IACI7tB,EADS,+BACM4B,KAAKisB,EAAQ3uB,QAAQ,QAAS,KACjD,IAAKc,EACD,MAAM,IAAI+R,MAAM,2BAA2BlV,OAAOgxB,IACtD,MAAO,CAAC7tB,EAAM,GAAIA,EAAM,SAAMmE,EAAWnE,EAAM,SAAMmE,EA3BtC,EA6BnBupB,YAAa,SAAUrxB,GAInB,OAHeA,EAAM0D,MAAMD,MAAM,MAAMwV,QAAO,SAAUwY,GACpD,QAASA,EAAKnsB,MAAMyrB,GADT,GAEZ9xB,MACa+C,KAAI,SAAUyvB,GACtBA,EAAKjuB,QAAQ,WAAa,IAC1BiuB,EAAOA,EACF5uB,QAAQ,aAAc,QACtBA,QAAQ,+BAAgC,KAEjD,IAAI6uB,EAAgBD,EAAK5uB,QAAQ,OAAQ,IAAIA,QAAQ,eAAgB,KACjE4N,EAAWihB,EAAcpsB,MAAM,4BAI/BqsB,GAHJD,EAAgBjhB,EACVihB,EAAc7uB,QAAQ4N,EAAS,GAAI,IACnCihB,GACqBjuB,MAAM,OAAOlD,MAAM,GAC1CqxB,EAAgB3yB,KAAKsyB,gBAAgB9gB,EAAWA,EAAS,GAAKkhB,EAAO/tB,OACrE8sB,EAAeiB,EAAOzvB,KAAK,WAAQ4F,EACnC2oB,EAAW,CAAC,OAAQ,eAAejtB,QAAQouB,EAAc,KAAO,OAC9D9pB,EACA8pB,EAAc,GACpB,OAAO,IAAIrB,GAAW,CAClBG,aAAcA,EACdD,SAAUA,EACVE,WAAYiB,EAAc,GAC1BhB,aAAcgB,EAAc,IArB7B,GAuBJ3yB,KAxDY,EA0DnBqyB,gBAAiB,SAAUtxB,GAIvB,OAHeA,EAAM0D,MAAMD,MAAM,MAAMwV,QAAO,SAAUwY,GACpD,OAAQA,EAAKnsB,MAAM0rB,GADR,GAEZ/xB,MACa+C,KAAI,SAAUyvB,GAI1B,GAHIA,EAAKjuB,QAAQ,YAAc,IAC3BiuB,EAAOA,EAAK5uB,QAAQ,mDAAoD,SAEjD,IAAvB4uB,EAAKjuB,QAAQ,OAAsC,IAAvBiuB,EAAKjuB,QAAQ,KACzC,OAAO,IAAI+sB,GAAW,CAClBG,aAAce,IAIlB,IAAII,EAAoB,6BACpBprB,EAAUgrB,EAAKnsB,MAAMusB,GACrBnB,EAAejqB,GAAWA,EAAQ,GAAKA,EAAQ,QAAKqB,EACpD8pB,EAAgB3yB,KAAKsyB,gBAAgBE,EAAK5uB,QAAQgvB,EAAmB,KACzE,OAAO,IAAItB,GAAW,CAClBG,aAAcA,EACdD,SAAUmB,EAAc,GACxBjB,WAAYiB,EAAc,GAC1BhB,aAAcgB,EAAc,IAlBjC,GAqBJ3yB,KAnFY,EAqFnBmyB,WAAY,SAAUvxB,GAClB,OAAKA,EAAEsxB,YACFtxB,EAAEiyB,QAAQtuB,QAAQ,OAAS,GACxB3D,EAAEiyB,QAAQruB,MAAM,MAAM9E,OAASkB,EAAEsxB,WAAW1tB,MAAM,MAAM9E,OACrDM,KAAK8yB,YAAYlyB,GAElBA,EAAE6D,MAIDzE,KAAK+yB,aAAanyB,GAHlBZ,KAAKgzB,aAAapyB,EA5Fd,EAkGnBkyB,YAAa,SAAUlyB,GAInB,IAHA,IAAIqyB,EAAS,oCACTC,EAAQtyB,EAAEiyB,QAAQruB,MAAM,MACxB2lB,EAAS,GACJ5qB,EAAI,EAAG0oB,EAAMiL,EAAMxzB,OAAQH,EAAI0oB,EAAK1oB,GAAK,EAAG,CACjD,IAAI8G,EAAQ4sB,EAAO3sB,KAAK4sB,EAAM3zB,IAC1B8G,GACA8jB,EAAOrpB,KAAK,IAAIwwB,GAAW,CACvBE,SAAUnrB,EAAM,GAChBqrB,WAAYyB,WAAW9sB,EAAM,MAGxC,CACD,OAAO8jB,CA/GQ,EAiHnB6I,aAAc,SAAUpyB,GAIpB,IAHA,IAAIqyB,EAAS,6DACTC,EAAQtyB,EAAEsxB,WAAW1tB,MAAM,MAC3B2lB,EAAS,GACJ5qB,EAAI,EAAG0oB,EAAMiL,EAAMxzB,OAAQH,EAAI0oB,EAAK1oB,GAAK,EAAG,CACjD,IAAI8G,EAAQ4sB,EAAO3sB,KAAK4sB,EAAM3zB,IAC1B8G,GACA8jB,EAAOrpB,KAAK,IAAIwwB,GAAW,CACvBG,aAAcprB,EAAM,SAAMwC,EAC1B2oB,SAAUnrB,EAAM,GAChBqrB,WAAYyB,WAAW9sB,EAAM,MAGxC,CACD,OAAO8jB,CA/HQ,EAiInB4I,aAAc,SAAUhyB,GAKpB,OAJeA,EAAM0D,MAAMD,MAAM,MAAMwV,QAAO,SAAUwY,GACpD,QAAUA,EAAKnsB,MAAMwrB,MAChBW,EAAKnsB,MAAM,oBAFL,GAGZrG,MACa+C,KAAI,SAAUyvB,GAC1B,IAAIE,EAASF,EAAKhuB,MAAM,KACpBmuB,EAAgB3yB,KAAKsyB,gBAAgBI,EAAO/tB,OAE5C8sB,GADeiB,EAAOpZ,SAAW,IAEhC1V,QAAQ,iCAAkC,MAC1CA,QAAQ,aAAc,UAAOiF,EAClC,OAAO,IAAIyoB,GAAW,CAClBG,aAAcA,EACdD,SAAUmB,EAAc,GACxBjB,WAAYiB,EAAc,GAC1BhB,aAAcgB,EAAc,IAX7B,GAaJ3yB,KACN,GC7KL,SAASozB,GAAersB,GACpB,IAAKA,IAASA,EAAKssB,UACf,MAAO,GAGX,IADA,IAAItW,EAAO,GACJhW,EAAKwc,eAAe,CACvB,IAAIvZ,EAASjD,EAAKusB,UAClB,IAAKtpB,EACD,MAEJA,EAASA,EAAO7H,cAChB,IAAIoxB,EAAWxsB,EAAKwc,cAChBiQ,EAAc,GAClB,GAAID,EAASE,UAAYF,EAASE,SAAS/zB,OAAS,EAChD,IAAK,IAAIH,EAAI,EAAGA,EAAIg0B,EAASE,SAAS/zB,OAAQH,IAAK,CAC/C,IAAIm0B,EAAUH,EAASE,SAASl0B,GAC5Bm0B,EAAQJ,WAAaI,EAAQJ,UAAUnxB,aACnCuxB,EAAQJ,UAAUnxB,gBAAkB6H,GACpCwpB,EAAY1yB,KAAK4yB,EAG5B,CAEDF,EAAY9zB,OAAS,IACrBsK,GAAU,OAASwpB,EAAYjvB,QAAQwC,GAAQ,KAEnDgW,EAAO/S,GAAU+S,EAAO,IAAMA,EAAO,IACrChW,EAAOwsB,CACV,CACD,OAAOxW,CACV,CACD,SAAS4W,GAASpC,GACd,MAA+C,oBAAxCpyB,OAAOS,UAAUgyB,SAAS9xB,KAAKyxB,EACzC,CACD,SAASqC,GAAarC,EAAKsC,GACvB,IAAI5b,EAAKxW,EACT,GAAc,IAAVoyB,EACA,OAAO,EAEX,IAAIrV,EAAOrf,OAAOqf,KAAK+S,GACvB,IACI,IAAK,IAAIuC,EAAS7zB,EAASue,GAAOuV,EAAWD,EAAOxzB,QAASyzB,EAASvzB,KAAMuzB,EAAWD,EAAOxzB,OAAQ,CAClG,IAAIqT,EAAMogB,EAASxzB,MACnB,GAAIozB,GAASpC,EAAI5d,KAASigB,GAAarC,EAAI5d,GAAMkgB,EAAQ,GACrD,OAAO,CAEd,CANL,CAQA,MAAOra,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQua,IAAaA,EAASvzB,OAASiB,EAAKqyB,EAAOra,SAAShY,EAAG3B,KAAKg0B,EACnE,CACO,QAAE,GAAI7b,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,OAAO,CACV,CACD,SAASolB,GAAUoL,EAAKyC,GACpB,IAAIpsB,EAAU,CACVqsB,eAAgB,GAChBC,aAAc,GAElB/0B,OAAOC,OAAOwI,EAASosB,GACvB,IAAIvvB,EAAQ,GACR+Z,EAAO,GACX,OAAO0H,KAAKC,UAAUoL,GAAK,SAAU5d,EAAKpT,GACtC,GAAIkE,EAAM/E,OAAS,EAAG,CAClB,IAAIy0B,EAAU1vB,EAAMF,QAAQvE,OAC3Bm0B,EAAU1vB,EAAM2vB,OAAOD,EAAU,GAAK1vB,EAAM3D,KAAKd,OACjDm0B,EAAU3V,EAAK4V,OAAOD,EAASE,IAAU1gB,GAAO6K,EAAK1d,KAAK6S,IACtDlP,EAAMF,QAAQhE,KAEXA,EADAkE,EAAM,KAAOlE,EACL,eAIJ,eACIie,EAAKld,MAAM,EAAGmD,EAAMF,QAAQhE,IAAQ0C,KAAK,KACzC,IAGnB,MAEGwB,EAAM3D,KAAKP,GAEf,GAAIA,QACA,OAAOA,EAEX,GA6BJ,SAAsB+zB,GAClB,GAAIX,GAASW,IAASn1B,OAAOqf,KAAK8V,GAAM50B,OAASkI,EAAQqsB,eACrD,OAAO,EAEX,GAAoB,mBAATK,EACP,OAAO,EAEX,GAAIX,GAASW,IAASV,GAAaU,EAAM1sB,EAAQssB,cAC7C,OAAO,EAEX,OAAO,CACV,CAxCOK,CAAah0B,GACb,OAwCR,SAAkB+zB,GACd,IAAIE,EAAMF,EAAK1C,WACXhqB,EAAQ6sB,mBAAqBD,EAAI90B,OAASkI,EAAQ6sB,oBAClDD,EAAM,GAAGjzB,OAAOizB,EAAIlzB,MAAM,EAAGsG,EAAQ6sB,mBAAoB,QAE7D,OAAOD,CACV,CA9Cc5C,CAASrxB,GAEpB,GAAIA,aAAiBm0B,MAAO,CACxB,IAAIC,EAAc,CAAA,EAClB,IAAK,IAAIhW,KAAYpe,EAAO,CACxB,IAAIq0B,EAAar0B,EAAMoe,GACnBtd,MAAMwzB,QAAQD,GACdD,EAAYhW,GAAYyU,GAAewB,EAAWl1B,OAASk1B,EAAW,GAAK,MAG3ED,EAAYhW,GAAYiW,CAE/B,CACD,OAAOD,CACV,CACI,OAAIp0B,aAAiBquB,KAClBruB,aAAiBgnB,YACVhnB,EAAQA,EAAM8yB,UAAY,GAE9B9yB,EAAMu0B,SAERv0B,aAAiBkW,MACflW,EAAMkE,MACPlE,EAAMkE,MAAQ,kCACdlE,EAAMyF,KAAO,KAAOzF,EAAMsyB,QAE7BtyB,CACV,GAoBJ,CCrID,IAAIw0B,GAAoB,CACpBC,MAAO,CACH,SACA,QACA,QACA,aACA,QACA,MACA,SACA,QACA,QACA,iBACA,WACA,OACA,MACA,QACA,OACA,UACA,UACA,QACA,QAEJC,gBAAiB,IACjBC,OAAQ,WAEZ,SAASC,GAAgBlO,EAAI9V,EAAKikB,GAC9B,IAAInd,EAAKxW,EAKLyzB,EAJAG,EAAaD,EAAWF,OAC5B,IAAKG,EACD,OAAO,WAAY,EAInBH,EADsB,iBAAfG,EACElkB,EAAIkkB,GAGJA,EAEb,IAAIC,EAAW,EACXC,EAAiB,GACrB,GAAIH,EAAWJ,MAAMQ,SAAS,UACtB1hB,OAAQ,CACR,IAAI2hB,EAAiB,SAAU7f,GAC3B,IAAIid,EAAUjd,EAAMid,QAAS9xB,EAAQ6U,EAAM7U,MACvC20B,EAAQ1D,GAAiBC,MAAMlxB,GAAOgC,KAAI,SAAU4yB,GAAc,OAAOA,EAAW/D,UAAa,IACjG7X,EAAU,CAACoM,GAAU0M,EAASuC,EAAWpB,mBAC7C/M,EAAG,CACC+N,MAAO,QACPU,MAAOA,EACP3b,QAASA,KAGjBjG,OAAOrC,iBAAiB,QAASgkB,GACjCF,EAAez0B,MAAK,WACZgT,QACAA,OAAOzB,oBAAoB,QAASojB,KAE/C,CAEL,IACI,IAAK,IAAIttB,EAAKlI,EAASm1B,EAAWJ,OAAQ3sB,EAAKF,EAAG7H,QAAS+H,EAAG7H,KAAM6H,EAAKF,EAAG7H,OAAQ,CAChF,IAAIs1B,EAAYvtB,EAAG9H,MACnBg1B,EAAez0B,KAAK8C,EAAQsxB,EAAQU,GACvC,CAJL,CAMA,MAAOpc,GAASvB,EAAM,CAAElX,MAAOyY,EAAU,CACjC,QACJ,IACQnR,IAAOA,EAAG7H,OAASiB,EAAK0G,EAAGsR,SAAShY,EAAG3B,KAAKqI,EACnD,CACO,QAAE,GAAI8P,EAAK,MAAMA,EAAIlX,KAAQ,CACxC,CACD,OAAO,WACHw0B,EAAehgB,SAAQ,SAAU0J,GAAK,OAAOA,QAEjD,SAASrb,EAAQiyB,EAASb,GACtB,IAAI7gB,EAAQnU,KACZ,OAAK61B,EAAQb,GAGN5gB,GAAMyhB,EAASb,GAAO,SAAUjhB,GACnC,OAAO,WAEH,IADA,IAAIP,EAAO,GACF5O,EAAK,EAAGA,EAAKnF,UAAUC,OAAQkF,IACpC4O,EAAK5O,GAAMnF,UAAUmF,GAEzBmP,EAAShU,MAAMoU,EAAOX,GACtB,IACI,IAAIkiB,EAAQ1D,GAAiBC,MAAM,IAAIxb,OAClC1T,KAAI,SAAU4yB,GAAc,OAAOA,EAAW/D,UAAa,IAC3DwC,OAAO,GACRra,EAAUvG,EAAKzQ,KAAI,SAAUzD,GAC7B,OAAO6mB,GAAU7mB,EAAG81B,EAAWpB,iBAClC,MACDsB,EACeF,EAAWH,gBACtBhO,EAAG,CACC+N,MAAOA,EACPU,MAAOA,EACP3b,QAASA,IAGRub,IAAaF,EAAWH,iBAC7BhO,EAAG,CACC+N,MAAO,OACPU,MAAO,GACP3b,QAAS,CACLoM,GAAU,sDApB1B,CAyBA,MAAOplB,GACHgT,EAAShU,WAAM,EAAQiB,EAAc,CAAC,sBAAuBD,GAAQL,EAAO8S,IAAO,GACtF,EAER,IAtCU,WAAY,CAuC1B,CACJ,CACD,IChHMrC,GAAoD,oBAAX2C,OAAyBA,OAAU,CAAA,EAEjFgiB,GAAaC,MAAQ,CAAE3I,OAAQ4I,GAAaC,QAAS,KAAMC,sBAC3DJ,GAAaK,mBAAqB,CAAEC,uBD8GR,SAAUxuB,GAAW,MAAQ,CACtD5B,KAFc,kBAGd0X,SAAUyX,GACVvtB,QAASA,EACHzI,OAAOC,OAAO,CAAA,EAAI21B,GAAmBntB,GACrCmtB,GACL,OE/HCsB,GAAS,CACXC,OAAO,EACPC,sBCEEC,GAAan1B,MAAMzB,UACnB62B,GAAWt3B,OAAOS,UAClBgyB,GAAW6E,GAAS7E,SACpB/xB,GAAiB42B,GAAS52B,eAC1BsR,GAAoD,oBAAX2C,OAAyBA,OAAU,CAAA,EAC5E4iB,GAAYvlB,GAAIulB,WAAa,CAAEC,UAAW,IAC1C7wB,GAAWqL,GAAIrL,UAAY,GAC3B6wB,GAAYD,GAAUC,UACtBC,GAAe,CAAC,YAAa,aAE7BC,GAAgBL,GAAWjhB,QAC7BuhB,GAAgBN,GAAWjyB,QAC3BwyB,GAAgB11B,MAAMwzB,QACtBmC,GAAmB,CAAA,EAGjB9B,GAAS,CAEX+B,IAAK,WACD,GAAIZ,GAAOC,QAAUY,GAAapjB,OAAOrH,UAAYqH,OAAOrH,QAAS,CAAA,IAEjE,IAAMwqB,GACF,uBAAwBnjB,OAAOrH,QAAQwqB,IAChCnjB,OAAOrH,QAAQwqB,IAAhB,mBACAnjB,OAAOrH,QAAQwqB,KALwCE,EAAA13B,UAAAC,OADvD8T,EACuD,IAAAnS,MAAA81B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IADvD5jB,EACuD4jB,GAAA33B,UAAA23B,GAOjE,IACIH,EAAIl3B,MAAM+T,OAAOrH,QAAS+G,EAD9B,CAEE,MAAOhH,GACL6qB,GAAW7jB,GAAM,SAAUN,GACvB+jB,EAAI/jB,EACP,GACJ,CACJ,CAjBM,EAoBXnS,MAAO,WACH,GAAIs1B,GAAOC,QAAUY,GAAapjB,OAAOrH,UAAYqH,OAAOrH,QAAS,CAAA,IAAA,IAAA6qB,EAAA73B,UAAAC,OADrD63B,EACqD,IAAAl2B,MAAAi2B,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IADrDD,EACqDC,GAAA/3B,UAAA+3B,GACjE,IAAMhkB,EAAQ,CAAA,yBAAqB+jB,GAE7Bx2B,EACF,uBAAwB+S,OAAOrH,QAAQ1L,MAChC+S,OAAOrH,QAAQ1L,MAAhB,mBACA+S,OAAOrH,QAAQ1L,MACzB,IACIA,EAAMhB,MAAM+T,OAAOrH,QAAS+G,EADhC,CAEE,MAAOhH,GACL6qB,GAAW7jB,GAAM,SAAUN,GACvBnS,EAAMmS,EACT,GACJ,CACJ,CAnCM,EAsCXukB,SAAU,WACN,IAAKP,GAAapjB,OAAOrH,UAAYqH,OAAOrH,QAAS,CAAA,IAAA,IAAAirB,EAAAj4B,UAAAC,OADlC63B,EACkC,IAAAl2B,MAAAq2B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IADlCJ,EACkCI,GAAAl4B,UAAAk4B,GACjD,IAAMnkB,EAAQ,CAAA,yBAAqB+jB,GAE7Bx2B,EACF,uBAAwB+S,OAAOrH,QAAQ1L,MAChC+S,OAAOrH,QAAQ1L,MAAhB,mBACA+S,OAAOrH,QAAQ1L,MACzB,IACIA,EAAMhB,MAAM+T,OAAOrH,QAAS+G,EADhC,CAEE,MAAOhH,GACL6qB,GAAW7jB,GAAM,SAAUN,GACvBnS,EAAMmS,EACT,GACJ,CACJ,CArDM,EAuDX0kB,oBAAqB,SAAUC,GACvBxB,GAAOC,QAAUY,GAAapjB,OAAOrH,UAAYqH,OAAOrH,SACxDyoB,GAAOn0B,MAAP,wDAAAQ,OAAqEs2B,GAE5E,GAKQC,GAAQ,SAAUtD,GAC3B,OAAOA,EAAI5wB,QAAQ,qCAAsC,GAC5D,EAUM,SAASyzB,GACZ9F,EACAnxB,EACA23B,GAEA,GAAI12B,MAAMwzB,QAAQtD,GACd,GAAIsF,IAAiBtF,EAAIhc,UAAYshB,GACjCtF,EAAIhc,QAAQnV,EAAU23B,QACnB,GAAI,WAAYxG,GAAOA,EAAI7xB,UAAY6xB,EAAI7xB,OAC9C,IAAK,IAAIH,EAAI,EAAG6B,EAAImwB,EAAI7xB,OAAQH,EAAI6B,EAAG7B,IACnC,GAAIA,KAAKgyB,GAAOnxB,EAASN,KAAKi4B,EAASxG,EAAIhyB,GAAIA,KAAOy3B,GAClD,MAKnB,CAOM,SAASgB,GAAMzG,EAAUnxB,EAAoD23B,GAChF,GAAIxG,QAAJ,CAGA,GAAIlwB,MAAMwzB,QAAQtD,GACd,OAAO8F,GAAW9F,EAAKnxB,EAAU23B,GAErC,IAAK,IAAMpkB,KAAO4d,EACd,GAAI1xB,GAAeC,KAAKyxB,EAAK5d,IACrBvT,EAASN,KAAKi4B,EAASxG,EAAI5d,GAAMA,KAASqjB,GAC1C,MAPX,CAWJ,CAEM,IAAMiB,GAAU,SAAU1G,GAA+E,IAAA,IAAA2G,EAAAz4B,UAAAC,OAAlD8T,EAAkD,IAAAnS,MAAA62B,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAlD3kB,EAAkD2kB,EAAA,GAAA14B,UAAA04B,GAQ5G,OAPAd,GAAW7jB,GAAM,SAAUa,GACvB,IAAK,IAAM+B,KAAQ/B,OACM,IAAjBA,EAAO+B,KACPmb,EAAInb,GAAQ/B,EAAO+B,GAG9B,IACMmb,CACV,EAEY6G,GACTrB,IACA,SAAUxF,GACN,MAA8B,mBAAvBK,GAAS9xB,KAAKyxB,EACxB,EAKQ8G,GAAc,SAAUC,GACjC,IACI,MAAO,mBAAmBh0B,KAAKg0B,EADnC,CAEE,MAAOxtB,GACL,OAAO,CACV,CACJ,EAsBM,SAASytB,GAAmB/D,EAAmBgE,GAClD,OAAyC,IAAjChE,EAAYjwB,QAAQi0B,EAC/B,CAkBM,IAAMC,GAAY,SAAUlH,GAC/B,OAAOA,IAAQpyB,OAAOoyB,KAAS6G,GAAS7G,EAC3C,EAcY2F,GAAe,SAAU3F,GAClC,YAAe,IAARA,CACV,EAEYmH,GAAY,SAAUnH,GAC/B,MAA6B,mBAAtBK,GAAS9xB,KAAKyxB,EACxB,EAMYoH,GAAY,SAAUpH,GAC/B,MAA6B,mBAAtBK,GAAS9xB,KAAKyxB,EACxB,EAaYqH,GAAa,WAMtB,OALAxlB,KAAKD,IACDC,KAAKD,KACL,WACI,OAAQ,IAAIC,MAEbA,KAAKD,KACf,EAsBY0lB,GAAY,SAAuEP,GAC5F,OAAO,WACH,IAAI,IAAA,IAAAQ,EAAAr5B,UAAAC,OADY8T,EACZ,IAAAnS,MAAAy3B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IADYvlB,EACZulB,GAAAt5B,UAAAs5B,GAGA,OAAOT,EAAEv4B,MAAMC,KAAMwT,EAHzB,CAIE,MAAO5S,GACLs0B,GAAOuC,SAAS,+EAChBvC,GAAOuC,SAAS72B,EACnB,EAER,EAiBYo4B,GAA0B,SAAUr5B,GAC7C,IAAMs5B,EAAkB,CAAA,EAMxB,OALAjB,GAAMr4B,GAAG,SAAU8f,EAAGyZ,GACdR,GAAUjZ,IAAMA,EAAE/f,OAAS,IAC3Bu5B,EAAIC,GAAKzZ,EAEhB,IACMwZ,CACV,EA0CD,IAAME,GAA0B,CAAC,oBAE1B,SAASC,GACZC,EACAC,GAEA,OApCA/4B,EAoCwB84B,EAnCxBE,EAmCgC,SAACh5B,EAAYoT,GACzC,OAAIA,GAAOwlB,GAAwB50B,QAAQoP,IAAkB,EAClDpT,EAEU,iBAAVA,GAA0C,OAApB+4B,EACrB/4B,EAAiBe,MAAM,EAAGg4B,GAE/B/4B,CACV,EAzCKi5B,EAAuB,IAAI9hB,IAEjC,SAAS+hB,EAAyBl5B,EAAUoT,GACxC,OAAIpT,IAAUpB,OAAOoB,GAAeg5B,EAAaA,EAAWh5B,EAAcoT,GAAOpT,EAE7Ei5B,EAAqB7mB,IAAIpS,QAA7B,GACAi5B,EAAqB7f,IAAIpZ,GAGrB63B,GAAS73B,IACT4pB,EAAS,GACTkN,GAAW92B,GAAO,SAACm5B,GACfvP,EAAOrpB,KAAK24B,EAAyBC,GACxC,MAEDvP,EAAS,CAAA,EACT6N,GAAMz3B,GAAO,SAACo5B,EAAKhmB,GACV6lB,EAAqB7mB,IAAIgnB,KACxBxP,EAAexW,GAAO8lB,EAAyBE,EAAKhmB,GAE7D,KAEEwW,GAfP,IAAIA,CAgBP,CACMsP,CAAyBl5B,GA5BpC,IACIA,EACAg5B,EAEMC,CA0CT,CAKM,SAASI,GAAcruB,GAC1B,IAIIsuB,EACAC,EACAC,EACAC,EACAC,EAREC,EAAM,oEASR36B,EAAI,EACJ46B,EAAK,EACLC,EAAM,GACJC,EAAoB,GAE1B,IAAK9uB,EACD,OAAOA,EAGXA,EAAO+uB,GAAY/uB,GAEnB,GAQIsuB,GAFAI,EAJK1uB,EAAKsc,WAAWtoB,MAIP,GAHTgM,EAAKsc,WAAWtoB,MAGM,EAFtBgM,EAAKsc,WAAWtoB,OAIP,GAAM,GACpBu6B,EAAMG,GAAQ,GAAM,GACpBF,EAAME,GAAQ,EAAK,GACnBD,EAAY,GAAPC,EAGLI,EAAQF,KAAQD,EAAItzB,OAAOizB,GAAMK,EAAItzB,OAAOkzB,GAAMI,EAAItzB,OAAOmzB,GAAMG,EAAItzB,OAAOozB,SACzEz6B,EAAIgM,EAAK7L,QAIlB,OAFA06B,EAAMC,EAAQp3B,KAAK,IAEXsI,EAAK7L,OAAS,GAClB,KAAK,EACD06B,EAAMA,EAAI94B,MAAM,GAAI,GAAK,KACzB,MACJ,KAAK,EACD84B,EAAMA,EAAI94B,MAAM,GAAI,GAAK,IAIjC,OAAO84B,CACV,CAEM,IAAME,GAAc,SAAUC,GAGjC,IACIC,EACAC,EACAC,EACAl7B,EAJAm7B,EAAU,GASd,IAHAH,EAAQC,EAAM,EACdC,GATAH,GAAUA,EAAS,IAAI32B,QAAQ,QAAS,MAAMA,QAAQ,MAAO,OAS5ClE,OAEZF,EAAI,EAAGA,EAAIk7B,EAASl7B,IAAK,CAC1B,IAAMo7B,EAAKL,EAAO1S,WAAWroB,GACzB46B,EAAM,KAENQ,EAAK,IACLH,IAEAL,EADOQ,EAAK,KAAOA,EAAK,KAClBC,OAAOC,aAAcF,GAAM,EAAK,IAAW,GAALA,EAAW,KAEjDC,OAAOC,aAAcF,GAAM,GAAM,IAAOA,GAAM,EAAK,GAAM,IAAW,GAALA,EAAW,KAExE,OAARR,IACIK,EAAMD,IACNG,GAAWJ,EAAOh0B,UAAUi0B,EAAOC,IAEvCE,GAAWP,EACXI,EAAQC,EAAMj7B,EAAI,EAEzB,CAMD,OAJIi7B,EAAMD,IACNG,GAAWJ,EAAOh0B,UAAUi0B,EAAOD,EAAO76B,SAGvCi7B,CACV,EAEYI,GAA0B,CACnC,YACA,WACA,cACA,UACA,cACA,UACA,UACA,UACA,cACA,mBACA,kBACA,SACA,UACA,cACA,UACA,WACA,YACA,YACA,WACA,iBACA,aACA,WACA,aACA,eACA,YAIA,gBACA,cACA,mBACA,qBACA,iBACA,qBACA,oBACA,YACA,iBACA,uBACA,mBAMSC,GAAe,SAAUC,EAAYC,GAC9C,OAAOH,GAAwBx5B,OAAO25B,GAAyBzvB,MAAK,SAAC0vB,GACjE,OAAIF,EAAGzF,SACIyF,EAAGzF,SAAS2F,IAGe,IAA3BF,EAAG12B,QAAQ42B,EAEzB,GACJ,EAoBYC,GAAiB,SAAUj3B,EAAak3B,GAGjD,IAAMC,EAAaD,EAAMz3B,QAAQ,MAAO,OAAOA,QAAQ,OAAQ,OAGzD23B,EADQ,IAAI74B,OADH,SAAW44B,EAAa,aAEjBh1B,KAAKnC,GAC3B,GAAgB,OAAZo3B,GAAqBA,GAAiC,iBAAfA,EAAQ,IAAoBA,EAAQ,GAAW77B,OACtF,MAAO,GAEP,IAAIyqB,EAASoR,EAAQ,GACrB,IACIpR,EAASqR,mBAAmBrR,EADhC,CAEE,MAAO3d,GACL0oB,GAAOn0B,MAAM,gDAAkDopB,EAClE,CACD,OAAOA,EAAOvmB,QAAQ,MAAO,IAEpC,EAEY63B,GAAgB,SAAUC,EAAcL,GACjD,IAAM7zB,EAAUk0B,EAAKr1B,MAAM,IAAI3D,OAAO24B,EAAQ,aAC9C,OAAO7zB,EAAUA,EAAQ,GAAK,IACjC,EAEYm0B,GAAmB,WAqE5B,SAASC,EAAShmB,GAKd,OAJIA,IACAA,EAAMimB,eAAiBD,EAASC,eAChCjmB,EAAMkmB,gBAAkBF,EAASE,iBAE9BlmB,CACV,CAQD,OAPAgmB,EAASC,eAAiB,WACpB77B,KAAsB+7B,aAAc,GAE1CH,EAASE,gBAAkB,WACrB97B,KAAsBg8B,cAAe,GAjEpB,SACnBzyB,EACAvH,EACA6c,EACAod,EACAC,GAEA,GAAK3yB,EAKL,GAAIA,EAAQkI,mBAAqBwqB,EAC7B1yB,EAAQkI,iBAAiBzP,EAAM6c,IAAWqd,OACvC,CACH,IAAMC,EAAS,KAAOn6B,EAChBo6B,EAAe7yB,EAAgB4yB,GACnC5yB,EAAgB4yB,GAI1B,SACI5yB,EACA8yB,EACAC,GAEA,OAAO,SAAU1mB,GAQb,GAPAA,EAAQA,GAASgmB,EAAS9nB,OAAO8B,OAOjC,CAIA,IACI2mB,EADAtD,GAAM,EAGNZ,GAAYiE,KACZC,EAAaD,EAAa1mB,IAE9B,IAAM4mB,EAAaH,EAAYv8B,KAAKyJ,EAASqM,GAM7C,OAJI,IAAU2mB,IAAc,IAAUC,IAClCvD,GAAM,GAGHA,CAdN,EAgBR,CAnCmCwD,CAAYlzB,EAASsV,EAASud,EAC7D,MAVGlH,GAAOn0B,MAAM,+CA6DxB,CApF+B,GA0FzB,SAAS27B,GAAWC,EAAyBhW,GAChD,IAAMiW,EAAY,WACd,IAAMC,EAAY/2B,GAASF,cAAc,UACzCi3B,EAAU76B,KAAO,kBACjB66B,EAAUlvB,IAAMgvB,EAChBE,EAAUhwB,OAAS,SAAC+I,GAAD,OAAW+Q,OAAS9d,EAAW+M,IAClDinB,EAAUC,QAAU,SAAC/7B,GAAD,OAAW4lB,EAAS5lB,IAExC,IACwBg8B,EADlBC,EAAUl3B,GAAS4d,iBAAiB,iBACtCsZ,EAAQt9B,OAAS,EACjB,QAAAq9B,EAAAC,EAAQ,GAAGv1B,kBAAX,IAAAs1B,GAAAA,EAAuBE,aAAaJ,EAAWG,EAAQ,IAGvDl3B,GAASkP,KAAKkoB,YAAYL,IAI9B/2B,GAASkP,KACT4nB,IAEA92B,GAAS2L,iBAAiB,mBAAoBmrB,EAErD,CAEM,IAAMO,GAAQ,CACjBC,eAAgB,SAAUC,GACtB,IAAMC,EAAoB,CACtB,aACA,aACA,eACA,cACA,WACA,QACA,SACA,WACF/7B,OAAO87B,GAAgB,IAEnBE,EAA8B,CAAA,EAQpC,OAPAvF,GAAMsF,GAAmB,SAAUE,GAC/B,IAAMC,EAAKrC,GAAet1B,GAAS43B,IAAKF,GACpCC,EAAG/9B,SACH69B,EAAOC,GAASC,EAEvB,IAEMF,CArBM,EAwBjBI,aAAc,WACV,IAAMC,EAAW93B,GAAS83B,SAC1B,OAAKA,EAE0D,IAApDA,EAASzP,OAAO,gCAChB,SAC6C,IAA7CyP,EAASzP,OAAO,yBAChB,OAC8C,IAA9CyP,EAASzP,OAAO,0BAChB,QACmD,IAAnDyP,EAASzP,OAAO,+BAChB,aAEA,KAVA,IA3BE,EAyCjB0P,WAAY,WACR,IAAM1P,EAASgP,GAAMQ,eACjBtC,EAAkB,SAAVlN,EAAoB,IAAM,IAClC8K,EAA2B,CAAA,EAE/B,GAAe,OAAX9K,EAAiB,CACjB8K,EAAG,eAAqB9K,EAExB,IAAM2P,EAAU1C,GAAet1B,GAAS83B,SAAUvC,GAC9CyC,EAAQp+B,SACRu5B,EAAG,WAAiB6E,EAE3B,CAED,OAAO7E,CAvDM,EA+DjB8E,QAAS,SAAUC,EAAoBC,EAAgBC,GAEnD,OADAD,EAASA,GAAU,GACfC,GAAS3F,GAAUyF,EAAY,SAC3BzF,GAAUyF,EAAY,QACf,aAEJ,QACA,8BAA8B15B,KAAK05B,GACnC,aACAzF,GAAUyF,EAAY,aAAezF,GAAUyF,EAAY,aAC3D,2BACAzF,GAAUyF,EAAY,mBAEtB,mBACAzF,GAAUyF,EAAY,SAAWzF,GAAUyF,EAAY,QACvD,iBACAzF,GAAUyF,EAAY,SACtB,kBACAzF,GAAUyF,EAAY,UACtB,SACAzF,GAAUyF,EAAY,SACtB,aACAzF,GAAUyF,EAAY,UAAYzF,GAAUyF,EAAY,aACxD,aACAzF,GAAUyF,EAAY,SACtB,cACAzF,GAAU0F,EAAQ,SACrB1F,GAAUyF,EAAY,UACf,gBAEJ,SACAzF,GAAUyF,EAAY,WACtB,iBACAzF,GAAUyF,EAAY,aACtB,YACAzF,GAAUyF,EAAY,WACtB,UACAzF,GAAUyF,EAAY,SAAWzF,GAAUyF,EAAY,YACvD,oBACAzF,GAAUyF,EAAY,SACtB,UAEA,EAzGE,EAkHjBG,eAAgB,SAAUxH,EAAmBsH,EAAgBC,GACzD,IAmBME,EAlBgB,CAClB,2BAA4B,mBAC5B,iBAAkB,uBAClBC,OAAQ,wBACR,aAAc,uBACd,aAAc,mCACdC,OAAQ,yBACR,gBAAiB,yBACjBC,MAAO,6BACPC,QAAS,yBACT,cAAe,uBACfC,UAAW,0BACXC,WAAY,2BACZ,iBAAkB,yBAClB,mBAAoB,gCACpB,oBAAqB,2BACrBC,QAAS,oBAjBGxB,GAAMY,QAAQpH,EAAWsH,EAAQC,IAoBjD,QAAcr1B,IAAVu1B,EACA,OAAO,KAEX,IAAM52B,EAAUmvB,EAAUtwB,MAAM+3B,GAChC,OAAK52B,EAGE2rB,WAAW3rB,EAAQA,EAAQ9H,OAAS,IAFhC,IA5IE,EAiJjBk/B,gBAAiB,WACb,OACIlI,GAAUmI,UACTnI,GAAkCoI,YApJ1B,EAwJjBC,GAAI,SAAUf,GACV,GAAI,WAAW15B,KAAK05B,GAAa,CAC7B,GAAI,QAAQ15B,KAAK05B,IAAe,YAAY15B,KAAK05B,GAC7C,MAAO,CAAEgB,QAAS,gBAAiBC,WAAY,IAEnD,IAAM54B,EAAQ,wBAAwBC,KAAK03B,GAC3C,OAAI33B,GAASA,EAAM,GAER,CAAE24B,QAAS,UAAWC,WADb54B,EAAM,IAGnB,CAAE24B,QAAS,UAAWC,WAAY,GAT7C,CAUO,GAAI,qBAAqB36B,KAAK05B,GAAa,CAC9C,IAAM33B,EAAQ,0BAA0BC,KAAK03B,GAC7C,OAAI33B,GAASA,EAAM,GAER,CAAE24B,QAAS,MAAOC,WADJ,CAAC54B,EAAM,GAAIA,EAAM,GAAIA,EAAM,IAAM,KACJpD,KAAK,MAEpD,CAAE+7B,QAAS,MAAOC,WAAY,GANlC,CAOA,GAAI,UAAU36B,KAAK05B,GAAa,CACnC,IAAM33B,EAAQ,iCAAiCC,KAAK03B,GACpD,OAAI33B,GAASA,EAAM,GAER,CAAE24B,QAAS,UAAWC,WADR,CAAC54B,EAAM,GAAIA,EAAM,GAAIA,EAAM,IAAM,KACApD,KAAK,MAExD,CAAE+7B,QAAS,UAAWC,WAAY,GANtC,CAOA,GAAI,8BAA8B36B,KAAK05B,GAC1C,MAAO,CAAEgB,QAAS,aAAcC,WAAY,IACzC,GAAI,OAAO36B,KAAK05B,GAAa,CAChC,IAAM33B,EAAQ,sCAAsCC,KAAK03B,GACzD,OAAI33B,GAASA,EAAM,GAER,CAAE24B,QAAS,WAAYC,WADT,CAAC54B,EAAM,GAAIA,EAAM,GAAIA,EAAM,IAAM,KACCpD,KAAK,MAEzD,CAAE+7B,QAAS,WAAYC,WAAY,GANvC,CAOA,MAAI,QAAQ36B,KAAK05B,GACb,CAAEgB,QAAS,QAASC,WAAY,IAChC,OAAO36B,KAAK05B,GACZ,CAAEgB,QAAS,YAAaC,WAAY,IAEpC,CAAED,QAAS,GAAIC,WAAY,GA/LzB,EAmMjBC,OAAQ,SAAUlB,GACd,MAAI,iBAAiB15B,KAAK05B,IAAe,YAAY15B,KAAK05B,GAC/C,gBACA,OAAO15B,KAAK05B,GACZ,OACA,OAAO15B,KAAK05B,GACZ,aACA,SAAS15B,KAAK05B,GACd,SACA,8BAA8B15B,KAAK05B,GACnC,aACA,UAAU15B,KAAK05B,KAAgB,SAAS15B,KAAK05B,GAC7C,iBACA,UAAU15B,KAAK05B,GACf,UAEA,EAnNE,EAuNjBmB,WAAY,SAAUnB,GAClB,IAAMkB,EAASl/B,KAAKk/B,OAAOlB,GAC3B,MAAe,SAAXkB,GAAgC,mBAAXA,EACd,SACAA,EACA,SAEA,SA9NE,EAkOjBtB,SAAU,WACN,OAAO93B,GAAS83B,UAAY,SAnOf,EAsOjBwB,gBAAiB,WACb,IAAKt5B,GAAS83B,SACV,MAAO,UAEX,IAAMyB,EAASv5B,GAASF,cAAc,KAEtC,OADAy5B,EAAO17B,KAAOmC,GAAS83B,SAChByB,EAAO39B,IA5OD,EA+OjB49B,WAAY,WACR,IAAAC,EAAgCpC,GAAM4B,GAAGpI,IAAjCqI,IAAAA,QAASC,IAAAA,WACjB,OAAOhH,GACHe,GAAwB,CACpBwG,IAAKR,EACLS,YAAaR,EACbS,SAAUvC,GAAMY,QAAQpH,GAAWD,GAAUuH,OAAS9sB,GAAY+sB,OAClEyB,QAASxC,GAAM+B,OAAOvI,IACtBiJ,aAAczC,GAAMgC,WAAWxI,MAEnC,CACIkJ,aAAc1uB,gBAAAA,GAAKK,SAAS7N,KAC5Bm8B,MAAO3uB,gBAAAA,GAAKK,SAAS9P,KACrBq+B,UAAW5uB,gBAAAA,GAAKK,SAASwuB,SACzBC,iBAAkB9C,GAAMgB,eAAexH,GAAWD,GAAUuH,OAAS9sB,GAAY+sB,OACjFgC,kBAAmB/C,GAAMyB,kBACzBuB,eAAgBhvB,gBAAAA,GAAKivB,OAAOn1B,OAC5Bo1B,cAAelvB,gBAAAA,GAAKivB,OAAOr1B,MAC3Bu1B,iBAAkBnvB,cAAAA,EAAAA,GAAK0D,YACvB0rB,gBAAiBpvB,cAAAA,EAAAA,GAAK+D,WACtBsrB,KAAM,MACNC,aAAcpK,GAAOE,YACrBmK,WAAYr1B,KAAKs1B,SAAS/O,SAAS,IAAIrrB,UAAU,EAAG,IAAM8E,KAAKs1B,SAAS/O,SAAS,IAAIrrB,UAAU,EAAG,IAClGq6B,MAAOhI,KAAe,KAtQjB,EA2QjBiI,kBAAmB,WACf,IAAAC,EAAgC3D,GAAM4B,GAAGpI,IAAjCqI,IAAAA,QAASC,IAAAA,WACjB,OAAOhH,GACHe,GAAwB,CACpBwG,IAAKR,EACLS,YAAaR,EACbS,SAAUvC,GAAMY,QAAQpH,GAAWD,GAAUuH,OAAS9sB,GAAY+sB,SAEtE,CACI+B,iBAAkB9C,GAAMgB,eAAexH,GAAWD,GAAUuH,OAAS9sB,GAAY+sB,QAG5F,GCx7BE,SAAS6C,GAAah5B,GACzB,OAAeA,EAAAA,EAAGR,YACd,IAAK,SACD,OAAOQ,EAAGR,UAEd,IAAK,SACD,OAAQ,YAAaQ,EAAGR,UAAaQ,EAAGR,UAAkBy5B,QAAU,OAASj5B,EAAGuS,aAAa,UAAY,GAC7G,QAEI,MAAO,GAElB,CAWM,SAAS2mB,GAAYl5B,GACxB,IAAIm5B,EAAS,GAmBb,OAjBIC,GAAqBp5B,KAAQq5B,GAAmBr5B,IAAOA,EAAGkB,YAAclB,EAAGkB,WAAWvJ,QACtFs4B,GAAMjwB,EAAGkB,YAAY,SAAUkkB,GACvBkU,GAAWlU,IAAUA,EAAM5iB,cAC3B22B,GAAUpJ,GAAM3K,EAAM5iB,aAEjB/F,MAAM,SACNwV,OAAOsnB,IACPr+B,KAAK,IAELW,QAAQ,UAAW,KACnBA,QAAQ,QAAS,KAEjB2C,UAAU,EAAG,KAEzB,IAGEuxB,GAAMoJ,EAChB,CAOM,SAASK,GAAcx5B,GAC1B,QAASA,GAAsB,IAAhBA,EAAGb,QACrB,CAYM,SAASs6B,GAAMz5B,EAAgCopB,GAClD,QAASppB,KAAQA,EAAGhG,SAAWgG,EAAGhG,QAAQI,gBAAkBgvB,EAAIhvB,aACnE,CAOM,SAASk/B,GAAWt5B,GACvB,QAASA,GAAsB,IAAhBA,EAAGb,QACrB,CAOM,SAASu6B,GAAmB15B,GAC/B,QAASA,GAAsB,KAAhBA,EAAGb,QACrB,CAEM,IAAMw6B,GAAgC,CAAC,IAAK,SAAU,OAAQ,QAAS,SAAU,WAAY,SAwG7F,SAASP,GAAqBp5B,GACjC,IAAK,IAAI45B,EAAQ55B,EAAI45B,EAAMl6B,aAAe+5B,GAAMG,EAAO,QAASA,EAAQA,EAAMl6B,WAAuB,CACjG,IAAMm6B,EAAUb,GAAaY,GAAOn9B,MAAM,KAC1C,GAAI+zB,GAAUqJ,EAAS,iBAAmBrJ,GAAUqJ,EAAS,iBACzD,OAAO,CAEd,CAED,GAAIrJ,GAAUwI,GAAah5B,GAAIvD,MAAM,KAAM,cACvC,OAAO,EAIX,IAAMxC,EAAQ+F,EAAwB/F,MAAQ,GAC9C,GAAoB,iBAATA,EAEP,OAAQA,EAAKG,eACT,IAAK,SAEL,IAAK,WACD,OAAO,EAKnB,IAAM6D,EAAQ+B,EAAwB/B,MAAQ+B,EAAGa,IAAM,GAIvD,GAAoB,iBAAT5C,EAAmB,CAI1B,GADI,uHACmB1B,KAAK0B,EAAKpC,QAAQ,gBAAiB,KACtD,OAAO,CAEd,CAED,OAAO,CACV,CAOM,SAASw9B,GAAmBr5B,GAI/B,SACKy5B,GAAMz5B,EAAI,WAFW,CAAC,SAAU,WAAY,SAAU,SAEbytB,SAAUztB,EAAwB/F,OAC5Ew/B,GAAMz5B,EAAI,WACVy5B,GAAMz5B,EAAI,aAC6B,SAAvCA,EAAGuS,aAAa,mBAKvB,CAQM,SAASgnB,GAAmB/gC,GAC/B,GAAc,OAAVA,GAAkB22B,GAAa32B,GAC/B,OAAO,EAGX,GAAqB,iBAAVA,EAAoB,CAC3BA,EAAQu3B,GAAMv3B,GAMd,GADI,wKACQ+D,MAAM/D,GAAS,IAAIqD,QAAQ,QAAS,KAC5C,OAAO,EAKX,GADiB,0BACJU,KAAK/D,GACd,OAAO,CAEd,CAED,OAAO,CACV,CAuBM,SAASshC,GAA2B3vB,GACvC,IAAIhQ,EAAO++B,GAAY/uB,GAEvB,OAAOovB,GADPp/B,EAAO,GAAGA,OAAAA,EAAQ4/B,KAAAA,OAAAA,GAAkB5vB,IAAUxM,QACZxD,EAAO,EAC5C,CAQM,SAAS4/B,GAAkB5vB,GAC9B,IAAIhQ,EAAO,GAiBX,OAhBIgQ,GAAUA,EAAOjJ,YAAciJ,EAAOjJ,WAAWvJ,QACjDs4B,GAAM9lB,EAAOjJ,YAAY,SAAUkkB,GAAO,IAAA4U,EACtC,GAAI5U,GAA0C,UAAlBhrB,QAAf4/B,EAAA5U,EAAMprB,eAASI,IAAAA,OAAAA,EAAAA,EAAAA,eACxB,IACI,IAAM6/B,EAAWf,GAAY9T,GAC7BjrB,EAAO,GAAGA,OAAAA,cAAQ8/B,GAAWt8B,OAEzBynB,EAAMlkB,YAAckkB,EAAMlkB,WAAWvJ,SACrCwC,EAAO,GAAGA,OAAAA,EAAQ4/B,KAAAA,OAAAA,GAAkB3U,IAASznB,OALrD,CAOE,MAAO9E,GACL6L,QAAQ1L,MAAMH,EACjB,CAER,IAEEsB,CACV,CCnVD,IAIqB+/B,cAIjB,SAAAA,EAAYC,GAAkBC,EAAAniC,KAAAiiC,GAC1BjiC,KAAKoiC,OAAS,GACdpiC,KAAKkiC,QAAUA,CAClB,gCAED3hC,MAAA,SAAYuK,EAAWE,EAAW0hB,GAC9B,IAAK1sB,KAAKkiC,QACN,OAAO,EAGX,IAAMG,EAAYriC,KAAKoiC,OAAOpiC,KAAKoiC,OAAO1iC,OAAS,GACnD,GACI2iC,GACAh3B,KAAKi3B,IAAIx3B,EAAIu3B,EAAUv3B,GAAKO,KAAKi3B,IAAIt3B,EAAIq3B,EAAUr3B,GArB/B,IAsBpB0hB,EAAY2V,EAAU3V,UArBJ,KAyBlB,GAFA1sB,KAAKoiC,OAAOthC,KAAK,CAAEgK,EAAAA,EAAGE,EAAAA,EAAG0hB,UAAAA,IAtBN,IAwBf1sB,KAAKoiC,OAAO1iC,OACZ,OAAO,OAGXM,KAAKoiC,OAAS,CAAC,CAAEt3B,EAAAA,EAAGE,EAAAA,EAAG0hB,UAAAA,IAG3B,OAAO,CACV,UC/BQ6V,GAAyB,sBAEzBC,GAAe,UAEfC,GAAmB,WACnBC,GAAmC,oCACnCC,GAAwC,yCACxCC,GAA4C,6CAC5CC,GAAiD,kDACjDC,GAAa,SACbC,GAAwB,yBACxBC,GAAoC,yBACpCC,GAA+B,4BAC/BC,GAA8B,2BAC9BC,GAAU,WACVC,GAAqB,sBACrBC,GAAa,cACbC,GAAwB,yBAGxBC,GAAkC,CAC3ChB,GACAC,GAnB4B,UAqB5BC,GACAE,GACAG,GACAC,GACAM,GACAC,GACAN,GACAE,GACAD,GACAE,GACAC,ICVJ,SAASI,GAAU9jC,EAAgBwC,GAC/B,OAAIA,EAAKxC,OAASA,EACPwC,EAAKZ,MAAM,EAAG5B,GAAU,MAE5BwC,CACV,CAED,IAAMuhC,GAAc,CAChBC,mBAAoB,GACpBC,sBAAuB,KACvBC,uBAAuB,EAEvBC,yBAA0B,SAAUC,GAAyB,IAAAC,EACnDC,EAC6B,OAA/BhkC,KAAK2jC,wBACE,QAACG,EAAAA,EAASG,mBAAV,IAAAF,IAACA,EAAsB/Z,MAAM0Y,KAC9B1iC,KAAK2jC,sBACTO,IAAwBJ,EAASK,WAAW,eAClDnkC,KAAK4jC,sBAAwBM,IAAwBF,CAXzC,EAchBI,wBAAyB,SAAUr8B,GAC/B,GAAIA,EAAGs8B,uBACH,OAAOt8B,EAAGs8B,uBAEV,IAAIC,EAAsBv8B,EAC1B,GACIu8B,EAAMA,EAAIj2B,sBACLi2B,IAAQ/C,GAAc+C,IAC/B,OAAOA,CAtBC,EA0BhBC,iCAAkC,SAAUC,GAExC,IADwBrD,GAAqBqD,GAEzC,MAAO,GAGX,IAAMxa,EAAoB,CAAA,EAW1B,OATAgO,GAAMwM,EAAK16B,YAAY,SAAU26B,GAC7B,GAAuD,IAAnDA,EAAKz+B,KAAKzB,QAAQ,6BAAoC,CACtD,IAAMmgC,EAAcD,EAAKz+B,KAAKpC,QAAQ,6BAA8B,IAC9D+gC,EAAgBF,EAAKlkC,MACvBmkC,GAAeC,GAAiBrD,GAAmBqD,KACnD3a,EAAM0a,GAAeC,EAE5B,CACJ,IACM3a,CA3CK,EA8ChB4a,0BAA2B,SAAUJ,EAAeK,EAAqBC,GACrE,IAAMC,EAAWP,EAAKziC,QAAQI,cACxB6nB,EAAoB,CACtB+a,SAAUA,GAEVrD,GAA8Bn9B,QAAQwgC,IAAa,IAAMD,IAC1B,MAA3BC,EAAS5iC,eAAoD,WAA3B4iC,EAAS5iC,cAC3C6nB,EAAK,SAAewZ,GAAU,KAAM3B,GAA2B2C,IAE/Dxa,EAAK,SAAewZ,GAAU,KAAMvC,GAAYuD,KAIxD,IAAM5C,EAAUb,GAAayD,GACzB5C,EAAQliC,OAAS,IACjBsqB,EAAK,QAAc4X,EAAQp9B,MAAM,KAAKwV,QAAO,SAAUrT,GACnD,MAAa,KAANA,CACV,KAELqxB,GAAMwM,EAAK16B,YAAY,SAAU26B,GHmMlC,IAA4BlqB,EGjMnB6mB,GAAmBoD,KAAyD,IAAhD,CAAC,OAAQ,KAAM,SAASjgC,QAAQkgC,EAAKz+B,QAEhE6+B,GAAcvD,GAAmBmD,EAAKlkC,SHgMtB,iBADEga,EG/LkDkqB,EAAKz+B,OHiMxC,eAAnCuU,EAAchU,UAAU,EAAG,KAA0D,YAAlCgU,EAAchU,UAAU,EAAG,MGhM7EyjB,EAAM,SAAWya,EAAKz+B,MAAQw9B,GAAU,KAAMiB,EAAKlkC,OAE1D,IAKD,IAHA,IAAIykC,EAAW,EACXC,EAAY,EACZC,EAA8BV,EAC1BU,EAAcllC,KAAKokC,wBAAwBc,IAE/CF,IACIE,EAAYnjC,UAAYyiC,EAAKziC,SAC7BkjC,IAMR,OAHAjb,EAAK,UAAgBgb,EACrBhb,EAAK,YAAkBib,EAEhBjb,CAvFK,EA0FhBmb,sBAAuB,SAAUC,GAC7B,MAAO,CACHC,YAAaD,EACbE,YAAa,EA7FL,EAiGhBC,4BAA6B,SAAUC,GACnC,IAAMC,EAAuB,GAc7B,OAbAzN,GAAMlyB,SAAS4d,iBAAiB8hB,EAAc,eAAmB,SAAUE,GACvE,IAAInlC,EAEA,CAAC,QAAS,UAAUgE,QAAQmhC,EAAY3jC,QAAQI,gBAAkB,EAClE5B,EAAQmlC,EAAW,MACZA,EAAW,cAClBnlC,EAAQmlC,EAAW,aAGnBpE,GAAmB/gC,IACnBklC,EAAW3kC,KAAKP,EAEvB,IACMklC,EAAWxiC,KAAK,KAhHX,EAoHhB0iC,qBAAsB,SAAUC,GAA0C,IAAAzxB,EAAAnU,KAChEgqB,EAAoB,CAAA,EAW1B,OAVAgO,GAAMh4B,KAAK6lC,mBAAmB,SAACL,GAC3BxN,GAAMwN,EAAc,iBAAqB,SAACM,GAEtC9N,GADsBlyB,SAAS4d,iBAAiBoiB,IAC3B,SAACC,GACdxN,GAAUqN,EAAmBG,IAAiB5E,GAAqB4E,KACnE/b,EAAMwb,EAAc,MAAYrxB,EAAKoxB,4BAA4BC,GAExE,GACJ,GACJ,IACMxb,CAhIK,EAmIhBgc,gBAAiB,SAAUplC,GAEvB,YAAwB,IAAbA,EAAEsR,OACDtR,EAAEqlC,YAA0B,KAEhC,QAAJC,EAAKtlC,EAAEsR,cAAH,IAAAg0B,GAAAA,EAA2BtkC,WACnBhB,EAAEoc,eAAe,IAAkB,KAEvCpc,EAAEsR,QAAsB,KAJ7B,IAAAg0B,CAvIK,EA+IhBC,cAAe,SAAUvlC,EAAUkjC,GAA+D,IAQXsC,EARWC,EAAArmC,KAA5C4e,yDAAY,eAE1D1M,EAASlS,KAAKgmC,gBAAgBplC,IAC9BygC,GAAWnvB,KAEXA,EAAUA,EAAOzK,YAAc,MAGjB,iBAAdmX,GAA2C,UAAXhe,EAAEoB,MAAoBpB,aAAa4hB,cAC/D,QAAA4jB,EAAApmC,KAAKsmC,kBAAL,IAAAF,GAAAA,EAAiBG,YAAY3lC,EAAEke,QAASle,EAAEme,SAAS,IAAI3L,MAAOozB,YAC9DxmC,KAAKmmC,cAAcvlC,EAAGkjC,EAAU,eAIxC,GAAI5xB,GH5FL,SACHnK,EACA6N,GAEO,IADP6wB,8DAAmD59B,EAEnD,IAAKd,GAAMy5B,GAAMz5B,EAAI,UAAYw5B,GAAcx5B,GAC3C,OAAO,EAGX,GAAI0+B,SAAAA,EAAmBC,cAAe,CAClC,IAAMviC,EAAM2P,OAAOtC,SAAS7N,KACtBgjC,EAAYF,EAAkBC,cACpC,GAAIC,IAAcA,EAAUl7B,MAAK,SAAC2yB,GAAD,OAAWj6B,EAAIkC,MAAM+3B,EAArB,IAC7B,OAAO,CAEd,CAED,GAAIqI,SAAAA,EAAmBG,oBAAqB,CACxC,IAAMD,EAAYF,EAAkBG,oBACpC,GAAID,IAAcA,EAAUl7B,MAAK,SAAC25B,GAAD,OAAexvB,EAAM5T,OAASojC,CAA9B,IAC7B,OAAO,CAEd,CAED,GAAIqB,SAAAA,EAAmBI,kBAAmB,CACtC,IAAMF,EAAYF,EAAkBI,kBACpC,GAAIF,IAAcA,EAAUl7B,MAAK,SAACq7B,GAAD,OAAiB/+B,EAAGhG,QAAQI,gBAAkB2kC,CAA9C,IAC7B,OAAO,CAEd,CAED,GAAIL,SAAAA,EAAmBM,uBAAwB,CAC3C,IAAMJ,EAAYF,EAAkBM,uBACpC,GAAIJ,IAAcA,EAAUl7B,MAAK,SAACu7B,GAAD,OAAcj/B,EAAGP,QAAQw/B,EAAzB,IAC7B,OAAO,CAEd,CAMD,IAJA,IAAIC,GAAwB,EACtBrB,EAA+B,CAAC79B,GAClCN,GAAgC,EAChCk6B,EAAiB55B,EACd45B,EAAMl6B,aAAe+5B,GAAMG,EAAO,SAErC,GAAIF,GAAmBE,EAAMl6B,YACzBm+B,EAAkB9kC,KAAM6gC,EAAMl6B,WAAmB/F,MACjDigC,EAASA,EAAMl6B,WAAmB/F,SAFtC,CAMA,KADA+F,EAAck6B,EAAMl6B,aAA0B,GAC7B,MACjB,GAAIi6B,GAA8Bn9B,QAAQkD,EAAW1F,QAAQI,gBAAkB,EAC3E8kC,GAAwB,MACrB,CACH,IAAMC,EAAapzB,OAAOqzB,iBAAiB1/B,GACvCy/B,GAAwD,YAA1CA,EAAWnsB,iBAAiB,YAC1CksB,GAAwB,EAE/B,CAEDrB,EAAkB9kC,KAAK2G,GACvBk6B,EAAQl6B,CAbP,CAgBL,IAAMy/B,EAAapzB,OAAOqzB,iBAAiBp/B,GAC3C,GAAIm/B,GAAwD,YAA1CA,EAAWnsB,iBAAiB,WAA0C,UAAfnF,EAAM5T,KAC3E,OAAO,EAGX,IAAMmvB,EAAMppB,EAAGhG,QAAQI,cACvB,OAAQgvB,GACJ,IAAK,OACD,OAAO,EACX,IAAK,OACD,MAAsB,WAAfvb,EAAM5T,KACjB,IAAK,QAEL,IAAK,SACL,IAAK,WACD,MAAsB,WAAf4T,EAAM5T,MAAoC,UAAf4T,EAAM5T,KAC5C,QACI,OAAIilC,EAA6C,UAAfrxB,EAAM5T,KAErB,UAAf4T,EAAM5T,OACL0/B,GAA8Bn9B,QAAQ4sB,IAAQ,GAA4C,SAAvCppB,EAAGuS,aAAa,oBAGnF,CGKqB8sB,CAAsBl1B,EAAQtR,EAAGZ,KAAKqnC,QAAS,CAGzD,IAFA,IAAMzB,EAAoB,CAAC1zB,GACvByvB,EAAQzvB,EACLyvB,EAAMl6B,aAAe+5B,GAAMG,EAAO,SACjCF,GAAmBE,EAAMl6B,aACzBm+B,EAAkB9kC,KAAM6gC,EAAMl6B,WAAmB/F,MACjDigC,EAASA,EAAMl6B,WAAmB/F,OAGtCkkC,EAAkB9kC,KAAK6gC,EAAMl6B,YAC7Bk6B,EAAQA,EAAMl6B,YAGlB,IAEI9D,EAFE2jC,EAA6B,GAC7BC,EAA2C,CAAA,EAE7CC,GAAoB,EA2CxB,GA1CAxP,GAAM4N,GAAmB,SAAC79B,GACtB,IAAM0/B,EAAkBtG,GAAqBp5B,GAIZ,MAA7BA,EAAGhG,QAAQI,gBACXwB,EAAOoE,EAAGuS,aAAa,QACvB3W,EAAO8jC,GAAmBnG,GAAmB39B,IAASA,GAKtD40B,GADYwI,GAAah5B,GAAIvD,MAAM,KAChB,mBACnBgjC,GAAoB,GAGxBF,EAAaxmC,KACTulC,EAAKzB,0BACD78B,EACA+7B,EAASK,WAAW,+BACpBL,EAASK,WAAW,mBAI5B,IAAMuD,EAAoBrB,EAAK9B,iCAAiCx8B,GAChEkwB,GAAQsP,EAA8BG,EACzC,IAEI5D,EAASK,WAAW,mBAGgB,MAAjCjyB,EAAOnQ,QAAQI,eAA0D,WAAjC+P,EAAOnQ,QAAQI,cACvDmlC,EAAa,GAAb,SAA8BzF,GAA2B3vB,GAEzDo1B,EAAa,GAAb,SAA8BrG,GAAY/uB,IAI9CvO,IACA2jC,EAAa,GAAb,WAAgC3jC,GAGhC6jC,EACA,OAAO,EAGX,IAAMxd,EAAQiO,GACVj4B,KAAKmlC,sBAAsBvkC,EAAEoB,MAC7B,CACI2lC,UAAWL,GAEftnC,KAAK2lC,qBAAqBC,GAC1B2B,GAIJ,OADAzD,EAAS3xB,QAAQyM,EAAWoL,IACrB,CACV,CAvOW,EA4OhB4d,UAAW,SAAUjkC,GACjBmQ,OAAOtC,SAAS7N,KAAOA,CA7OX,EAgPhBkkC,qBAAsB,SAAU/D,GAAyB,IAAAgE,EAAA9nC,KAC/C6e,EAAU,SAACje,GACbA,EAAIA,GAAKkT,OAAO8B,MAChBkyB,EAAK3B,cAAcvlC,EAAGkjC,IAE1BnI,GAAgB71B,SAAU,SAAU+Y,GAAS,GAAO,GACpD8c,GAAgB71B,SAAU,SAAU+Y,GAAS,GAAO,GACpD8c,GAAgB71B,SAAU,QAAS+Y,GAAS,GAAO,EAvPvC,EA0PhBgnB,kBAAmB,GACnBS,WAAY,KACZe,YAAQx+B,EAER+S,KAAM,SAAUkoB,GAAyB,IAAAiE,EACC,kBAA3BjE,EAASkE,gBAChBhoC,KAAKqnC,OAASvD,EAASkE,eAIvB,QAAJD,EAAI/nC,KAAKqnC,cAAL,IAAAU,GAAAA,EAAarB,gBACb1mC,KAAKqnC,OAAOX,cAAgB1mC,KAAKqnC,OAAOX,cAAc3jC,KAAI,SAACoB,GAAD,OAAS,IAAIzB,OAAOyB,EAApB,KAG9DnE,KAAKsmC,WAAa,IAAIrE,GAAU6B,EAASK,WAAW,aAxQxC,EA2QhB8D,oBAAqB,SAAUC,EAA0BpE,GACrD,IAAMqE,EAAQrE,EAASK,WAAW,SAC9BnkC,KAAK0jC,mBAAmBn/B,QAAQ4jC,IAAU,EAC1CjT,GAAO+B,IAAI,8CAAgDkR,EAAQ,MAInErE,EAASG,aACTH,EAASG,YAAYmE,SAChB1F,EAAAA,CAAAA,EAAAA,KAAqCwF,EAAQ,sBAItDloC,KAAK2jC,wBAA0BuE,EAAQ,oBAEvCloC,KAAK6jC,yBAAyBC,GAE9B9jC,KAAK0jC,mBAAmB5iC,KAAKqnC,GAGzBD,GACAA,EAAQ,QACRA,EAAQ,OAAR,2BACAloC,KAAK4jC,uBAGDsE,EAAQ,oBACRloC,KAAK6lC,kBAAoBqC,EAAQ,mBAErCloC,KAAK6nC,qBAAqB/D,IAE1BA,EAAQ,eAAoB,EA1SpB,EAmThBuE,kBAAmB,SACfF,EACAG,EACAC,GAEA,IAAKJ,EACD,OAAO,EAEXG,EAAcpR,GAAaoR,GAA2B,GAAbA,EACzCC,EAAqBrR,GAAaqR,GAAyC,GAApBA,EAEvD,IADA,IAAIC,EAAc,EACTjpC,EAAI,EAAGA,EAAI4oC,EAAMzoC,OAAQH,IAC9BipC,GAAeL,EAAMtgB,WAAWtoB,GAEpC,OAAOipC,EAAcF,EAAaC,CAjUtB,EAoUhBE,mBAAoB,WAChB,OAAOpQ,GAAYvyB,SAAS4d,iBAC/B,IJhRiC,SAAU6N,GAC5C,IAAK,IAAMze,KAAQye,EACU,mBAAdA,EAAIze,KACXye,EAAIze,GAAQye,EAAIze,GAAM6K,KAAK4T,GAGtC,CI6QDmX,CAAuBjF,IJpEmB,SAAUlS,GAChD,IAAK,IAAMze,KAAQye,EACU,mBAAdA,EAAIze,KACXye,EAAIze,GAAQ+lB,GAAUtH,EAAIze,IAGrC,CI+DD61B,CAA2BlF,IC3V3B,IAAMmF,GAAmC,wBACnCC,GAAqC,0BACrCC,GAAoC,yBAE7BC,GAA2B,SAACC,GACrC,IADyFC,EACnFC,EAAuD,CAAA,EAD4BC,EAAAC,EL0KtF,SAA2B7X,GAK9B,IAJA,IAAM8X,EAAWlqC,OAAOqf,KAAK+S,GACzBhyB,EAAI8pC,EAAS3pC,OACX4pC,EAAW,IAAIjoC,MAAM9B,GAEpBA,KACH+pC,EAAS/pC,GAAK,CAAC8pC,EAAS9pC,GAAIgyB,EAAI8X,EAAS9pC,KAE7C,OAAO+pC,CACV,CKjL8BC,CAASP,GAAgB,CAAjB,IAFsD,IAEzF,IAAyDG,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IAAAgpC,EAAAC,EAAAR,EAAA1oC,MAAA,GAA7CoT,EAA6C61B,EAAA,GAAxCjpC,EAAwCipC,EAAA,GACjDjpC,IACA2oC,EAAmBv1B,GAAOpT,EAEjC,CANwF,CAAA,MAAAiM,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAOzF,OAAO4Q,CACV,EA2CYQ,GAAb,WAQI,SAAAA,EAAY5F,GAAmB3B,EAAAniC,KAAA0pC,GAC3B1pC,KAAK8jC,SAAWA,EAChB9jC,KAAK2pC,mBAAoB,EACzB3pC,KAAK4pC,yBAA2B,GAEhC5pC,KAAK6pC,0BAA2B,EAChC7pC,KAAK8pC,4BAA6B,CACrC,CAfL,OAAAC,EAAAL,EAAA,CAAA,CAAA/1B,IAAA,WAAApT,MAiBI,WACI,OAAOpB,OAAOqf,KAAKxe,KAAKgqC,kBAC3B,GAnBL,CAAAr2B,IAAA,kBAAApT,MAqBI,WACI,IAAM0pC,EAAejqC,KAAK8jC,SAASoG,aAAanH,IAC1CoH,EAAkBnqC,KAAK8jC,SAASoG,aAAarB,IACnD,IAAKsB,EACD,OAAOF,GAAgB,CAAA,EAK3B,IAFA,IAAMG,EAAanS,GAAQ,CAAD,EAAKgS,GACzBI,EAAiBlrC,OAAOqf,KAAK2rB,GAC1B5qC,EAAI,EAAGA,EAAI8qC,EAAe3qC,OAAQH,KACI,IAAvC4qC,EAAgBE,EAAe9qC,WACxB6qC,EAAWC,EAAe9qC,IAEjC6qC,EAAWC,EAAe9qC,IAAM4qC,EAAgBE,EAAe9qC,IAWvE,OARKS,KAAK2pC,oBACNl9B,QAAQC,KAAK,sCAAuC,CAChDu9B,aAAAA,EACAE,gBAAAA,EACAC,WAAAA,IAEJpqC,KAAK2pC,mBAAoB,GAEtBS,CACV,GA9CL,CAAAz2B,IAAA,kBAAApT,MAgDI,WAEI,OADqBP,KAAK8jC,SAASoG,aAAapB,KACzB,CAAA,CAC1B,GAnDL,CAAAn1B,IAAA,qBAAApT,MA8DI,WACSP,KAAK6pC,2BACN7pC,KAAK6pC,0BAA2B,EAChC7pC,KAAKsqC,oBAEZ,GAnEL,CAAA32B,IAAA,yBAAApT,MAqEI,SAAuBgqC,GACnBvqC,KAAKwqC,kBAAoBD,CAC5B,GAvEL,CAAA52B,IAAA,qBAAApT,MAyEI,SAAmBkqC,GACfzqC,KAAK8pC,2BAA6BW,CACrC,GA3EL,CAAA92B,IAAA,oBAAApT,MA6EI,WACIP,KAAK6pC,0BAA2B,CACnC,GA/EL,CAAAl2B,IAAA,oBAAApT,MAiFI,WAA0B,IAAA4T,EAAAnU,KAClBA,KAAK6pC,2BAA6B7pC,KAAK8pC,4BACvCp4B,YAAW,YACFyC,EAAK21B,4BAA8B31B,EAAK01B,2BACzC11B,EAAK01B,0BAA2B,EAChC11B,EAAKu2B,6BAHH,GAKP,EAEV,GA1FL,CAAA/2B,IAAA,6BAAApT,MA4FI,WAAmC,IAAA8lC,EAAArmC,KAC/BA,KAAK2qC,oBAAmB,GACxB,IAAMxC,EAAQnoC,KAAK8jC,SAASK,WAAW,SACjCyG,EAAmB5qC,KAAK8jC,SAASoG,aAAajH,IAC9C4H,EAAkB7qC,KAAK8jC,SAASoG,aAAahH,IAW7C4H,EAAelR,GAVH1T,KAAKC,UAAU,CAC7BgiB,MAAOA,EACP4C,YAAa/qC,KAAK8jC,SAASkH,kBAC3BC,OAAQjrC,KAAK8jC,SAASoH,YACtBV,kBAAmBxqC,KAAKwqC,kBACxBW,kBAAmBP,EACnBQ,iBAAkBP,EAClBQ,cAAerrC,KAAK8jC,SAASK,WAAW,wCAAqCt7B,KAIjF7I,KAAK8jC,SAASwH,cACVtrC,KAAK8jC,SAASK,WAAW,YAAc,eACvC,CAAE54B,KAAMu/B,GACR,CAAES,OAAQ,QACVvrC,KAAK8jC,SAAS0H,mBAAkB,SAACtD,GAG7B7B,EAAKmE,uBAAoB3hC,EACzBw9B,EAAKoF,qBAAqBvD,GAG1B7B,EAAKsE,oBAAmB,GACxBtE,EAAKiE,mBART,IAWP,GA3HL,CAAA32B,IAAA,iBAAApT,MAuII,SAAeoT,GAAmF,IAAtE/L,yDAAoC,CAAA,EAC5D,GAAK5H,KAAK8jC,SAAS4H,sBAA0B1rC,KAAK2rC,YAAc3rC,KAAK2rC,WAAWjsC,OAAS,EAAzF,CAIA,IAKwFksC,EALlFC,EAAY7rC,KAAKgqC,kBAAkBr2B,GACnCm4B,EAAqBD,GAAAA,OAAAA,GACrBE,EAA6C/rC,KAAK8jC,SAASoG,aAAa9G,KAAuB,GAErG,GAAIx7B,EAAQokC,cAAgB,eAAgBpkC,GACxC,KAAM+L,KAAOo4B,KAAsBA,EAAiBp4B,GAAK6hB,SAASsW,GAC1DzqC,MAAMwzB,QAAQkX,EAAiBp4B,IAC/Bo4B,EAAiBp4B,GAAK7S,KAAKgrC,GAE3BC,EAAiBp4B,GAAO,CAACm4B,GAE7B,QAAKhI,EAAAA,KAAAA,SAASG,mBAAd,IAAA2H,GAAAA,EAA2BxD,SAAYhF,EAAAA,CAAAA,EAAAA,GAAqB2I,IAE5D/rC,KAAK8jC,SAAS3xB,QAAQ,uBAAwB,CAAE85B,cAAet4B,EAAKu4B,uBAAwBL,IAGpG,OAAOA,CAjBN,CAFGp/B,QAAQC,KAAK,2BAA6BiH,EAAM,gDAoBvD,GA7JL,CAAAA,IAAA,wBAAApT,MA+JI,SAAsBoT,GAElB,OADiB3T,KAAKmsC,kBACNx4B,EACnB,GAlKL,CAAAA,IAAA,mBAAApT,MA8KI,SAAiBoT,GAA0E,IAA7D/L,yDAAoC,CAAA,EAC9D,GAAK5H,KAAK8jC,SAAS4H,sBAA0B1rC,KAAK2rC,YAAc3rC,KAAK2rC,WAAWjsC,OAAS,EAIzF,QAASM,KAAKosC,eAAez4B,EAAK/L,GAH9B6E,QAAQC,KAAK,6BAA+BiH,EAAM,gDAIzD,GApLL,CAAAA,IAAA,yBAAApT,MAsLI,SAAuBse,GACnB7e,KAAK4pC,yBAAyB9oC,KAAK+d,EACtC,GAxLL,CAAAlL,IAAA,4BAAApT,MA0LI,SAA0Bse,GACtB7e,KAAK4pC,yBAA2B5pC,KAAK4pC,yBAAyB5vB,QAAO,SAACiF,GAAD,OAAOA,IAAMJ,CAAb,GACxE,GA5LL,CAAAlL,IAAA,uBAAApT,MA8LI,SAAqB2nC,GACjB,GAAKloC,KAAK8jC,SAASG,YAAnB,CAGAjkC,KAAK8jC,SAAS4H,sBAAuB,EACrC,IAAMW,EAAersC,KAAKgqC,kBACpBsC,EAAsBtsC,KAAKmsC,mBA7OK,SAC1CjE,EACAjE,GAGC,IAFDoI,yDAAiD,CAAA,EACjDC,yDAAgD,CAAA,EAE1CC,EAAQrE,EAAQ,aAChBsE,EAAetE,EAAQ,oBAC7B,GAAIqE,EAEA,GAAIlrC,MAAMwzB,QAAQ0X,GAAQ,CAAA,IAAAE,EAChBC,EAAkD,CAAA,EACxD,GAAIH,EACA,IAAK,IAAIhtC,EAAI,EAAGA,EAAIgtC,EAAM7sC,OAAQH,IAC9BmtC,EAAuBH,EAAMhtC,KAAM,EAG3C0kC,GACIA,EAAYmE,UACPQ,EAAAA,EAAAA,CAAAA,EAAAA,GAAmC2D,GACnCxJ,EAAAA,EAAAA,GAAwB2J,GAHjCD,GAKH,KAAM,CAAA,IAAAE,EAECC,EAAkBL,EAClBM,EAAyBL,EACzBtE,EAAS4E,4BAETF,EAAuBP,EAAAA,EAAAA,CAAAA,EAAAA,GAAiBO,GACxCC,EAA8BP,EAAAA,EAAAA,CAAAA,EAAAA,GAAwBO,IAE1D5I,GACIA,EAAYmE,UACPQ,EAAAA,EAAAA,CAAAA,EAAAA,GAAmCzpC,OAAOqf,KAAKuqB,GAAyB6D,KACxE7J,EAAAA,EAAAA,GAAwB6J,GAAmB,CAFhD,GAGK9D,EAAAA,EAAAA,GAAoC+D,GAA0B,IAJvEF,GAMH,CAER,CAuMOI,CAA+B7E,EAAUloC,KAAK8jC,SAASG,YAAaoI,EAAcC,GAClFtsC,KAAKgtC,4BALJ,CAMJ,GAvML,CAAAr5B,IAAA,WAAApT,MAoNI,SAASgsC,GACL,IAAKvsC,KAAK8jC,SAASmJ,WAAajtC,KAAK8jC,SAASG,YAC1C,OAAO/O,GAAO0C,oBAAoB,kCAKtC,GAFA53B,KAAK2pC,mBAAoB,GAEX,IAAV4C,EACAvsC,KAAK8jC,SAASG,YAAYiJ,WAAWrE,SAClC,GAAIxnC,MAAMwzB,QAAQ0X,GAAQ,CAE7B,IADA,IAAMY,EAA6C,CAAA,EAC1C5tC,EAAI,EAAGA,EAAIgtC,EAAM7sC,OAAQH,IAC9B4tC,EAASZ,EAAMhtC,KAAM,EAEzBS,KAAK8jC,SAASG,YAAYmE,SAAYS,EAAAA,GAAAA,GAAqCsE,GAC9E,MACGntC,KAAK8jC,SAASG,YAAYmE,SAAYS,EAAAA,GAAAA,GAAqC0D,GAElF,GAtOL,CAAA54B,IAAA,iBAAApT,MAmPI,SAAeomB,GAA4C,IAAAmhB,EAAA9nC,KAEvD,GADAA,KAAKotC,uBAAuBzmB,GACxB3mB,KAAK8jC,SAAS4H,qBAAsB,CACpC,IAAgC2B,EAAArtC,KAAKstC,mCAA7Bf,IAAAA,MAAOgB,IAAAA,aACf5mB,EAAS4lB,EAAOgB,EACnB,CACD,OAAO,WAAA,OAAMzF,EAAK0F,0BAA0B7mB,GAC/C,GA1PL,CAAAhT,IAAA,qCAAApT,MA4PI,SAAmCoT,EAAa85B,GAA2B,IAAAC,EAAAC,EACjEC,EAAoBC,EAAA,GAAA,uBAAAtsC,OACEoS,GAAQ85B,GAEpCztC,KAAK8jC,SAAS3xB,QAAQ,6BAA8B,CAChD85B,cAAet4B,EACfm6B,oBAAqBL,EACrBM,KAAMH,IAEV5tC,KAAKguC,4BAA4BJ,GAAsB,GAEvD,IAAMK,SAAgBjuC,KAAKgqC,mBAAoBr2B,CAAAA,EAAAA,EAAAA,CAAAA,EAAAA,EAAM85B,IACrD,QAAK3J,EAAAA,KAAAA,SAASG,mBAAd,IAAAyJ,GAAAA,EAA2BtF,UACtBQ,EAAAA,EAAAA,CAAAA,EAAAA,GAAmCzpC,OAAOqf,KAAKuqB,GAAyBkF,KACxElL,EAAAA,EAAAA,GAAwBkL,GAF7BN,IAIA3tC,KAAKgtC,4BACR,GA7QL,CAAAr5B,IAAA,yBAAApT,MA+QI,SAAuBomB,GAAkE,IAAAunB,EAAAluC,KAA5BmuC,0DACnDC,EAAiCpuC,KAAK8jC,SAASoG,aAAalH,IAElE,GAAKoL,IAAkCD,EAcnC,OAAOxnB,EAASynB,GAbhBpuC,KAAK8jC,SAASwH,cAAd,GAAA/pC,OACOvB,KAAK8jC,SAASK,WAAW,YAAgD,sCAAA5iC,OAAAvB,KAAK8jC,SAASK,WACtF,UAEJ,GACA,CAAEoH,OAAQ,QACV,SAACrD,GAAa,IAAAmG,EACJC,EAAuBpG,EAAwCoG,oBAErE,eADID,EAAAH,EAACpK,SAASG,4BAAamE,SAA3ByF,EAAA,CAAA,EAAuC7K,GAAoCsL,IACpE3nB,EAAS2nB,KAM/B,GAlSL,CAAA36B,IAAA,mCAAApT,MAoSI,WACI,IAAMgsC,EAAQvsC,KAAK2rC,WACb4B,EAAevtC,KAAKgqC,kBAW1B,MAAO,CACHuC,MATgBA,EAAMvyB,QAAO,SAACu0B,GAAD,OAAUhB,EAAagB,EAAvB,IAU7BhB,aATuBpuC,OAAOqf,KAAK+uB,GAClCvzB,QAAO,SAACw0B,GAAD,OAAgBjB,EAAaiB,EADd,IAEtBC,QAAO,SAACC,EAAuC/6B,GAE5C,OADA+6B,EAAI/6B,GAAO45B,EAAa55B,GACjB+6B,CAJY,GAKpB,CALoB,GAW9B,GArTL,CAAA/6B,IAAA,6BAAApT,MAuTI,WACI,IAAgCouC,EAAA3uC,KAAKstC,mCAA7Bf,IAAAA,MAAOgB,IAAAA,aACfvtC,KAAK4pC,yBAAyBr0B,SAAQ,SAACsJ,GAAD,OAAaA,EAAQ0tB,EAAOgB,KACrE,GA1TL,CAAA55B,IAAA,8BAAApT,MAiUI,SAA4B++B,GAAyD,IAAjCsP,6DAE1CC,EAAqB7uC,KAAK8jC,SAASoG,aAAajH,KAAiC,GAEvFjjC,KAAK8jC,SAASsE,SAAdyF,EAAA,CAAA,EACK5K,GACM4L,EAAAA,EAAAA,CAAAA,EAAAA,GACAvP,KAIPsP,GACA5uC,KAAK8jC,SAAS8K,oBAErB,GA/UL,CAAAj7B,IAAA,gCAAApT,MAiVI,WACIP,KAAK8jC,SAASoJ,WAAWjK,GAC5B,GAnVL,CAAAtvB,IAAA,6BAAApT,MA6VI,SAA2B++B,GAA6E,IAAjCsP,6DAE7DC,EAAqB7uC,KAAK8jC,SAASoG,aAAahH,KAAgC,GAEvC,IAA3C/jC,OAAOqf,KAAKqwB,GAAoBnvC,QAChCP,OAAOqf,KAAKqwB,GAAoBt5B,SAAQ,SAACu5B,GACrCD,EAAmBC,GAAnBC,EAAAA,EAAA,CAAA,EACOF,EAAmBC,IACnBxP,EAAWwP,WAEXxP,EAAWwP,MAI1B9uC,KAAK8jC,SAASsE,SAAdyF,EAAA,CAAA,EACK3K,GACM2L,EAAAA,EAAAA,CAAAA,EAAAA,GACAvP,KAIPsP,GACA5uC,KAAK8jC,SAAS8K,oBAErB,GArXL,CAAAj7B,IAAA,+BAAApT,MAuXI,SAA6ByuC,GACzB,GAAIA,EAAY,CACZ,IAAMH,EAAqB7uC,KAAK8jC,SAASoG,aAAahH,KAAgC,GACtFljC,KAAK8jC,SAASsE,SACTlF,EAAAA,CAAAA,EAAAA,UAAmC2L,GADxC,CAAA,EAAAhB,EAAA,CAAA,EAC6DmB,EAAa,CAD1E,KAGH,MACGhvC,KAAK8jC,SAASoJ,WAAWhK,GAEhC,KAhYLwG,CAAA,CAAA,GCvEMuF,GAAqB,oCAGdC,GAA+B,CACxCC,aAAc,WAAA,OAAM,CADoB,EAGxCpuC,MAAO,SAAUquC,GACbla,GAAOn0B,MAAM,sBAAwBquC,EAJD,EAOxCj5B,IAAK,SAAUnQ,GACX,IAGI,IAFA,IAAMqpC,EAASrpC,EAAO,IAChBspC,EAAKxpC,SAASypC,OAAO/qC,MAAM,KAAKwV,QAAO,SAAClP,GAAD,OAAOA,EAAEpL,MAAT,IACpCH,EAAI,EAAGA,EAAI+vC,EAAG5vC,OAAQH,IAAK,CAEhC,IADA,IAAIoH,EAAI2oC,EAAG/vC,GACW,KAAfoH,EAAEC,OAAO,IACZD,EAAIA,EAAEJ,UAAU,EAAGI,EAAEjH,QAEzB,GAA0B,IAAtBiH,EAAEpC,QAAQ8qC,GACV,OAAO7T,mBAAmB70B,EAAEJ,UAAU8oC,EAAO3vC,OAAQiH,EAAEjH,QAE9D,CACJ,CAAC,MAAO8M,GAAO,CAChB,OAAO,IArB6B,EAwBxCylB,MAAO,SAAUjsB,GACb,IAAIupC,EACJ,IACIA,EAASrpB,KAAK+L,MAAMid,GAAY/4B,IAAInQ,KAAU,EADlD,CAEE,MAAOwG,GAER,CACD,OAAO+iC,CA/B6B,EAkCxCr7B,IAAK,SAAUlO,EAAMzF,EAAOivC,EAAMC,EAAiBC,GAC/C,IACI,IAAIC,EAAU,GACVC,EAAU,GACVC,EAAS,GAEb,GAAIJ,EAAiB,CAEjB,IAAMjoC,EAAU1B,SAAS0L,SAASs+B,SAASzpC,MAAM4oC,IAC7Cc,EAASvoC,EAAUA,EAAQ,GAAK,GAEpCmoC,EAAUI,EAAS,aAAeA,EAAS,EAC9C,CAED,GAAIP,EAAM,CACN,IAAM1hB,EAAO,IAAI1a,KACjB0a,EAAKkiB,QAAQliB,EAAK0Y,UAAmB,GAAPgJ,EAAY,GAAK,GAAK,KACpDI,EAAU,aAAe9hB,EAAKmiB,aACjC,CAEGP,IACAG,EAAS,YAGb,IAAMK,EACFlqC,EACA,IACAmqC,mBAAmBjqB,KAAKC,UAAU5lB,IAClCqvC,EACA,yBACAD,EACAE,EAEJ,OADA/pC,SAASypC,OAASW,EACXA,CAhCX,CAiCE,MAAO1jC,GACL,MACH,CAtEmC,EAyExC+Y,OAAQ,SAAUvf,EAAMypC,GACpB,IACIP,GAAYh7B,IAAIlO,EAAM,IAAK,EAAGypC,EADlC,CAEE,MAAOjjC,GACL,MACH,CACJ,GAGD4jC,GAA0C,KAEjCC,GAA8B,CACvClB,aAAc,WACV,GAAgC,OAA5BiB,GACA,OAAOA,GAGX,IAAIE,GAAY,EAChB,GAAsB,oBAAXx8B,OACP,IACI,IAAMH,EAAM,kBAEZ08B,GAAWn8B,IAAIP,EADL,OAEkB,UAAxB08B,GAAWl6B,IAAIxC,KACf28B,GAAY,GAEhBD,GAAW9qB,OAAO5R,EAPtB,CAQE,MAAOnH,GACL8jC,GAAY,CACf,MAEDA,GAAY,EAOhB,OALKA,GACDpb,GAAOn0B,MAAM,0DAGjBqvC,GAA0BE,EACnBA,CA3B4B,EA8BvCvvC,MAAO,SAAUquC,GACbla,GAAOn0B,MAAM,uBAAyBquC,EA/BH,EAkCvCj5B,IAAK,SAAUnQ,GACX,IACI,OAAO8N,OAAOy8B,aAAaC,QAAQxqC,EADvC,CAEE,MAAOwG,GACL6jC,GAAWtvC,MAAMyL,EACpB,CACD,OAAO,IAxC4B,EA2CvCylB,MAAO,SAAUjsB,GACb,IACI,OAAOkgB,KAAK+L,MAAMoe,GAAWl6B,IAAInQ,KAAU,EAD/C,CAEE,MAAOwG,GAER,CACD,OAAO,IAjD4B,EAoDvC0H,IAAK,SAAUlO,EAAMzF,GACjB,IACIuT,OAAOy8B,aAAaE,QAAQzqC,EAAMkgB,KAAKC,UAAU5lB,GADrD,CAEE,MAAOiM,GACL6jC,GAAWtvC,MAAMyL,EACpB,CAzDkC,EA4DvC+Y,OAAQ,SAAUvf,GACd,IACI8N,OAAOy8B,aAAaG,WAAW1qC,EADnC,CAEE,MAAOwG,GACL6jC,GAAWtvC,MAAMyL,EACpB,CACJ,GAMCmkC,GAA8B,CH5JT,cG4JuB7N,IAErC8N,GAAqC7B,EAAAA,EAAA,CAAA,EAC3CsB,IAD2C,CAAA,EAAA,CAE9Cpe,MAAO,SAAUjsB,GACb,IACI,IAAI6qC,EAAqB,CAAA,EACzB,IAEIA,EAAS3B,GAAYjd,MAAMjsB,IAAS,CAAA,CACvC,CAAC,MAAOwG,GAAO,CAChB,IAAMjM,EAAQ03B,GAAQ4Y,EAAQ3qB,KAAK+L,MAAMoe,GAAWl6B,IAAInQ,IAAS,OAEjE,OADAqqC,GAAWn8B,IAAIlO,EAAMzF,GACdA,CARX,CASE,MAAOiM,GAER,CACD,OAAO,IAfmC,EAkB9C0H,IAAK,SAAUlO,EAAMzF,EAAOivC,EAAMC,EAAiBC,GAC/C,IACIW,GAAWn8B,IAAIlO,EAAMzF,GACrB,IAAMuwC,EAAiD,CAAA,EACvDH,GAA4Bp7B,SAAQ,SAAC5B,GAC7BpT,EAAMoT,KACNm9B,EAA0Bn9B,GAAOpT,EAAMoT,OAI3CxU,OAAOqf,KAAKsyB,GAA2BpxC,QACvCwvC,GAAYh7B,IAAIlO,EAAM8qC,EAA2BtB,EAAMC,EAAiBC,EAVhF,CAYE,MAAOljC,GACL6jC,GAAWtvC,MAAMyL,EACpB,CAjCyC,EAoC9C+Y,OAAQ,SAAUvf,EAAMypC,GACpB,IACI37B,OAAOy8B,aAAaG,WAAW1qC,GAC/BkpC,GAAY3pB,OAAOvf,EAAMypC,EAF7B,CAGE,MAAOjjC,GACL6jC,GAAWtvC,MAAMyL,EACpB,CACJ,IAGCukC,GAA4B,CAAA,EAGrBC,GAA+B,CACxC7B,aAAc,WACV,OAAO,CAF6B,EAKxCpuC,MAAO,SAAUquC,GACbla,GAAOn0B,MAAM,wBAA0BquC,EANH,EASxCj5B,IAAK,SAAUnQ,GACX,OAAO+qC,GAAc/qC,IAAS,IAVM,EAaxCisB,MAAO,SAAUjsB,GACb,OAAO+qC,GAAc/qC,IAAS,IAdM,EAiBxCkO,IAAK,SAAUlO,EAAMzF,GACjBwwC,GAAc/qC,GAAQzF,CAlBc,EAqBxCglB,OAAQ,SAAUvf,UACP+qC,GAAc/qC,EACxB,GAGDirC,GAA0C,KAKjCC,GAAgC,CACzC/B,aAAc,WACV,GAAgC,OAA5B8B,GACA,OAAOA,GAGX,GADAA,IAA0B,EACJ,oBAAXn9B,OACP,IACI,IAAMH,EAAM,cAEZu9B,GAAah9B,IAAIP,EADP,OAEoB,UAA1Bu9B,GAAa/6B,IAAIxC,KACjBs9B,IAA0B,GAE9BC,GAAa3rB,OAAO5R,EAPxB,CAQE,MAAOnH,GACLykC,IAA0B,CAC7B,MAEDA,IAA0B,EAE9B,OAAOA,EArB8B,EAwBzClwC,MAAO,SAAUquC,GACT/Y,GAAOC,OACPpB,GAAOn0B,MAAM,yBAA0BquC,EA1BN,EA8BzCj5B,IAAK,SAAUnQ,GACX,IACI,OAAO8N,OAAOq9B,eAAeX,QAAQxqC,EADzC,CAEE,MAAOwG,GACL0kC,GAAanwC,MAAMyL,EACtB,CACD,OAAO,IApC8B,EAuCzCylB,MAAO,SAAUjsB,GACb,IACI,OAAOkgB,KAAK+L,MAAMif,GAAa/6B,IAAInQ,KAAU,IADjD,CAEE,MAAOwG,GAER,CACD,OAAO,IA7C8B,EAgDzC0H,IAAK,SAAUlO,EAAMzF,GACjB,IACIuT,OAAOq9B,eAAeV,QAAQzqC,EAAMkgB,KAAKC,UAAU5lB,GADvD,CAEE,MAAOiM,GACL0kC,GAAanwC,MAAMyL,EACtB,CArDoC,EAwDzC+Y,OAAQ,SAAUvf,GACd,IACI8N,OAAOq9B,eAAeT,WAAW1qC,EADrC,CAEE,MAAOwG,GACL0kC,GAAanwC,MAAMyL,EACtB,CACJ,GCvSC4kC,GAAyF,CAC3F,SACA,eACA,sBACA,iBACA,UAOSC,GAAb,WAaI,SAAAA,EAAYhK,GAAuBlF,EAAAniC,KAAAqxC,GAG/B,IAAIlJ,EAAQ,GAERd,EAAM,QACNc,EAAQd,EAAM,MAAUzjC,QAAQ,MAAO,MAAMA,QAAQ,MAAO,MAAMA,QAAQ,KAAM,OAGpF5D,KAAKgqB,MAAQ,GACbhqB,KAAKsxC,uBAAwB,EAC7BtxC,KAAKuxC,uBAAyBlK,EAAM,wBAA8B,GAE9DA,EAAM,iBACNrnC,KAAKgG,KAAO,MAAQqhC,EAAM,iBAE1BrnC,KAAKgG,KAAO,MAAQmiC,EAAQ,YAMrB,IAFPiJ,GAAmC7sC,QAC/B8iC,EAAM,YAAgBllC,iBAG1B+yB,GAAOuC,SAAS,4BAA8B4P,EAAM,YAAkB,4BACtEA,EAAM,YAAkB,UAG5B,IAAMmK,EAAenK,EAAM,YAAgBllC,cACtB,iBAAjBqvC,GAAmCnB,GAAWlB,eAC9CnvC,KAAKyxC,QAAUpB,GACS,wBAAjBmB,GAA0CZ,GAAqBzB,eACtEnvC,KAAKyxC,QAAUb,GACS,mBAAjBY,GAAqCN,GAAa/B,eACzDnvC,KAAKyxC,QAAUP,GAEflxC,KAAKyxC,QADmB,WAAjBD,EACQR,GAEA9B,GAGnBlvC,KAAK0xC,WAAa,YAElB1xC,KAAK2xC,OACL3xC,KAAK4xC,cAAcvK,GACnBrnC,KAAK6xC,MACR,CA3DL,OAAA9H,EAAAsH,EAAA,CAAA,CAAA19B,IAAA,aAAApT,MA6DI,WACI,IAAMZ,EAAgB,CAAA,EAYtB,OAVAq4B,GAAMh4B,KAAKgqB,OAAO,SAAUvK,EAAGyZ,GAC3B,GAAIA,IAAM6J,IAAsC,WAAbxa,EAAO9I,GAEtC,IADA,IAAMjB,EAAOrf,OAAOqf,KAAKiB,GAChBlgB,EAAI,EAAGA,EAAIif,EAAK9e,OAAQH,IAC7BI,EAAc6e,YAAAA,OAAAA,EAAKjf,KAAQkgB,EAAEjB,EAAKjf,SP4ElD2S,EO1E8DgnB,EP4E1D4Y,GAAQ,GACA,QAJZvgB,EOzE6BgS,IP8ElBuO,EAEPhb,IAAiBvF,EAAIhtB,UAAYuyB,IACF,GAAxBvF,EAAIhtB,QAAQ2N,IAEvB8lB,GAAMzG,GAAK,SAAUhxB,GACjB,GAAIuxC,IAAUA,EAAQvxC,IAAU2R,GAC5B,OAAO8kB,EAGd,IACM8a,MOxFKnyC,EAAEu5B,GAAKzZ,GPuEC,IACpB8R,EACArf,EAEI4/B,COzEC,IACMnyC,CACV,GA3EL,CAAAgU,IAAA,OAAApT,MA6EI,WACI,IAAIP,KAAK+xC,SAAT,CAIA,IAAMC,EAAQhyC,KAAKyxC,QAAQxf,MAAMjyB,KAAKgG,MAElCgsC,IACAhyC,KAAKgqB,MAAQiO,GAAQ,CAAD,EAAK+Z,GAL5B,CAOJ,GAvFL,CAAAr+B,IAAA,OAAApT,MA8FI,WACQP,KAAK+xC,UAGT/xC,KAAKyxC,QAAQv9B,IAAIlU,KAAKgG,KAAMhG,KAAKgqB,MAAOhqB,KAAKiyC,YAAajyC,KAAKyvC,gBAAiBzvC,KAAK6vC,OACxF,GAnGL,CAAAl8B,IAAA,SAAApT,MAqGI,WAEIP,KAAKyxC,QAAQlsB,OAAOvlB,KAAKgG,MAAM,GAC/BhG,KAAKyxC,QAAQlsB,OAAOvlB,KAAKgG,MAAM,EAxGvC,GAAA,CAAA2N,IAAA,QAAApT,MA8GI,WACIP,KAAKulB,SACLvlB,KAAKgqB,MAAQ,EAChB,GAjHL,CAAArW,IAAA,gBAAApT,MAyHI,SAAcypB,EAAmBkoB,EAAoB1C,GAAwB,IAAAr7B,EAAAnU,KACzE,GAAIy4B,GAAUzO,GAAQ,MACW,IAAlBkoB,IACPA,EAAgB,QAEpBlyC,KAAKiyC,iBAA8B,IAATzC,EAAuBxvC,KAAKmyC,eAAiB3C,EAEvE,IAAI4C,GAAa,EASjB,GAPApa,GAAMhO,GAAO,SAAC2P,EAAKvjB,GACVjC,EAAK6V,MAAMnqB,eAAeuW,IAASjC,EAAK6V,MAAM5T,KAAU87B,IACzD/9B,EAAK6V,MAAM5T,GAAQujB,EACnByY,GAAa,EAEpB,IAEGA,EAEA,OADApyC,KAAK6xC,QACE,CAEd,CACD,OAAO,CACV,GA/IL,CAAAl+B,IAAA,WAAApT,MAsJI,SAASypB,EAAmBwlB,GAAwB,IAAAnJ,EAAArmC,KAChD,GAAIy4B,GAAUzO,GAAQ,CAClBhqB,KAAKiyC,iBAA8B,IAATzC,EAAuBxvC,KAAKmyC,eAAiB3C,EAEvE,IAAI4C,GAAa,EASjB,GAPApa,GAAMhO,GAAO,SAAC2P,EAAKvjB,GACX4T,EAAMnqB,eAAeuW,IAASiwB,EAAKrc,MAAM5T,KAAUujB,IACnD0M,EAAKrc,MAAM5T,GAAQujB,EACnByY,GAAa,EAEpB,IAEGA,EAEA,OADApyC,KAAK6xC,QACE,CAEd,CACD,OAAO,CACV,GAzKL,CAAAl+B,IAAA,aAAApT,MA2KI,SAAW6V,GACHA,KAAQpW,KAAKgqB,eACNhqB,KAAKgqB,MAAM5T,GAClBpW,KAAK6xC,OAEZ,GAhLL,CAAAl+B,IAAA,yBAAApT,MAkLI,WACSP,KAAKsxC,wBACNtxC,KAAKooC,SAASjL,GAAMC,eAAep9B,KAAKuxC,yBACxCvxC,KAAKsxC,uBAAwB,EAEpC,GAvLL,CAAA39B,IAAA,wBAAApT,MAyLI,WACIP,KAAKooC,SAASjL,GAAMU,aACvB,GA3LL,CAAAlqB,IAAA,uBAAApT,MA6LI,WACIP,KAAKooC,SAAS,CACViK,UAAWryC,KAAKgqB,MAAL,WAA2BmT,GAAMS,WAC5C0U,kBAAmBtyC,KAAKgqB,MAAL,mBAAmCmT,GAAMiC,mBAEnE,GAlML,CAAAzrB,IAAA,oBAAApT,MAoMI,WACI,OAAOy4B,GAAwB,CAC3BqZ,UAAWryC,KAAA,MAAA,UACXsyC,kBAAmBtyC,KAAA,MAAA,mBAvM/B,GAAA,CAAA2T,IAAA,aAAApT,MA+MI,SAAWypB,GAOP,OANAgO,GAAMh4B,KAAKgqB,OAAO,SAAU2P,EAAKvjB,GACvBA,KAAQ4T,IACVA,EAAM5T,GAAQujB,EAErB,IAEM3P,CACV,GAvNL,CAAArW,IAAA,gBAAApT,MAyNI,SAAc8mC,GACVrnC,KAAKmyC,eAAiBnyC,KAAKiyC,YAAc5K,EAAM,kBAC/CrnC,KAAKuyC,aAAalL,EAAM,qBACxBrnC,KAAKwyC,oBAAoBnL,EAAM,wBAC/BrnC,KAAKyyC,WAAWpL,EAAM,cACzB,GA9NL,CAAA1zB,IAAA,eAAApT,MAgOI,SAAawxC,GACT/xC,KAAK+xC,SAAWA,EACZ/xC,KAAK+xC,SACL/xC,KAAKulB,SAELvlB,KAAK6xC,MAEZ,GAvOL,CAAAl+B,IAAA,sBAAApT,MAyOI,SAAoBkvC,GACZA,IAAoBzvC,KAAKyvC,kBACzBzvC,KAAKyvC,gBAAkBA,EACvBzvC,KAAKulB,SACLvlB,KAAK6xC,OAEZ,GA/OL,CAAAl+B,IAAA,sBAAApT,MAiPI,WACI,QAASP,KAAKyvC,eACjB,GAnPL,CAAA97B,IAAA,aAAApT,MAqPI,SAAWsvC,GACHA,IAAW7vC,KAAK6vC,SAChB7vC,KAAK6vC,OAASA,EACd7vC,KAAKulB,SACLvlB,KAAK6xC,OAEZ,GA3PL,CAAAl+B,IAAA,kBAAApT,MA6PI,SAAgBmyC,EAAoBhmB,GAChC,IAAMimB,EAAS3yC,KAAKgqB,MAAMyY,KAAqB,CAAA,EAC/CkQ,EAAOD,GAAchmB,EACrB1sB,KAAKgqB,MAAMyY,IAAoBkQ,EAC/B3yC,KAAK6xC,MACR,GAlQL,CAAAl+B,IAAA,qBAAApT,MAoQI,SAAmBmyC,GACf,IACMhmB,GADS1sB,KAAKgqB,MAAMyY,KAAqB,CAAA,GACtBiQ,GAKzB,OAJKxb,GAAaxK,YACP1sB,KAAKgqB,MAAMyY,IAAkBiQ,GACpC1yC,KAAK6xC,QAEFnlB,CACV,GA5QL,CAAA/Y,IAAA,iBAAApT,MA8QI,WACI,OAAOP,KAAKgqB,MAAMqZ,KAAe,WACpC,GAhRL,CAAA1vB,IAAA,iBAAApT,MAkRI,SAAeqyC,GACX5yC,KAAKgqB,MAAMqZ,IAAcuP,EACzB5yC,KAAK6xC,MACR,GArRL,CAAAl+B,IAAA,mBAAApT,MAuRI,WACI,OAAOP,KAAKgqB,MAAMsZ,KAA0B,CAAA,CAC/C,GAzRL,CAAA3vB,IAAA,mBAAApT,MA2RI,SAAiBqyC,GACb5yC,KAAKgqB,MAAMsZ,IAAyBsP,EACpC5yC,KAAK6xC,MACR,KA9RLR,CAAA,CAAA,GCXawB,GACT,6VAESC,GAA2B,EAC3BC,GAAkB,EAClBC,GAAkC,EAClCC,GAAoB,EACpBC,GAAuB,EAEvBC,GAAmB,IAuEzB,IAAMC,GAA0B,kBA0CvC,ICvGKpuC,GDuGQquC,GAAbtJ,GAMI,SACqBhU,EAAAA,GAMnB,IAAAud,EAAAC,EAAAp/B,EAAAnU,KALmB4H,yDAIb,CAAA,EACNu6B,EAAAniC,KAAAqzC,GAAAxF,EAAA7tC,KAAA,aAZmB,KAYnB6tC,EAAA7tC,KAAA,aAXmB,IAWnB6tC,EAAA7tC,KAAA,kBAVgD,CAAA,GAUhD6tC,EAAA7tC,KAAA,gBAT+C,CAAA,GAS/C6tC,EAAA7tC,KAAA,iBAQsB,WACpBb,OAAOqf,KAAKrK,EAAKq/B,iBAAiBj+B,SAAQ,SAAC5B,GACvCQ,EAAKq/B,gBAAgB7/B,GAAOQ,EAAKq/B,gBAAgB7/B,GAAOQ,EAAKs/B,WAEzDt/B,EAAKq/B,gBAAgB7/B,IAAQQ,EAAKu/B,mBAC3Bv/B,EAAKq/B,gBAAgB7/B,SAbtCk6B,EAkBgC7tC,KAAA,2BAAA,SAAC4I,GAI/B,IAAM7B,EAAOoN,EAAK4hB,MAAMrgB,OAAOjD,QAAQ7J,GAGvC,GAAuB,SAAnB7B,aAAAA,EAAAA,EAAM+tB,WAAsB/tB,aAAgB+G,QAAS,CACrD,IAAM6lC,EAAa5sC,EAAKuO,QAAQ,OAEhC,GAAIq+B,EACA,MAAO,CAACx/B,EAAK4hB,MAAMrgB,OAAOlD,MAAMmhC,GAAaA,EAEpD,CAED,MAAO,CAAC/qC,EAAI7B,MAjCd8mC,EAoCwB7tC,KAAA,mBAAA,SAACuL,GAAyC,IAAAqoC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAChE,OACI,UAAA,UAAC5oC,EAAK+L,eAAN,IAAAu8B,OAAA,EAACA,EAAcn0C,cAAf,IAAAk0C,EAAAA,EAAyB,IACG,QAD5BE,EACC,QADDC,EACCxoC,EAAKzB,kBAAL,IAAAiqC,OAAA,EAAAA,EAAiBr0C,cAAU,IAAAo0C,EAAAA,EAAA,YAC3BvoC,EAFD,QAECA,EAAAA,EAAK8L,aAFN,IAAA48B,OAAA,EAECA,EAAYv0C,sBAAU,IAFvB,QAAAw0C,EAGC,QAHDC,EAGC5oC,EAAK4M,YAAL,IAAAg8B,OAAA,EAAAA,EAAWz0C,cAHZ,IAAAw0C,EAAAA,EAGsB,MAzC5BrG,EA6CyB7tC,KAAA,qBAAA,SAAC4V,GACxB,GAAIA,EAAM5T,OAASgxC,IAAmCp9B,EAAMrK,KAAK8I,SAAW6+B,GACxE,OAAOt9B,EAGX,IAAMrK,EAAOqK,EAAMrK,KACb6oC,EAAuBjgC,EAAKkgC,gBAAgB9oC,GAE9CA,EAAKzB,aAELyB,EAAKzB,WAAayB,EAAKzB,WAAWkQ,QAAO,SAACyqB,GAAS,IAAA6P,EAWVC,EAAAC,EAVrCC,EAAAhL,EAAuBt1B,EAAKugC,wBAAwBjQ,EAAK77B,IAAzD,GAAO2S,EAAPk5B,EAAA,GAAe1tC,EAAf0tC,EAAA,GAEA,GAAqC,IAAjCtgC,EAAKq/B,gBAAgBj4B,GACrB,OAAO,GAGXpH,EAAKq/B,gBAAgBj4B,GAA0C,UAAhCpH,EAAKq/B,gBAAgBj4B,UAAW,IAAA+4B,EAAAA,EAAAngC,EAAKu/B,WACpEv/B,EAAKq/B,gBAAgBj4B,GAAUlQ,KAAKspC,IAAIxgC,EAAKq/B,gBAAgBj4B,GAAU,EAAG,GAErC,IAAjCpH,EAAKq/B,gBAAgBj4B,MAChBpH,EAAKygC,cAAcr5B,KACpBpH,EAAKygC,cAAcr5B,IAAU,EACAA,QAA7Bg5B,GAAAC,EAAArgC,EAAKvM,SAAQitC,qBAAgBt5B,IAAAA,GAAAA,EAAAA,KAAAA,EAAAA,EAAQxU,KAI7C,OAAO09B,CACV,KAIL,IAAMqQ,EAAgB3gC,EAAKkgC,gBAAgB9oC,GAE3C,OAAsB,IAAlBupC,GAAuBV,IAAyBU,EAI7Cl/B,OAJP,KA/EF5V,KANmB+1B,MAAAA,EAMnB/1B,KALmB4H,QAAAA,EAMjB5H,KAAKyzC,WAAL,UAAkBzzC,KAAK4H,QAAQ6rC,kBAA/B,IAAAH,EAAAA,EAA6CtzC,KAAKyzC,WAClDzzC,KAAK0zC,WAAL,UAAkB1zC,KAAK4H,QAAQ8rC,kBAA/B,IAAAH,EAAAA,EAA6CvzC,KAAK0zC,WAClDqB,aAAY,WACR5gC,EAAK6gC,eADE,GAER,IACN,ICtICC,GAAgB,MAKTC,GAA8B,6BAOtClwC,GAAAA,EAAAA,yBAAAA,EAAAA,2BAAAA,EAAAA,yCAAAA,EAAAA,qBAAAA,EAAAA,qCAAAA,EAAAA,mBAAAA,EAAAA,2BAAAA,EAAAA,yCAAAA,EAAAA,qCAAAA,EAAAA,qCAAAA,EAAAA,kBAAAA,EAAAA,gBAAAA,EAAAA,kBAAAA,EAAAA,0CAAAA,EAAAA,4BAAAA,EAAAA,2CAAAA,EAAAA,KAAAA,QAmBL,IAAMmwC,GAAiB,CACnBnwC,GAAkByd,UAClBzd,GAAkBwrB,iBAClBxrB,GAAkByqB,OAClBzqB,GAAkByrB,eAClBzrB,GAAkB0rB,MAClB1rB,GAAkB0d,UAClB1d,GAAkB2rB,iBAClB3rB,GAAkBud,MAGT6yB,GAAb,WAwBI,SAAAA,EAAYtR,GAAmB,IAAA3vB,EAAAnU,KAAAmiC,EAAAniC,KAAAo1C,GAAAvH,EAlBSz6B,KAAAA,wBAAAA,KAAKD,OAkBd06B,EAAA7tC,KAAA,UAFtB,GAGLA,KAAK8jC,SAAWA,EAChB9jC,KAAKq1C,gBAAiB,EACtBr1C,KAAKs1C,UAAY,GACjBt1C,KAAKgY,MAAO,EACZhY,KAAKu1C,SAAWN,GAChBj1C,KAAKw1C,eAAY3sC,EACjB7I,KAAKy1C,SAAW,KAChBz1C,KAAK01C,UAAY,KACjB11C,KAAK21C,gBAAiB,EAEtB7hC,OAAOrC,iBAAiB,gBAAgB,WACpC0C,EAAKyhC,iBAEZ,CAtCL,OAAA7L,EAAAqL,EAAA,CAAA,CAAAzhC,IAAA,oBAAApT,MAwCI,WACI,GAAKP,KAAK8jC,SAAS+R,eAKnB,OAAO71C,KAAK8jC,SAAS+R,eAJjB3gB,GAAOn0B,MAAM,yDAKpB,GA/CL,CAAA4S,IAAA,0BAAApT,MAiDI,WACQP,KAAK81C,qBACL91C,KAAK+1C,2CAEL/1C,KAAKg2C,eAEZ,GAvDL,CAAAriC,IAAA,UAAApT,MAyDI,WACI,OAAOP,KAAKq1C,cACf,GA3DL,CAAA1hC,IAAA,gBAAApT,MA6DI,WACQP,KAAKq1C,gBAAkBr1C,KAAKw1C,YAC5Bx1C,KAAKw1C,YACLx1C,KAAKw1C,eAAY3sC,EACjB7I,KAAKq1C,gBAAiB,EAE7B,GAnEL,CAAA1hC,IAAA,qBAAApT,MAqEI,WACI,IAAM01C,IAAwBj2C,KAAK8jC,SAASoG,aAAavH,IACnDuB,GAAuBlkC,KAAK8jC,SAASK,WAAW,6BACtD,OAAO8R,GAAuB/R,CACjC,GAzEL,CAAAvwB,IAAA,6BAAApT,MA2EI,WACI,IAAM01C,IAAwBj2C,KAAK8jC,SAASoG,aAAatH,IACnDsB,EAAsBlkC,KAAK8jC,SAASK,WAAW,gCACrD,OAAOD,QAAAA,EAAuB+R,CACjC,GA/EL,CAAAtiC,IAAA,sBAAApT,MAiFI,WAAsB,IAAA21C,EACZC,EAA+Bn2C,KAAK8jC,SAASoG,aAAarH,IAEhE,OADqC,QAAAqT,EAAAl2C,KAAK8jC,SAASK,WAAW,4BAAzB,IAAA+R,OAAA,EAAAA,EAA+CE,kBAC7CD,GAAgC,IAC1E,GArFL,CAAAxiC,IAAA,sBAAApT,MAuFI,SAAoB2nC,GAA0B,IAAAmO,EAAAC,EAEXC,EAAAC,EAAA5K,EAOU6K,GARzCz2C,KAAK21C,gBAAiB,EAClB31C,KAAK8jC,SAASG,cACdjkC,KAAK8jC,SAASG,YAAYmE,UAA1ByF,EAAAjC,EAAA,CAAA,EACKjJ,KAA0CuF,EAAQ,kBADvD2F,EAAAjC,EAEKhJ,GAFL,QAAA2T,EAEiDrO,EAASwO,wBAF1D,IAAAH,OAAA,EAEiDA,EAA2BI,4BAF5E9I,EAAAjC,EAGK/I,GAHL,QAAA2T,EAGsDtO,EAASwO,wBAH/D,IAAAF,OAAA,EAGsDA,EAA2BJ,iBAHjFxK,IAMA,QAAJyK,EAAInO,EAASwO,wBAAT,IAAAL,GAAAA,EAA2Bd,WAC3Bv1C,KAAKu1C,SAAL,QAAgBrN,EAAAA,EAASwO,wBAAzB,IAAAD,OAAA,EAAgBA,EAA2BlB,UAG3C,QAAJe,EAAIpO,EAASwO,wBAAT,IAAAJ,GAAAA,EAA2BF,kBAC3Bp2C,KAAKo2C,gBAAkBlO,EAASwO,iBAAiBN,iBAErDp2C,KAAK42C,yBACR,GAxGL,CAAAjjC,IAAA,MAAApT,MA0GI,SAAIsyB,GAA0D,IAAAgkB,EAAzC7hB,yDAAkC,MACnD,QAAA6hB,EAAA72C,KAAK8jC,SAAS4S,wBAAd,IAAAG,GAAAA,EAAgCC,YAAY,CACxC90C,KAAM,EACNuJ,KAAM,CACFmb,OAAQ,kBACR3M,QAAS,CACLib,MAAAA,EACAU,MAAO,GAEP3b,QAAS,CAACmM,KAAKC,UAAU0M,MAGjCnG,UAAWkM,MAElB,GAxHL,CAAAjlB,IAAA,2CAAApT,MA0HI,WAAmD,IAAA8lC,EAAArmC,KAG3CA,KAAK21C,iBACL31C,KAAKgY,MAAO,EACZhY,KAAKs1C,UAAU//B,SAAQ,SAAC+pB,GAAD,OAAgB+G,EAAK0Q,yBAAyBzX,OAEzEt/B,KAAKg3C,eACR,GAlIL,CAAArjC,IAAA,gBAAApT,MAoII,WAAwB,IAAAunC,EAAA9nC,KACd61C,EAAiB71C,KAAKi3C,oBAC5B,GAAKpB,QAGwB,IAAlB12C,OAAOC,SAYdY,KAAKq1C,iBAAkBr1C,KAAK8jC,SAASK,WAAW,6BAApD,CAIAnkC,KAAKq1C,gBAAiB,EAEtBQ,EAAeqB,gCAEf,IAAMC,EAA4C,OAA/Bn3C,KAAKo3C,sBAAiC,iBAAmB,cAKxEp3C,KAAK8jC,SAASuT,4BAA8Br3C,KAAKo3C,sBACjD1a,GACI18B,KAAK8jC,SAASK,WAAW,YAAzB,WAAA5iC,OAAkD41C,EAAlD,OAAA51C,OAAkE80B,GAAOE,cACzE,SAAC/pB,GACG,GAAIA,EACA,OAAO0oB,GAAOn0B,+BAAwBo2C,GAAc3qC,GAGxDs7B,EAAKwP,iBACR,IAGLt3C,KAAKs3C,iBAvBR,CAyBJ,GAhLL,CAAA3jC,IAAA,sBAAApT,MAkLI,SAA4BqV,GAAsB,IAAA2hC,EAC9C,OAAO3hC,EAAM5T,OAASgxC,KAAmF,IAAhDmC,GAAe5wC,QAAf,QAAuBqR,EAAAA,EAAMrK,YAA7B,IAAAgsC,OAAA,EAAuBA,EAAYljC,OAC/F,GApLL,CAAAV,IAAA,6BAAApT,MAsLI,SAAmCqV,GAC/B,IAAMigC,EAAiB71C,KAAKi3C,oBAC5B,GAAKpB,EAAL,CAOA,IAAM2B,EAAoBx3C,KAAKy3C,oBAAoB7hC,GAkBnD,GAhBK4hC,GAAsBx3C,KAAK03C,QAExB9hC,EAAM8W,UAAY1sB,KAAK23C,sBA3OW,MA4OlC33C,KAAK03C,QAAS,GAIlBF,IACAx3C,KAAK23C,sBAAwB/hC,EAAM8W,UAC/B1sB,KAAK03C,SAEL13C,KAAK03C,QAAS,EACd13C,KAAK43C,0BAIT53C,KAAK03C,OAAT,CAKA,IAAgC7B,EAAAA,EAAeqB,+BAC1CM,EACD5hC,EAAM8W,WAFF+oB,IAAAA,SAAUC,IAAAA,WAMuD,IAArE,CAAC5C,GAA0BC,IAAiBxuC,QAAQqR,EAAM5T,OACzDhC,KAAKy1C,WAAaA,GAAYz1C,KAAK01C,YAAcA,GAElD11C,KAAK43C,uBAET53C,KAAKy1C,SAAWA,EAChBz1C,KAAK01C,UAAYA,CA5CoC,CAAA,CA6CxD,GAnOL,CAAA/hC,IAAA,uBAAApT,MAqOI,WACI,IAAKP,KAAKq1C,eACN,OAAO,EAEX,IAAI,IAAAwC,EAEA,eADK7hB,EAAAA,KAAAA,4BAAatL,oBACX,CAFX,CAGE,MAAO9pB,GAGL,OADAs0B,GAAOn0B,MAAM,8BAA+BH,IACrC,CACV,CACJ,GAjPL,CAAA+S,IAAA,kBAAApT,MAmPI,WAA0B,IAAAu3C,EAAA5J,EAAAluC,KAEhB+3C,EAAwD,CAG1D/vC,WAAY,gBACZC,mBAAeY,EACfsa,YAAa,kBACbnc,cAAe,UACfC,sBAAkB4B,EAClBT,gBAAYS,EACZ0kB,eAAe,EACfzrB,iBAAkB,CAVwC,EAW1DG,iBAAa4G,EACbkG,eAAgB,CAZ0C,EAa1D2W,cAAc,EACdxd,kBAAkB,EAClB8vC,0BAA0B,GAM9Bh4C,KAAKg2B,YAAcliB,OAAOiiB,MAAQjiB,OAAOiiB,MAAM3I,OAAStZ,OAAOkiB,YAI/D,IADA,IAAMiiB,EAA8Bj4C,KAAK8jC,SAASK,WAAW,qBAClChlC,EAAAA,EAAAA,EAAAA,OAAO4lB,QAAQkzB,GAA+B,CAAA,GAAKrzC,EAAAszC,EAAAx4C,OAAAkF,IAAA,CAAzE,IAAAuzC,EAAA1O,EAAAyO,EAAAtzC,GAAA,GAAO+O,EAAPwkC,EAAA,GAAY53C,EAAZ43C,EAAA,GACGxkC,KAAOokC,IAGPA,EAAwBpkC,GAAOpT,EAEtC,CAEIP,KAAKg2B,aAOVh2B,KAAKo4C,oBAAL,QACIN,EAAA93C,KAAKo4C,2BADT,IAAAN,EAAAA,EAEI,IAAIzE,GAAoBrzC,KAAKg2B,YAAc,CACvC6e,cAAe,SAACjsC,EAAI7B,GAChB,IAAM8rB,EAAyCjqB,+BAAAA,OAAAA,EAA/C,8EACAssB,GAAO+B,IAAIpE,EAAS,CAChB9rB,KAAMA,IAGVmnC,EAAKjX,IAAI,sBAAwBpE,EAAS,OAC7C,IAGT7yB,KAAKw1C,UAAYx1C,KAAKg2B,YAAL+Y,EAAA,CACb/2B,KAAM,SAACpC,GACHs4B,EAAK4I,YAAYlhC,EAFR,EAIb6Q,QACK3S,OAAeqiB,oBAAsBn2B,KAAKq4C,6BACrC,CAAEvkC,OAAeqiB,mBAAmBC,0BACpC,IACP2hB,IAKP/3C,KAAK8jC,SAASwU,iBAAgB,SAAC15B,GAE3B,IACmC,IAAA25B,EAA/B,GAAkB,cAAd35B,EACA,QAAA25B,EAAArK,EAAKlY,mBAAL,IAAAuiB,GAAAA,EAAkBrnB,eAAe,YAAa,CAAEvtB,KAAMmQ,OAAOtC,SAAS7N,MAF9E,CAIE,MAAO/C,GACLs0B,GAAOn0B,MAAM,2CAA4CH,EAC5D,CACJ,IAGDZ,KAAK23C,sBAAwBvkC,KAAKD,MAClCnT,KAAK03C,QAAS,GA7CVxiB,GAAOn0B,MACH,uGA6CX,GArUL,CAAA4S,IAAA,cAAApT,MAuUI,SAAYi4C,GACR,GAAKA,GAAgC,WAApBjwB,EAAOiwB,GAAxB,CAIA,IAAMC,EAAiBz4C,KAAKo4C,oBACtBp4C,KAAKo4C,oBAAoBM,kBAAkBF,GAC3CA,EAEN,GAAKC,EAAL,CAIA,IAAAE,ED5UD,SAA8BptC,GACjC,IAAIqtC,EAAkB1yB,KAAKC,UAAU5a,GAIrC,GAAIqtC,EAAgBl5C,OAASyzC,GAAkB,CAK3C,IAL2ClK,EAAAE,EAAAC,EAM3BwP,EAAgBC,SADX,uCALsB,IAO3C,IAA6B1P,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IAAlB6F,EAAkB4iC,EAAA1oC,MAErBq4C,EAD6C,WAA7CvyC,EAAM,GAAGyyC,oBAAoBx3C,MAAM,EAAG,GACpBs3C,EAAgBh1C,QAAQyC,EAAM,GAAIwsC,IAElC+F,EAAgBh1C,QAAQyC,EAAM,GAAI,GAE3D,CAb0C,CAAA,MAAAmG,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAc9C,CACD,MAAO,CAAE1iB,MAAOsQ,KAAK+L,MAAM2mB,GAAkBG,KAAMH,EAAgBl5C,OACtE,CCuT+Bs5C,CD/SzB,SAAkCC,GACrC,IAAMrjC,EAAQqjC,EAKd,GACIrjC,GACiB,WAAjB2S,EAAO3S,IACPA,EAAM5T,OAASixC,IACO,WAAtB1qB,EAAO3S,EAAMrK,OACbqK,EAAMrK,KAAKmb,SAAW0sB,GACxB,CAEMx9B,EAAMrK,KAAKwO,QAAQA,QAAQra,OAVP,KAWpBkW,EAAMrK,KAAKwO,QAAQA,QAAUnE,EAAMrK,KAAKwO,QAAQA,QAAQzY,MAAM,EAX1C,IAYpBsU,EAAMrK,KAAKwO,QAAQA,QAAQjZ,KAAK,mBAGpC,IADA,IAAMo4C,EAAiB,GACd35C,EAAI,EAAGA,EAAIqW,EAAMrK,KAAKwO,QAAQA,QAAQra,OAAQH,IAE/CqW,EAAMrK,KAAKwO,QAAQA,QAAQxa,IAC3BqW,EAAMrK,KAAKwO,QAAQA,QAAQxa,GAAGG,OAnBlB,IAqBZw5C,EAAep4C,KAAK8U,EAAMrK,KAAKwO,QAAQA,QAAQxa,GAAG+B,MAAM,EArB5C,KAqBkE,kBAE9E43C,EAAep4C,KAAK8U,EAAMrK,KAAKwO,QAAQA,QAAQxa,IAKvD,OAFAqW,EAAMrK,KAAKwO,QAAQA,QAAUm/B,EAEtBD,CACV,CACD,OAAOA,CACV,CC6QoDE,CAAyBV,IAA9D7iC,IAAAA,MAAOmjC,IAAAA,KAIf,GAFA/4C,KAAKo5C,2BAA2BxjC,IAE5B5V,KAAK03C,OAAT,CAKA,IAAMpY,EAAa,CACf+Z,gBAAiBN,EACjBO,eAAgB1jC,EAChB2jC,YAAav5C,KAAK01C,UAClB8D,WAAYx5C,KAAKy1C,UAGjBz1C,KAAKgY,KACLhY,KAAK+2C,yBAAyBzX,GAE9Bt/B,KAAKs1C,UAAUx0C,KAAKw+B,EAZvB,CATA,CARA,CA+BJ,GAzWL,CAAA3rB,IAAA,eAAApT,MA2WI,WAiBI,OAhBIP,KAAKy5C,mBACL7nC,aAAa5R,KAAKy5C,kBAClBz5C,KAAKy5C,sBAAmB5wC,GAGxB7I,KAAKwL,QAAsC,IAA5BxL,KAAKwL,OAAOD,KAAK7L,QAChCM,KAAK05C,iBAAiB,CAClBL,gBAAiBr5C,KAAKwL,OAAOutC,KAC7BO,eAAgBt5C,KAAKwL,OAAOD,KAC5BguC,YAAav5C,KAAKwL,OAAOkqC,UACzB8D,WAAYx5C,KAAKwL,OAAOiqC,WAIhCz1C,KAAKwL,YAAS3C,EAEP,CACHkwC,KAAM,EACNxtC,KAAM,GACNmqC,UAAW11C,KAAK01C,UAChBD,SAAUz1C,KAAKy1C,SAEtB,GAlYL,CAAA9hC,IAAA,2BAAApT,MAoYI,SAAiC++B,GAAwB,IAAAqa,EAAAC,EAAA55C,KAC/C65C,EAAkB,IAAK,QAAAF,EAAA35C,KAAKwL,cAAL,IAAAmuC,OAAA,EAAAA,EAAapuC,KAAK7L,SAAU,KAEpDM,KAAKwL,QACNxL,KAAKwL,OAAOutC,KAAOzZ,EAAW+Z,gBAAkBQ,EA/apB,UAgb5B75C,KAAKwL,OAAOkqC,YAAc11C,KAAK01C,aAE/B11C,KAAKwL,OAASxL,KAAK41C,gBAGvB51C,KAAKwL,OAAOutC,MAAQzZ,EAAW+Z,gBAC/Br5C,KAAKwL,OAAOD,KAAKzK,KAAKw+B,EAAWga,gBAE5Bt5C,KAAKy5C,mBACNz5C,KAAKy5C,iBAAmB/nC,YAAW,WAC/BkoC,EAAKhE,cADyB,GAxbN,KA4bnC,GAtZL,CAAAjiC,IAAA,mBAAApT,MAwZI,SAAyB++B,GAErBt/B,KAAK8jC,SAAS3xB,QAAQ,YAAamtB,EAAY,CAC3Cwa,UAAW,MACXvO,OAAQ,OACRgK,SAAUv1C,KAAKu1C,SACfwE,aAAa,EACbC,UAAW9E,GACX+E,SAAU,CACNC,oBAAqB5a,EAAWga,eAAet3C,OAAS8wC,KAGnE,KApaLsC,CAAA,CAAA,GC3DM+E,GAAwD,CAE1DC,UAAW,EACXC,WAAY,EACZr0C,KAAM,EAGNs0C,UAAW,EACXC,cAAe,EACfC,YAAa,EACbC,YAAa,EACbC,WAAY,EACZC,kBAAmB,EACnBC,gBAAiB,EACjBC,aAAc,GACdC,sBAAuB,GACvBC,WAAY,GACZC,aAAc,GACdC,cAAe,GACfC,YAAa,GACbC,gBAAiB,GACjBC,gBAAiB,GACjBC,cAAe,GACfC,gBAAiB,GACjBC,qBAAsB,GACtBC,eAAgB,GAChBC,aAAc,GAGdlyC,QAAS,GACTmyC,WAAY,GACZC,SAAU,GACV5C,KAAM,GACNnwC,GAAI,GACJzE,IAAK,GAGLy3C,YAAa,GACbC,sBAAuB,GACvBC,eAAgB,GAChBC,aAAc,GACdC,eAAgB,GAChBC,cAAe,GACfC,eAAgB,GAChBC,eAAgB,GAChBC,iBAAkB,GAGlBC,SAAU,GACV3vB,UAAW,IAWT4vB,GAAyB,CAE3B,cAGA,aACA,QACA,YAKEC,GAA0B,CAAC,MAFM,OAI1BC,GAAb,WAQI,SAAAA,EAAY1Y,GAAmB3B,EAAAniC,KAAAw8C,GAAA3O,EAAA7tC,KAAA,wBAFR,GAGnBA,KAAK8jC,SAAWA,CACnB,CAVL,OAAAiG,EAAAyS,EAAA,CAAA,CAAA7oC,IAAA,0BAAApT,MAYI,WACQP,KAAKy8C,YACLz8C,KAAK08C,iBAEL18C,KAAK28C,eAEZ,GAlBL,CAAAhpC,IAAA,iBAAApT,MAoBI,WAAiB,IAAAq8C,EAAAC,EAAA1oC,EAAAnU,KACb,IAAIA,KAAK0d,SAIT,QAAyD7U,KAArD,QAAA+zC,EAAA9oC,cAAA,IAAA8oC,GAA6BE,QAA7BD,EAAAD,EAAQG,2BAAqBD,IAAAA,OAA7B,EAA6BA,EAAAA,qBAOjC,IVgiBGlmB,GAAapB,SAAShkB,SAASs+B,WUhiBZ9vC,KAAKg9C,qBAK3B,IAGIh9C,KAAK0d,SAAW,IAAIq/B,qBAAoB,SAACv0B,GACrCA,EAAKy0B,aAAa1nC,SAAQ,SAACy8B,GACvB79B,EAAK+oC,yBAAyBlL,SAMtC,IAAMmL,EAAaJ,oBAAoBD,oBAAoB9iC,QAAO,SAAClP,GAAD,OAAOwxC,GAAuB9mB,SAAS1qB,EAAvC,IAElEqyC,EAAW5nC,SAAQ,SAAC6kC,GAAc,IAAAgD,EACfx/B,QAAfw/B,EAAAjpC,EAAKuJ,gBAAUE,IAAAA,GAAAA,EAAAA,QAAQ,CAAE5b,KAAMo4C,EAAWiD,UAAU,MAd5D,CAgBE,MAAOz8C,GACL6L,QAAQ1L,MAAM,+CAAgDH,GAC9DZ,KAAK28C,eACR,MAvBGznB,GAAO+B,IAAI,6EAPX/B,GAAO+B,IACH,yGA8BX,GAzDL,CAAAtjB,IAAA,gBAAApT,MA2DI,WACQP,KAAK0d,WACL1d,KAAK0d,SAASmJ,aACd7mB,KAAK0d,cAAW7U,EAEvB,GAhEL,CAAA8K,IAAA,cAAApT,MAkEI,WACI,QAASP,KAAK0d,QACjB,GApEL,CAAA/J,IAAA,YAAApT,MAsEI,WAAY,IAAA+8C,EAAApH,EACR,OAAA,QAAOoH,EAAmD,QAAnDpH,EAAAl2C,KAAK8jC,SAASK,WAAW,8BAA0B,IAAA+R,EAAAA,EAAAl2C,KAAKu9C,qBAA/D,IAAAD,GAAAA,CACH,GAxEL,CAAA3pC,IAAA,sBAAApT,MA0EI,SAAoB2nC,GAChBloC,KAAKu9C,cAAgBrV,EAASsV,qBAAsB,EAChDx9C,KAAKy8C,aACLz8C,KAAK08C,gBAEZ,GA/EL,CAAA/oC,IAAA,2BAAApT,MAiFI,SAAyBqV,GAGrB,GAAiE,IAA7DA,EAAM5P,KAAKzB,QAAQvE,KAAK8jC,SAASK,WAAW,aAAoB,CAChE,IAAMpnB,EAAOnH,EAAM5P,KAAKpC,QAAQ5D,KAAK8jC,SAASK,WAAW,YAAa,IAEtE,GAAIoY,GAAwBpyC,MAAK,SAACW,GAAD,OAA2B,IAApBiS,EAAKxY,QAAQuG,EAApB,IAC7B,MAPsC,CAa9C,IAAI2yC,EAAoD,CACpDt5C,IAAKyR,EAAM5P,MAGTiyC,EAA8Bj4C,KAAK8jC,SAASK,WAAW,qBAM7D,GAJI8T,EAA4ByF,uBAC5BD,EAAiBxF,EAA4ByF,qBAAqBD,IAGjEA,EAAL,CAIA,IAAME,EAAY/nC,EAAMgoC,SACxBD,EAAU33C,KAAOy3C,EAAet5C,IAChC,IAAMm7B,EAAqC,CAAA,EAKrC+a,EAAahvC,KAAKwyC,MAAMzqC,KAAKD,MAAQ2qC,YAAY3qC,OAKvD,IAAK,IAAMQ,KAJX2rB,EAAW6a,GAA0B,YAAkBE,EAGvD/a,EAAW6a,GAA0B,WAAiB9uC,KAAKwyC,MAAMxD,EAAazkC,EAAM0kC,WAClEH,QACStxC,IAAnB80C,EAAUhqC,KACV2rB,EAAW6a,GAA2BxmC,IAAQgqC,EAAUhqC,IAMhE,GAFA3T,KAAK+9C,wBAAwBze,GAEzB0e,GAAoBpoC,GAAQ,CAAA,IAAAqzB,EAAAE,EAAAC,EACPxzB,EAAMqoC,cAAgB,IADf,IAC5B,IAA+C9U,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IAAA09C,EAApCC,EAAoClV,EAAA1oC,MAC3CP,KAAK+9C,gCACA5D,GAA0B,WAAiBE,GADhDxM,EAAAqQ,EAEK/D,GAA0B,UAAgB9uC,KAAKwyC,MAAMxD,EAAazkC,EAAM0kC,gBACxEH,GAA0B,KAAWgE,EAAOn4C,MAC5Cm0C,EAAAA,EAAAA,GAA0B,SAAegE,EAAO9B,UAJrDxO,EAAAqQ,EAUK/D,GAA0B,UAAgB,gBAV/C+D,GAYH,CAd2B,CAAA,MAAA1xC,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAe/B,CArCA,CAsCJ,GAhJL,CAAA3kB,IAAA,0BAAApT,MAqJI,SAAgC++B,GAAoC,IAAAuX,EAC1DnqB,EAAY4S,EAAW6a,GAA0B,WAEvD,QAAAtD,EAAA72C,KAAK8jC,SAAS4S,wBAAd,IAAAG,GAAAA,EAAgCC,YAAY,CACxC90C,KAAM,EACNuJ,KAAM,CACFmb,OAAQ,oBACR3M,QAASulB,GAEb5S,UAAAA,GAUP,KAxKL8vB,CAAA,CAAA,GAgLMwB,GAAsB,SAACpoC,GAAD,MACJ,eAApBA,EAAMwkC,WAAkD,aAApBxkC,EAAMwkC,SADlB,ECxPfgE,GAAb,WAGI,SAAAA,EAAYta,GAAmB3B,EAAAniC,KAAAo+C,GAC3Bp+C,KAAK8jC,SAAWA,EAEhB9jC,KAAK8jC,SAAS4H,qBAAuB1rC,KAAK8jC,SAASua,8BACtD,CAPL,OAAAtU,EAAAqU,EAAA,CAAA,CAAAzqC,IAAA,OAAApT,MASI,WAAa,IAAA4T,EAAAnU,KAgBH8qC,EAAelR,GAZH1T,KAAKC,UAAU,CAC7BgiB,MAAOnoC,KAAK8jC,SAASK,WAAW,SAChC4G,YAAa/qC,KAAK8jC,SAASkH,kBAC3BC,OAAQjrC,KAAK8jC,SAASoH,YACtBC,kBAAmBnrC,KAAK8jC,SAASoG,aAAajH,IAC9CmI,iBAAkBprC,KAAK8jC,SAASoG,aAAahH,IAC7CmI,cACIrrC,KAAK8jC,SAASK,WAAW,mCACzBnkC,KAAK8jC,SAASK,WAAW,sDACzBt7B,KAIR7I,KAAK8jC,SAASwH,cACP,GAAA/pC,OAAAvB,KAAK8jC,SAASK,WAAW,YAC5B,gBAAA,CAAE54B,KAAMu/B,EAAcwT,SAAS,GAC/B,CAAE/S,OAAQ,SACV,SAACrD,GAAD,OAAc/zB,EAAKoqC,oBAAoBrW,KAE9C,GAhCL,CAAAv0B,IAAA,sBAAApT,MAkCI,SAAoB2nC,GAAgC,IAAA2O,EAAA2H,EAAAC,EAAApY,EAAArmC,KAIhD,GAHAA,KAAK8jC,SAASkF,aAAa0V,oBAC3B1+C,KAAK8jC,SAASkF,aAAa2B,oBAAmB,GAErB,KAArBzC,aAAAA,EAAAA,EAAUyW,QAAd,CAIA,IAAM74C,WAAYA,SAASkP,KAKvB,OAJAvI,QAAQwqB,IAAI,oEACZvlB,YAAW,WACP20B,EAAKkY,oBAAoBrW,EADnB,GAEP,KAeP,GAXAloC,KAAK8jC,SAAS8a,QAAQ3W,oBAAoBC,GACVD,QAAhC4O,EAAA72C,KAAK8jC,SAAS4S,wBAAkBzO,IAAAA,GAAAA,EAAAA,oBAAoBC,GACpDzE,GAAYwE,oBAAoBC,EAAUloC,KAAK8jC,UACjBmE,QAA9BuW,EAAAx+C,KAAK8jC,SAAS+a,sBAAgB5W,IAAAA,GAAAA,EAAAA,oBAAoBC,GACdD,QAApCwW,EAAAz+C,KAAK8jC,SAASgb,4BAAsB7W,IAAAA,GAAAA,EAAAA,oBAAoBC,GAEnDloC,KAAK8jC,SAASK,WAAW,iDAC1BnkC,KAAK8jC,SAASkF,aAAayC,qBAAqBvD,GAGpDloC,KAAK8jC,SAAL,YAA+B,GAC3BoE,EAAQ,uBAA6BloC,KAAK8jC,SAASK,WAAW,uBAAwB,CACtF,IADsF8E,EAChF8V,EAAqD,CAAA,EACtC7W,EAAAA,EAAAA,EAAQ,sBAFyD,IAEtF,IAAuDiB,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CACnDu+C,EADmD9V,EAAA1oC,QAC7B,CACzB,CAJqF,CAAA,MAAAiM,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAKtFt4B,KAAK8jC,SAAL,YAA+Bib,CAClC,CAED,GAAI7W,EAAQ,SACR,GAAIloC,KAAK8jC,SAASK,WAAW,oBAAqB,CAC9C,IAD8C6a,EACxCC,EAAUj/C,KAAK8jC,SAASK,WAAW,YACf+D,EAAAA,EAAAA,EAAQ,UAFY,IAAA,IAAAgX,EAAA,WAAA,IAAAC,EAAAH,EAAAz+C,MAEjCqI,IAAAA,GAAIzE,IAAAA,IACPi7C,EAAY,CACdH,EACgC,MAAhCA,EAAQA,EAAQv/C,OAAS,IAAyB,MAAXyE,EAAI,GAAaA,EAAIoC,UAAU,GAAKpC,GAC7ElB,KAAK,IAEL6Q,OAAkClL,mBAAAA,OAAAA,IAAQy9B,EAAKvC,SAEjDpH,GAAW0iB,GAAW,SAAC5yC,GACfA,GACAC,QAAQ1L,MAA6D6H,uDAAAA,OAAAA,GAAM4D,EAElF,GAdyC,EAE9C,IAAgD6yC,EAAA//C,MAAA0/C,EAAAK,EAAA7/C,KAAAgB,MAAA0+C,GAFF,CAAA,MAAA1yC,GAAA6yC,EAAAz+C,EAAA4L,EAAA,CAAA,QAAA6yC,EAAA/mB,GAAA,CAAlD,MAgBW4P,EAAQ,SAAaxoC,OAAS,GACrC+M,QAAQ1L,MAAM,mFA9CrB,MAFG0L,QAAQ1L,MAAM,8CAmDrB,KA1FLq9C,CAAA,CAAA,GCNakB,GAAwB,CAAC,0BAA2B,wCCKpDC,GAAb,WAEI,SAAAA,EAAYzb,GAAmB3B,EAAAniC,KAAAu/C,GAC3Bv/C,KAAK8jC,SAAWA,CACnB,CAJL,OAAAiG,EAAAwV,EAAA,CAAA,CAAA5rC,IAAA,sBAAApT,MAMI,SAAoB2nC,GAChB,IAAMsX,EACFtX,EAAQ,eACRA,EAAQ,eACPA,EAAQ,eAAqB,CAAEuX,eAAgBvX,EAAQ,gBAAuB,CAF/E,GAIAA,EAAQ,iBACRsX,EAAa,gBAC0C,IAAvDA,EAAa,eAAmBj7C,QAAQ,YAExCvE,KAAK0/C,iBACEF,GAGd,GApBL,CAAA7rC,IAAA,mBAAApT,MA2BI,WAIW,IAHPiR,EAGO/R,UAAAC,OAAA,QAAAmJ,IAAApJ,UAAA,GAAAA,UAAA,GAHIqU,OAAOtC,SAClB++B,8DAAoC1nC,EACpC82C,EACOlgD,UAAAC,OAAA,QAAAmJ,IAAApJ,UAAA,GAAAA,UAAA,GADGqU,OAAO6rC,QAEjB,IAEI,IAAKpP,EAAc,CACf,IACIz8B,OAAOy8B,aAAaE,QAAQ,OAAQ,QACpC38B,OAAOy8B,aAAaG,WAAW,OAFnC,CAGE,MAAO3vC,GACL,OAAO,CALI,CASfwvC,EAAez8B,OAAOy8B,YACzB,CAED,IAGIiP,EAHEI,EAAYnkB,GAAcjqB,EAASkqB,KAAM,cAAgBD,GAAcjqB,EAASkqB,KAAM,SACtFkX,EAAQgN,EAAY15B,KAAK+L,MAAMuJ,mBAAmBokB,IAAc,KA6BtE,OA5BqBhN,GAA6B,iBAApBA,EAAK,SAK/B4M,EAAgB5M,GACFv+B,OAAS,MAEnBmrC,GAAiBrgD,OAAOqf,KAAKghC,GAAe9/C,OAAS,IACjDkzC,EAAK,YAELphC,EAASkqB,KAAOkX,EAAK,YACd+M,EACPA,EAAQE,aAAa,GAAI/5C,SAASg6C,MAAOtuC,EAASwuB,SAAWxuB,EAAS2c,QAEtE3c,EAASkqB,KAAO,OAKxB8jB,EAAgBt5B,KAAK+L,MAAMse,EAAaC,QAAQ,0BAA4B,OAC9Dn8B,OAAS,sBAIhBmrC,EAAcO,eAGrBP,EAAa,OAAax/C,KAAK8jC,SAASK,WAAW,WAAaqb,EAAa,SAC7Ex/C,KAAK0/C,YAAYF,IACV,EA9Cf,CAkDE,MAAO5+C,GACL,OAAO,CACV,CACJ,GArFL,CAAA+S,IAAA,cAAApT,MAuFI,SAAYg9B,GAAiC,IAAAppB,EAAAnU,KACzC,GAAK8T,OAAD,sBACA,OAAO,EAGTA,OAAD,uBAA2C,EAI5C,IAAMpS,EAAO1B,KAAK8jC,SAASK,WAAW,YAChC6b,EAAmE,IAAjC30C,KAAKwyC,MAAMzqC,KAAKD,MAAQ,KAC1D8sC,EAAU,GAAA1+C,OAAMG,GAANH,OACZG,EAAKkO,SAAS,KAAO,GAAK,IADd,0BAAArO,OAESy+C,GACnBE,GACDZ,GAAsB9pB,SAASx1B,KAAK8jC,SAASK,WAAW,cACzDnkC,KAAK8jC,SAASK,WAAW,oCAEvBqb,EAAazQ,EAAAA,EAAA,CACf5G,MAAOnoC,KAAK8jC,SAASK,WAAW,UAC7B5G,GAFY,GAAA,CAGf4iB,OAAQz+C,GACJw+C,EAAwB,CAAEE,YAAY,GAAU,CAJrC,GAO8BZ,EAAzCnrC,OAAR,IAA6BgsC,EAA7BC,EAAiDd,EAAjDe,IAgBA,OAfAzsC,OAAOy8B,aAAaE,QAAQ,wBAAyBvqB,KAAKC,UAAUk6B,IAEpE3jB,GAAWujB,GAAY,SAACzzC,GAChBA,EACA0oB,GAAOn0B,MAAM,yBAA0ByL,IAGxCsH,OAAD,iBAAuCA,OAAD,gBAAmC0rC,EAAerrC,EAAK2vB,aAInGnI,GAAgB7nB,OAAQ,mBAAmB,WACrCA,OAAD,uBAA2C,EAC5CK,EAAKurC,YAAYF,EACpB,KACM,CACV,GAjIL,CAAA7rC,IAAA,cAAApT,MAoII,SAAYg9B,GACR,OAAOv9B,KAAK0/C,YAAYniB,EAC3B,GAtIL,CAAA5pB,IAAA,kBAAApT,MAyII,WAIW,IAHPiR,EAGO/R,UAAAC,OAAA,QAAAmJ,IAAApJ,UAAA,GAAAA,UAAA,GAHIqU,OAAOtC,SAClB++B,8DAAoC1nC,EACpC82C,EACOlgD,UAAAC,OAAA,QAAAmJ,IAAApJ,UAAA,GAAAA,UAAA,GADGqU,OAAO6rC,QAEjB,OAAO3/C,KAAKwgD,iBAAiBhvC,EAAU++B,EAAcoP,EACxD,KA/ILJ,CAAA,CAAA,GCuBMkB,GAAkC,mBAejC,SAASC,GAAMvY,EAAevgC,GACjC+4C,IAAU,EAAMxY,EAAOvgC,EAC1B,CAYM,SAASg5C,GAAOzY,EAAevgC,GAClC+4C,IAAU,EAAOxY,EAAOvgC,EAC3B,CAUM,SAASi5C,GAAW1Y,EAAevgC,GACtC,MAA4C,MAArCk5C,GAAiB3Y,EAAOvgC,EAClC,CAWM,SAASm5C,GAAY5Y,EAAevgC,GACvC,QAsEJ,SAA8BA,GAC1B,GAAIA,GAAWA,EAAQo5C,WAAY,CAC/B,IAAM7vC,EAAOvJ,GAAWA,EAAQkM,QAAWA,GACrCmtC,EAAM9vC,EAAG,WAAiB,CAAA,EAC5B+vC,GAAW,EAaf,OAZAlpB,GACI,CACIipB,EAAG,WACFA,EAAD,aACC9vC,EAAD,aAEJ,SAAUgwC,GACF5oB,GAAU,EAAC,EAAM,EAAG,IAAK,OAAQ4oB,KACjCD,GAAW,EAElB,IAEEA,CACV,CACD,OAAO,CACV,CA1FOE,CAAqBx5C,IAGmB,MAArCk5C,GAAiB3Y,EAAOvgC,EAClC,CAYM,SAASy5C,GAAclZ,EAAevgC,GAEzC05C,GADA15C,EAAUA,GAAW,IACA2d,OAAOg8B,GAAepZ,EAAOvgC,KAAYA,EAAQ45C,qBACzE,CAUD,SAASF,GAAY15C,GAEjB,MAAgC,kBADhCA,EAAUA,GAAW,IACT65C,gBACDpR,GAEqB,wBAA5BzoC,EAAQ65C,gBACD7Q,GAEJ1B,EACV,CASD,SAASqS,GAAepZ,EAAevgC,GAEnC,QADAA,EAAUA,GAAW,IACL85C,mBAAqBjB,IAAmCtY,CAC3E,CASD,SAAS2Y,GAAiB3Y,EAAevgC,GACrC,OAAO05C,GAAY15C,GAASuO,IAAIorC,GAAepZ,EAAOvgC,GACzD,CA4CD,SAAS+4C,GAAUgB,EAAmBxZ,EAAevgC,GAC5C8wB,GAAUyP,IAAWA,EAAMzoC,QAOhC4hD,GAFA15C,EAAUA,GAAW,IAEAsM,IACjBqtC,GAAepZ,EAAOvgC,GACtB+5C,EAAW,EAAI,EACfhpB,GAAU/wB,EAAQg6C,kBAAoBh6C,EAAQg6C,iBAAmB,KACjEh6C,EAAQ45C,qBACR55C,EAAQi6C,cAGRj6C,EAAQuK,SAAWwvC,GAEnB/5C,EAAQuK,QAAQvK,EAAQk6C,kBAAoB,UAAWl6C,EAAQm6C,mBAAqB,GAAI,CACpFC,gBAAgB,KAjBpBv1C,QAAQ1L,MAAM,SAAW4gD,EAAW,QAAU,UAAY,gCAoBjE,CClND,IAAaM,GAAb,WAOI,SAAiCA,IAAA,IAArBC,yDAAe,IAAM/f,EAAAniC,KAAAiiD,GAC7BjiD,KAAKmiD,WAAY,EACjBniD,KAAKoiD,aAAe,GACpBpiD,KAAKqiD,mBAAqB,EAC1BriD,KAAKsiD,aAAUz5C,EACf7I,KAAKuiD,cAAgBL,CACxB,CAbL,OAAAnY,EAAAkY,EAAA,CAAA,CAAAtuC,IAAA,kBAAApT,MAeI,SAAgBiiD,GACZxiD,KAAKuiD,cAAgBC,EAEjBxiD,KAAKmiD,WACLniD,KAAKyiD,MAnBjB,GAAA,CAAA9uC,IAAA,OAAApT,MA4BI,WAEC,GA9BL,CAAAoT,IAAA,SAAApT,MAgCI,WAEC,GAlCL,CAAAoT,IAAA,UAAApT,MAoCI,WACI,OAAO,IAAI6S,MAAOozB,SACrB,KAtCLyb,CAAA,CAAA,GCIaS,GAAb,SAAAC,GAAAC,EAAAF,EAAAC,GAAA,IAAAE,EAAAC,EAAAJ,GAGI,SAAAA,EAAYK,GAAuG,IAAA5uC,EAArB+tC,yDAAe,IAAM,OAAA/f,EAAAniC,KAAA0iD,IAC/GvuC,EAAA0uC,EAAA/iD,KAAAE,KAAMkiD,IACDa,kBAAoBA,EAFsF5uC,CAGlH,CANL,OAAA41B,EAAA2Y,EAAA,CAAA,CAAA/uC,IAAA,UAAApT,MAQI,SAAQ4D,EAAaoH,EAAkB3D,GACnC5H,KAAKoiD,aAAathD,KAAK,CAAEqD,IAAAA,EAAKoH,KAAAA,EAAM3D,QAAAA,IAE/B5H,KAAKmiD,YACNniD,KAAKmiD,WAAY,EACjBniD,KAAKyiD,OAEZ,GAfL,CAAA9uC,IAAA,OAAApT,MAiBI,WAAa,IAAA8lC,EAAArmC,KACT4R,aAAa5R,KAAKsiD,SAClBtiD,KAAKsiD,QAAU5wC,YAAW,WACtB,GAAI20B,EAAK+b,aAAa1iD,OAAS,EAAG,CAC9B,IAAMsjD,EAAW3c,EAAK4c,cADQ/D,EAAA,SAEnBvrC,GACP,IAA+BqvC,EAAAA,EAASrvC,GAAhCxP,IAAAA,IAAKoH,IAAAA,KAAM3D,IAAAA,QACnBowB,GAAMzsB,GAAM,SAAC23C,EAAGC,GACZ53C,EAAK43C,GAAL,OAA0B93C,KAAKi3B,IAAI/2B,EAAK43C,GAAL,UAA6B9c,EAAKG,kBAC9Dj7B,EAAK43C,GAAL,SACV,IACD9c,EAAK0c,kBAAkB5+C,EAAKoH,EAAM3D,EARR,EAE9B,IAAK,IAAM+L,KAAOqvC,EAAU9D,EAAjBvrC,GAQX0yB,EAAK+b,aAAa1iD,OAAS,EAC3B2mC,EAAKgc,mBAAqB,CAC7B,MACGhc,EAAKgc,qBAWLhc,EAAKgc,mBAAqB,IAC1Bhc,EAAK8b,WAAY,EACjB9b,EAAKgc,mBAAqB,GAE1Bhc,EAAK8b,WACL9b,EAAKoc,SAEVziD,KAAKuiD,cACX,GApDL,CAAA5uC,IAAA,SAAApT,MAsDI,WAAe,IAAAunC,EAAA9nC,KACX4R,aAAa5R,KAAKsiD,SAClB,IAAMU,EAAWhjD,KAAKoiD,aAAa1iD,OAAS,EAAIM,KAAKijD,cAAgB,GACrEjjD,KAAKoiD,aAAa1iD,OAAS,EAC3B,IAAM0jD,EAAgBjkD,OAAOmqB,OAAO05B,GAI7BI,GAAAA,OAAAA,EAAAA,EAAcppC,QAAO,SAACrZ,GAAD,OAA+B,IAAxBA,EAAEwD,IAAII,QAAQ,KAA1C,KACA6+C,EAAAA,EAAcppC,QAAO,SAACrZ,GAAD,OAA+B,IAAxBA,EAAEwD,IAAII,QAAQ,KAA1C,MAEQxB,KAAI,SAA4Bu6C,GAAA,IAAzBn5C,IAAAA,IAAKoH,IAAAA,KAAM3D,IAAAA,QAC7BkgC,EAAKib,kBAAkB5+C,EAAKoH,SAAW3D,GAAvC,GAAA,CAAgDkyC,UAAW,kBAElE,GApEL,CAAAnmC,IAAA,cAAApT,MAsEI,WACI,IAAMyiD,EAA8C,CAAA,EAoBpD,OAnBAhrB,GAAMh4B,KAAKoiD,cAAc,SAACiB,GACtB,IAAQl/C,EAAuBk/C,EAAvBl/C,IAAKoH,EAAkB83C,EAAlB93C,KAAM3D,EAAYy7C,EAAZz7C,QACb+L,GAAO/L,EAAUA,EAAQoyC,UAAY,OAAS71C,OAC9B0E,IAAlBm6C,EAASrvC,KACTqvC,EAASrvC,GAAO,CAAEpI,KAAM,GAAIpH,IAAAA,EAAKyD,QAAAA,IAKjCA,GACAo7C,EAASrvC,GAAK/L,SACdo7C,EAASrvC,GAAK/L,QAAQqyC,WACpB+I,EAASrvC,GAAK/L,QAAQqyC,SAAvB,sBAEC+I,EAASrvC,GAAK/L,QAAQqyC,SAAvB,oBACGryC,EAAQqyC,SAAR,qBAER+I,EAASrvC,GAAKpI,KAAKzK,KAAKyK,EAC3B,IACMy3C,CACV,KA5FLN,CAAA,CAAA,CAAkCT,ICgB9BqB,GAAKl9B,WAAYm9B,GAAMt6B,YAAau6B,GAAMp4C,YAE1Cq4C,GAAO,IAAIH,GAAG,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAgB,EAAG,EAAoB,IAG1II,GAAO,IAAIJ,GAAG,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAiB,EAAG,IAEjIK,GAAO,IAAIL,GAAG,CAAC,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KAE7EM,GAAO,SAAUC,EAAIrpB,GAErB,IADA,IAAI5T,EAAI,IAAI28B,GAAI,IACPhkD,EAAI,EAAGA,EAAI,KAAMA,EACtBqnB,EAAErnB,GAAKi7B,GAAS,GAAKqpB,EAAGtkD,EAAI,GAGhC,IAAIoB,EAAI,IAAI6iD,GAAI58B,EAAE,KAClB,IAASrnB,EAAI,EAAGA,EAAI,KAAMA,EACtB,IAAK,IAAIukD,EAAIl9B,EAAErnB,GAAIukD,EAAIl9B,EAAErnB,EAAI,KAAMukD,EAC/BnjD,EAAEmjD,GAAOA,EAAIl9B,EAAErnB,IAAO,EAAKA,EAGnC,MAAO,CAACqnB,EAAGjmB,EACd,EACGc,GAAKmiD,GAAKH,GAAM,GAAIM,GAAKtiD,GAAG,GAAIuiD,GAAQviD,GAAG,GAE/CsiD,GAAG,IAAM,IAAKC,GAAM,KAAO,GAI3B,IAHI77C,IAAgC87C,GAA3BL,GAAKF,GAAM,GAA2B,GAE3CQ,GAAM,IAAIX,GAAI,OACThkD,GAAI,EAAGA,GAAI,QAASA,GAAG,CAE5B,IAAIuL,IAAU,MAAJvL,MAAgB,GAAW,MAAJA,KAAe,EAEhDuL,IAAU,OADVA,IAAU,MAAJA,MAAgB,GAAW,MAAJA,KAAe,MACtB,GAAW,KAAJA,KAAe,EAC5Co5C,GAAI3kD,MAAY,MAAJuL,MAAgB,GAAW,IAAJA,KAAe,KAAQ,CAC7D,CAID,IAAIq5C,GAAQ,SAAUC,EAAIC,EAAI1jD,GAO1B,IANA,IAAIrB,EAAI8kD,EAAG1kD,OAEPH,EAAI,EAEJ6B,EAAI,IAAImiD,GAAIc,GAET9kD,EAAID,IAAKC,IACV6B,EAAEgjD,EAAG7kD,GAAK,GAEhB,IAII+kD,EAJAC,EAAK,IAAIhB,GAAIc,GACjB,IAAK9kD,EAAI,EAAGA,EAAI8kD,IAAM9kD,EAClBglD,EAAGhlD,GAAMglD,EAAGhlD,EAAI,GAAK6B,EAAE7B,EAAI,IAAO,EAGtC,GAAIoB,EAAG,CAEH2jD,EAAK,IAAIf,GAAI,GAAKc,GAElB,IAAIG,EAAM,GAAKH,EACf,IAAK9kD,EAAI,EAAGA,EAAID,IAAKC,EAEjB,GAAI6kD,EAAG7kD,GAQH,IANA,IAAIklD,EAAMllD,GAAK,EAAK6kD,EAAG7kD,GAEnBmlD,EAAML,EAAKD,EAAG7kD,GAEdkgB,EAAI8kC,EAAGH,EAAG7kD,GAAK,MAAQmlD,EAElBrkD,EAAIof,GAAM,GAAKilC,GAAO,EAAIjlC,GAAKpf,IAAKof,EAEzC6kC,EAAGJ,GAAIzkC,KAAO+kC,GAAOC,CAIpC,MAGG,IADAH,EAAK,IAAIf,GAAIjkD,GACRC,EAAI,EAAGA,EAAID,IAAKC,EACjB+kD,EAAG/kD,GAAK2kD,GAAIK,EAAGH,EAAG7kD,GAAK,QAAW,GAAK6kD,EAAG7kD,GAElD,OAAO+kD,CACV,EAEGK,GAAM,IAAIrB,GAAG,KACjB,IAAS/jD,GAAI,EAAGA,GAAI,MAAOA,GACvBolD,GAAIplD,IAAK,EACb,IAASA,GAAI,IAAKA,GAAI,MAAOA,GACzBolD,GAAIplD,IAAK,EACb,IAASA,GAAI,IAAKA,GAAI,MAAOA,GACzBolD,GAAIplD,IAAK,EACb,IAASA,GAAI,IAAKA,GAAI,MAAOA,GACzBolD,GAAIplD,IAAK,EAEb,IAAIqlD,GAAM,IAAItB,GAAG,IACjB,IAAS/jD,GAAI,EAAGA,GAAI,KAAMA,GACtBqlD,GAAIrlD,IAAK,EAETslD,IC0CQC,GD1CRD,GAAoBV,GAAKQ,GAAK,EAAG,GAEjCI,GAAoBZ,GAAKS,GAAK,EAAG,GAqBjCI,GAAO,SAAUrlD,GAAK,OAASA,EAAI,GAAM,IAAU,EAAJA,GAAS,EAAK,EAG7DslD,GAAM,SAAUxlC,EAAGngB,EAAGsB,IACb,MAALtB,GAAaA,EAAI,KACjBA,EAAI,IACC,MAALsB,GAAaA,EAAI6e,EAAE/f,UACnBkB,EAAI6e,EAAE/f,QAEV,IAAIF,EAAI,IAAKigB,aAAa8jC,GAAMA,GAAM9jC,aAAa+jC,GAAMA,GAAMF,IAAI1iD,EAAItB,GAEvE,OADAE,EAAE0U,IAAIuL,EAAEylC,SAAS5lD,EAAGsB,IACbpB,CACV,EA4KG2lD,GAAQ,SAAUvxC,EAAGjU,EAAG8f,GACxBA,IAAU,EAAJ9f,EACN,IAAIO,EAAKP,EAAI,GAAM,EACnBiU,EAAE1T,IAAMuf,EACR7L,EAAE1T,EAAI,IAAMuf,IAAM,CACrB,EAEG2lC,GAAU,SAAUxxC,EAAGjU,EAAG8f,GAC1BA,IAAU,EAAJ9f,EACN,IAAIO,EAAKP,EAAI,GAAM,EACnBiU,EAAE1T,IAAMuf,EACR7L,EAAE1T,EAAI,IAAMuf,IAAM,EAClB7L,EAAE1T,EAAI,IAAMuf,IAAM,EACrB,EAEG4lC,GAAQ,SAAUzxC,EAAGywC,GAGrB,IADA,IAAIhlD,EAAI,GACCE,EAAI,EAAGA,EAAIqU,EAAElU,SAAUH,EACxBqU,EAAErU,IACFF,EAAEyB,KAAK,CAAExB,EAAGC,EAAG+4B,EAAG1kB,EAAErU,KAE5B,IAAID,EAAID,EAAEK,OACN4lD,EAAKjmD,EAAEiC,QACX,IAAKhC,EACD,MAAO,CAAC,IAAIgkD,GAAG,GAAI,GACvB,GAAS,GAALhkD,EAAQ,CACR,IAAImgB,EAAI,IAAI6jC,GAAGjkD,EAAE,GAAGC,EAAI,GAExB,OADAmgB,EAAEpgB,EAAE,GAAGC,GAAK,EACL,CAACmgB,EAAG,EACd,CACDpgB,EAAEkmD,MAAK,SAAU5/C,EAAGihB,GAAK,OAAOjhB,EAAE2yB,EAAI1R,EAAE0R,CAAI,IAG5Cj5B,EAAEyB,KAAK,CAAExB,GAAI,EAAGg5B,EAAG,QACnB,IAAIl3B,EAAI/B,EAAE,GAAIsB,EAAItB,EAAE,GAAImmD,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAO7C,IANArmD,EAAE,GAAK,CAAEC,GAAI,EAAGg5B,EAAGl3B,EAAEk3B,EAAI33B,EAAE23B,EAAGl3B,EAAGA,EAAGT,EAAGA,GAMhC8kD,GAAMnmD,EAAI,GACb8B,EAAI/B,EAAEA,EAAEmmD,GAAIltB,EAAIj5B,EAAEqmD,GAAIptB,EAAIktB,IAAOE,KACjC/kD,EAAItB,EAAEmmD,GAAMC,GAAMpmD,EAAEmmD,GAAIltB,EAAIj5B,EAAEqmD,GAAIptB,EAAIktB,IAAOE,KAC7CrmD,EAAEomD,KAAQ,CAAEnmD,GAAI,EAAGg5B,EAAGl3B,EAAEk3B,EAAI33B,EAAE23B,EAAGl3B,EAAGA,EAAGT,EAAGA,GAE9C,IAAIglD,EAASL,EAAG,GAAGhmD,EACnB,IAASC,EAAI,EAAGA,EAAID,IAAKC,EACjB+lD,EAAG/lD,GAAGD,EAAIqmD,IACVA,EAASL,EAAG/lD,GAAGD,GAGvB,IAAIsmD,EAAK,IAAIrC,GAAIoC,EAAS,GAEtBE,EAAMC,GAAGzmD,EAAEomD,EAAK,GAAIG,EAAI,GAC5B,GAAIC,EAAMxB,EAAI,CAIN9kD,EAAI,EAAR,IAAWwmD,EAAK,EAEZC,EAAMH,EAAMxB,EAAI4B,EAAM,GAAKD,EAE/B,IADAV,EAAGC,MAAK,SAAU5/C,EAAGihB,GAAK,OAAOg/B,EAAGh/B,EAAEtnB,GAAKsmD,EAAGjgD,EAAErG,IAAMqG,EAAE2yB,EAAI1R,EAAE0R,KACvD/4B,EAAID,IAAKC,EAAG,CACf,IAAI2mD,EAAOZ,EAAG/lD,GAAGD,EACjB,KAAIsmD,EAAGM,GAAQ7B,GAKX,MAJA0B,GAAME,GAAO,GAAMJ,EAAMD,EAAGM,IAC5BN,EAAGM,GAAQ7B,CAIlB,CAED,IADA0B,KAAQC,EACDD,EAAK,GAAG,CACX,IAAII,EAAOb,EAAG/lD,GAAGD,EACbsmD,EAAGO,GAAQ9B,EACX0B,GAAM,GAAM1B,EAAKuB,EAAGO,KAAU,IAE5B5mD,CACT,CACD,KAAOA,GAAK,GAAKwmD,IAAMxmD,EAAG,CACtB,IAAI6mD,EAAOd,EAAG/lD,GAAGD,EACbsmD,EAAGQ,IAAS/B,MACVuB,EAAGQ,KACHL,EAET,CACDF,EAAMxB,CACT,CACD,MAAO,CAAC,IAAIf,GAAGsC,GAAKC,EACvB,EAEGC,GAAK,SAALA,EAAetmD,EAAG4B,EAAGwS,GACrB,OAAe,GAARpU,EAAEF,EACH+L,KAAKspC,IAAImR,EAAGtmD,EAAE4B,EAAGA,EAAGwS,EAAI,GAAIkyC,EAAGtmD,EAAEmB,EAAGS,EAAGwS,EAAI,IAC1CxS,EAAE5B,EAAEF,GAAKsU,CACnB,EAEGyyC,GAAK,SAAU1/C,GAGf,IAFA,IAAIrH,EAAIqH,EAAEjH,OAEHJ,IAAMqH,IAAIrH,KAMjB,IAJA,IAAIgnD,EAAK,IAAI/C,KAAMjkD,GAEfinD,EAAM,EAAGC,EAAM7/C,EAAE,GAAI8/C,EAAM,EAC3BC,EAAI,SAAUjnC,GAAK6mC,EAAGC,KAAS9mC,GAC1BlgB,EAAI,EAAGA,GAAKD,IAAKC,EACtB,GAAIoH,EAAEpH,IAAMinD,GAAOjnD,GAAKD,IAClBmnD,MACD,CACD,IAAKD,GAAOC,EAAM,EAAG,CACjB,KAAOA,EAAM,IAAKA,GAAO,IACrBC,EAAE,OACFD,EAAM,IACNC,EAAED,EAAM,GAAOA,EAAM,IAAO,EAAK,MAAUA,EAAM,GAAM,EAAK,OAC5DA,EAAM,EAEb,MACI,GAAIA,EAAM,EAAG,CAEd,IADAC,EAAEF,KAAQC,EACHA,EAAM,EAAGA,GAAO,EACnBC,EAAE,MACFD,EAAM,IACNC,EAAID,EAAM,GAAM,EAAK,MAAOA,EAAM,EACzC,CACD,KAAOA,KACHC,EAAEF,GACNC,EAAM,EACND,EAAM7/C,EAAEpH,EACX,CAEL,MAAO,CAAC+mD,EAAGpB,SAAS,EAAGqB,GAAMjnD,EAChC,EAEGqnD,GAAO,SAAUC,EAAIN,GAErB,IADA,IAAIllD,EAAI,EACC7B,EAAI,EAAGA,EAAI+mD,EAAG5mD,SAAUH,EAC7B6B,GAAKwlD,EAAGrnD,GAAK+mD,EAAG/mD,GACpB,OAAO6B,CACV,EAGGylD,GAAQ,SAAUC,EAAK7gD,EAAK8gD,GAE5B,IAAIznD,EAAIynD,EAAIrnD,OACRQ,EAAI8kD,GAAK/+C,EAAM,GACnB6gD,EAAI5mD,GAAS,IAAJZ,EACTwnD,EAAI5mD,EAAI,GAAKZ,IAAM,EACnBwnD,EAAI5mD,EAAI,GAAc,IAAT4mD,EAAI5mD,GACjB4mD,EAAI5mD,EAAI,GAAkB,IAAb4mD,EAAI5mD,EAAI,GACrB,IAAK,IAAIX,EAAI,EAAGA,EAAID,IAAKC,EACrBunD,EAAI5mD,EAAIX,EAAI,GAAKwnD,EAAIxnD,GACzB,OAAqB,GAAbW,EAAI,EAAIZ,EACnB,EAEG0nD,GAAO,SAAUD,EAAKD,EAAKG,EAAOC,EAAMC,EAAIC,EAAIvD,EAAIwD,EAAIC,EAAIC,EAAI5nD,GAChEwlD,GAAM2B,EAAKnnD,IAAKsnD,KACdE,EAAG,KAML,IALA,IAAI1lD,EAAK4jD,GAAM8B,EAAI,IAAKK,EAAM/lD,EAAG,GAAIgmD,EAAMhmD,EAAG,GAC1C0G,EAAKk9C,GAAM+B,EAAI,IAAKM,EAAMv/C,EAAG,GAAIw/C,EAAMx/C,EAAG,GAC1CE,EAAKg+C,GAAGmB,GAAMI,EAAOv/C,EAAG,GAAIw/C,EAAMx/C,EAAG,GACrCwB,EAAKw8C,GAAGqB,GAAMI,EAAOj+C,EAAG,GAAIk+C,EAAMl+C,EAAG,GACrCm+C,EAAS,IAAIzE,GAAI,IACZhkD,EAAI,EAAGA,EAAIqoD,EAAKloD,SAAUH,EAC/ByoD,EAAiB,GAAVJ,EAAKroD,MAChB,IAASA,EAAI,EAAGA,EAAIuoD,EAAKpoD,SAAUH,EAC/ByoD,EAAiB,GAAVF,EAAKvoD,MAGhB,IAFA,IAAIwK,EAAKs7C,GAAM2C,EAAQ,GAAIC,EAAMl+C,EAAG,GAAIm+C,EAAOn+C,EAAG,GAC9Co+C,EAAO,GACJA,EAAO,IAAMF,EAAItE,GAAKwE,EAAO,MAAOA,GAE3C,IAKIC,EAAIC,EAAIC,EAAIC,EALZC,EAAQjB,EAAK,GAAM,EACnBkB,EAAQ9B,GAAKQ,EAAIxC,IAAOgC,GAAKS,EAAIxC,IAAOf,EACxC6E,EAAQ/B,GAAKQ,EAAIK,GAAOb,GAAKS,EAAIM,GAAO7D,EAAK,GAAK,EAAIsE,EAAOxB,GAAKqB,EAAQC,IAAQ,EAAID,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,KACnI,GAAIQ,GAAQC,GAASD,GAAQE,EACzB,OAAO7B,GAAMC,EAAKnnD,EAAGonD,EAAI7B,SAASoC,EAAIA,EAAKC,IAG/C,GADApC,GAAM2B,EAAKnnD,EAAG,GAAK+oD,EAAQD,IAAS9oD,GAAK,EACrC+oD,EAAQD,EAAO,CACfL,EAAKjE,GAAKqD,EAAKC,EAAK,GAAIY,EAAKb,EAAKc,EAAKnE,GAAKuD,EAAKC,EAAK,GAAIY,EAAKb,EAC/D,IAAIiB,EAAMxE,GAAK8D,EAAKC,EAAM,GAC1B/C,GAAM2B,EAAKnnD,EAAGkoD,EAAM,KACpB1C,GAAM2B,EAAKnnD,EAAI,EAAGooD,EAAM,GACxB5C,GAAM2B,EAAKnnD,EAAI,GAAIwoD,EAAO,GAC1BxoD,GAAK,GACL,IAASJ,EAAI,EAAGA,EAAI4oD,IAAQ5oD,EACxB4lD,GAAM2B,EAAKnnD,EAAI,EAAIJ,EAAG0oD,EAAItE,GAAKpkD,KACnCI,GAAK,EAAIwoD,EAET,IADA,IAAIS,EAAO,CAAChB,EAAME,GACTpuB,EAAK,EAAGA,EAAK,IAAKA,EACvB,KAAImvB,EAAOD,EAAKlvB,GAChB,IAASn6B,EAAI,EAAGA,EAAIspD,EAAKnpD,SAAUH,EAAG,CAClC,IAAI0oB,EAAgB,GAAV4gC,EAAKtpD,GACf4lD,GAAM2B,EAAKnnD,EAAGgpD,EAAI1gC,IAAOtoB,GAAKsoD,EAAIhgC,GAC9BA,EAAM,KACNk9B,GAAM2B,EAAKnnD,EAAIkpD,EAAKtpD,KAAO,EAAK,KAAMI,GAAKkpD,EAAKtpD,KAAO,GAC9D,CAND,CAQP,MAEG6oD,EAAKvD,GAAKwD,EAAK1D,GAAK2D,EAAKvD,GAAKwD,EAAK3D,GAEvC,IAASrlD,EAAI,EAAGA,EAAI8nD,IAAM9nD,EACtB,GAAI2nD,EAAK3nD,GAAK,IAAK,CACX0oB,EAAOi/B,EAAK3nD,KAAO,GAAM,GAC7B6lD,GAAQ0B,EAAKnnD,EAAGyoD,EAAGngC,EAAM,MAAOtoB,GAAK0oD,EAAGpgC,EAAM,KAC1CA,EAAM,IACNk9B,GAAM2B,EAAKnnD,EAAIunD,EAAK3nD,KAAO,GAAM,IAAKI,GAAK8jD,GAAKx7B,IACpD,IAAI6gC,EAAgB,GAAV5B,EAAK3nD,GACf6lD,GAAQ0B,EAAKnnD,EAAG2oD,EAAGQ,IAAOnpD,GAAK4oD,EAAGO,GAC9BA,EAAM,IACN1D,GAAQ0B,EAAKnnD,EAAIunD,EAAK3nD,KAAO,EAAK,MAAOI,GAAK+jD,GAAKoF,GAC1D,MAEG1D,GAAQ0B,EAAKnnD,EAAGyoD,EAAGlB,EAAK3nD,KAAMI,GAAK0oD,EAAGnB,EAAK3nD,IAInD,OADA6lD,GAAQ0B,EAAKnnD,EAAGyoD,EAAG,MACZzoD,EAAI0oD,EAAG,IACjB,EAEGU,GAAoB,IAAIvF,GAAI,CAAC,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QAAS,UAE/FwF,GAAmB,IAAI1F,GAAG,GA2H1B2F,GAAsB,WAEtB,IADA,IAAI5pD,EAAI,IAAImkD,GAAI,KACPjkD,EAAI,EAAGA,EAAI,MAAOA,EAAG,CAE1B,IADA,IAAIoH,EAAIpH,EAAG25B,EAAI,IACNA,GACLvyB,GAAU,EAAJA,GAAU,YAAeA,IAAM,EACzCtH,EAAEE,GAAKoH,CACV,CACD,OAAOtH,CACV,CATyB,GAWtB6pD,GAAM,WACN,IAAIviD,EAAI,WACR,MAAO,CACHhH,EAAG,SAAUiU,GAGT,IADA,IAAIu1C,EAAKxiD,EACApH,EAAI,EAAGA,EAAIqU,EAAElU,SAAUH,EAC5B4pD,EAAKF,GAAW,IAALE,EAAYv1C,EAAErU,IAAO4pD,IAAO,EAC3CxiD,EAAIwiD,CANL,EAQHv1C,EAAG,WAAc,OAAW,WAAJjN,CAAiB,EAEhD,EAsBGyiD,GAAO,SAAUrC,EAAKsC,EAAKC,EAAKC,EAAMC,GACtC,OAvKO,SAAUzC,EAAK0C,EAAKC,EAAMJ,EAAKC,EAAMI,GAC5C,IAAIrqD,EAAIynD,EAAIrnD,OACRQ,EAAI,IAAIojD,GAAGgG,EAAMhqD,EAAI,GAAK,EAAI+L,KAAKwyC,MAAMv+C,EAAI,MAASiqD,GAEtD7C,EAAIxmD,EAAEglD,SAASoE,EAAKppD,EAAER,OAAS6pD,GAC/BtjD,EAAM,EACV,IAAKwjD,GAAOnqD,EAAI,EACZ,IAAK,IAAIC,EAAI,EAAGA,GAAKD,EAAGC,GAAK,MAAO,CAEhC,IAAIqB,EAAIrB,EAAI,MACRqB,EAAItB,EAEJ2G,EAAM4gD,GAAMH,EAAGzgD,EAAK8gD,EAAI7B,SAAS3lD,EAAGqB,KAIpC8lD,EAAEnnD,GAAKoqD,EACP1jD,EAAM4gD,GAAMH,EAAGzgD,EAAK8gD,EAAI7B,SAAS3lD,EAAGD,IAE3C,KAEA,CAeD,IAdA,IAAI+pD,EAAMN,GAAIU,EAAM,GAChBjqD,EAAI6pD,IAAQ,GAAI1iD,EAAU,KAAN0iD,EACpBO,GAAS,GAAKF,GAAQ,EAEtBG,EAAO,IAAItG,GAAI,OAAQhtC,EAAO,IAAIgtC,GAAIqG,EAAQ,GAC9CE,EAAQz+C,KAAK0+C,KAAKL,EAAO,GAAIM,EAAQ,EAAIF,EACzCG,EAAM,SAAU1qD,GAAK,OAAQwnD,EAAIxnD,GAAMwnD,EAAIxnD,EAAI,IAAMuqD,EAAU/C,EAAIxnD,EAAI,IAAMyqD,GAAUJ,CAAQ,EAG/F1C,EAAO,IAAI1D,GAAI,MAEf2D,EAAK,IAAI5D,GAAI,KAAM6D,EAAK,IAAI7D,GAAI,IAEhC2G,EAAO,EAAGrG,EAAK,EAAUwD,GAAP9nD,EAAI,EAAQ,GAAG4qD,EAAK,EAAG7C,EAAK,EAC3C/nD,EAAID,IAAKC,EAAG,CAEf,IAAI6qD,EAAKH,EAAI1qD,GAET8qD,EAAW,MAAJ9qD,EAEP+qD,EAAQ/zC,EAAK6zC,GAKjB,GAJAP,EAAKQ,GAAQC,EACb/zC,EAAK6zC,GAAMC,EAGPF,GAAM5qD,EAAG,CAET,IAAIgrD,EAAMjrD,EAAIC,EACd,IAAK2qD,EAAO,KAAQ7C,EAAK,QAAUkD,EAAM,IAAK,CAC1CtkD,EAAM+gD,GAAKD,EAAKL,EAAG,EAAGQ,EAAMC,EAAIC,EAAIvD,EAAIwD,EAAIC,EAAI/nD,EAAI+nD,EAAIrhD,GACxDohD,EAAK6C,EAAOrG,EAAK,EAAGyD,EAAK/nD,EACzB,IAAK,IAAIukD,EAAI,EAAGA,EAAI,MAAOA,EACvBqD,EAAGrD,GAAK,EACZ,IAASA,EAAI,EAAGA,EAAI,KAAMA,EACtBsD,EAAGtD,GAAK,CATP,CAYT,IAAI1iD,EAAI,EAAGwS,EAAI,EAAG42C,EAAO7jD,EAAG8jD,EAAOJ,EAAOC,EAAS,MACnD,GAAIC,EAAM,GAAKH,GAAMH,EAAI1qD,EAAIkrD,GAMzB,IALA,IAAIC,EAAOr/C,KAAKC,IAAI9L,EAAG+qD,GAAO,EAC1BI,EAAOt/C,KAAKC,IAAI,MAAO/L,GAGvBqrD,EAAKv/C,KAAKC,IAAI,IAAKi/C,GAChBE,GAAOE,KAAUH,GAAQH,GAAQC,GAAO,CAC3C,GAAIvD,EAAIxnD,EAAI6B,IAAM2lD,EAAIxnD,EAAI6B,EAAIqpD,GAAM,CAEhC,IADA,IAAII,EAAK,EACFA,EAAKD,GAAM7D,EAAIxnD,EAAIsrD,IAAO9D,EAAIxnD,EAAIsrD,EAAKJ,KAAQI,GAEtD,GAAIA,EAAKzpD,EAAG,CAGR,GAFAA,EAAIypD,EAAIj3C,EAAI62C,EAERI,EAAKH,EACL,MAIJ,IAAII,EAAMz/C,KAAKC,IAAIm/C,EAAKI,EAAK,GACzBE,EAAK,EACT,IAASjH,EAAI,EAAGA,EAAIgH,IAAOhH,EAAG,CAC1B,IAAIkH,EAAMzrD,EAAIkrD,EAAM3G,EAAI,MAAS,MAE7BM,EAAM4G,EADAnB,EAAKmB,GACM,MAAS,MAC1B5G,EAAK2G,IACLA,EAAK3G,EAAIkG,EAAQU,EACxB,CACJ,CAtBsC,CA0B3CP,IADAJ,EAAOC,IAAOA,EAAQT,EAAKQ,IACJ,MAAS,KACnC,CAGL,GAAIz2C,EAAG,CAGHszC,EAAKG,KAAQ,UAAarD,GAAM5iD,IAAM,GAAM6iD,GAAMrwC,GAClD,IAAIq3C,EAAiB,GAAXjH,GAAM5iD,GAAS8pD,EAAiB,GAAXjH,GAAMrwC,GACrCiwC,GAAMJ,GAAKwH,GAAOvH,GAAKwH,KACrB/D,EAAG,IAAM8D,KACT7D,EAAG8D,GACLf,EAAK5qD,EAAI6B,IACP8oD,CACL,MAEGhD,EAAKG,KAAQN,EAAIxnD,KACf4nD,EAAGJ,EAAIxnD,GAEhB,CACJ,CACD0G,EAAM+gD,GAAKD,EAAKL,EAAGiD,EAAKzC,EAAMC,EAAIC,EAAIvD,EAAIwD,EAAIC,EAAI/nD,EAAI+nD,EAAIrhD,GAErD0jD,IACD1jD,EAAM4gD,GAAMH,EAAGzgD,EAAK+iD,IAC3B,CACD,OAAO/D,GAAI/kD,EAAG,EAAGopD,EAAMtE,GAAK/+C,GAAOsjD,EACtC,CAgDU4B,CAAKpE,EAAkB,MAAbsC,EAAIr0B,MAAgB,EAAIq0B,EAAIr0B,MAAkB,MAAXq0B,EAAI+B,IAAc//C,KAAK0+C,KAAuD,IAAlD1+C,KAAKspC,IAAI,EAAGtpC,KAAKC,IAAI,GAAID,KAAK4rB,IAAI8vB,EAAIrnD,WAAoB,GAAK2pD,EAAI+B,IAAM9B,EAAKC,GAAOC,EACxK,EA8HG6B,GAAS,SAAUz3C,EAAGgT,EAAGnH,GACzB,KAAOA,IAAKmH,EACRhT,EAAEgT,GAAKnH,EAAGA,KAAO,CACxB,EAEG6rC,GAAM,SAAU3kD,EAAGzG,GACnB,IAAI+R,EAAK/R,EAAEqrD,SAIX,GAHA5kD,EAAE,GAAK,GAAIA,EAAE,GAAK,IAAKA,EAAE,GAAK,EAAGA,EAAE,GAAKzG,EAAE80B,MAAQ,EAAI,EAAe,GAAX90B,EAAE80B,MAAa,EAAI,EAAGruB,EAAE,GAAK,EACxE,GAAXzG,EAAEsrD,OACFH,GAAO1kD,EAAG,EAAG0E,KAAKwyC,MAAM,IAAIzqC,KAAKlT,EAAEsrD,OAASp4C,KAAKD,OAAS,MAC1DlB,EAAI,CACJtL,EAAE,GAAK,EACP,IAAK,IAAIpH,EAAI,EAAGA,GAAK0S,EAAGvS,SAAUH,EAC9BoH,EAAEpH,EAAI,IAAM0S,EAAG4V,WAAWtoB,EACjC,CACJ,EAoBGksD,GAAO,SAAUvrD,GAAK,OAAO,IAAOA,EAAEqrD,UAAarrD,EAAEqrD,SAAS7rD,OAAS,GAAO,EAAK,EAsOhF,SAASgsD,GAASngD,EAAMogD,QACd,IAATA,IAAmBA,EAAO,CAAA,GAC9B,IAAIhlD,EAAIuiD,KAAO9nD,EAAImK,EAAK7L,OACxBiH,EAAEhH,EAAE4L,GACJ,IAAIqI,EAAIw1C,GAAK79C,EAAMogD,EAAMF,GAAKE,GAAO,GAAIrsD,EAAIsU,EAAElU,OAC/C,OAAO4rD,GAAI13C,EAAG+3C,GAAON,GAAOz3C,EAAGtU,EAAI,EAAGqH,EAAEiN,KAAMy3C,GAAOz3C,EAAGtU,EAAI,EAAG8B,GAAIwS,CACtE,CA2VM,SAASg4C,GAAQp3B,EAAKq3B,GACzB,IAAIzqD,EAAIozB,EAAI90B,OACZ,IAAKmsD,GAAgC,oBAAfC,YAClB,OAAO,IAAIA,aAAchkC,OAAO0M,GAIpC,IAHA,IAAI3zB,EAAK,IAAIyiD,GAAG9uB,EAAI90B,QAAU80B,EAAI90B,SAAW,IACzCqsD,EAAK,EACLrF,EAAI,SAAUjnC,GAAK5e,EAAGkrD,KAAQtsC,GACzBlgB,EAAI,EAAGA,EAAI6B,IAAK7B,EAAG,CACxB,GAAIwsD,EAAK,EAAIlrD,EAAGnB,OAAQ,CACpB,IAAIF,EAAI,IAAI8jD,GAAGyI,EAAK,GAAM3qD,EAAI7B,GAAM,IACpCC,EAAE0U,IAAIrT,GACNA,EAAKrB,CACR,CACD,IAAImH,EAAI6tB,EAAI3M,WAAWtoB,GACnBoH,EAAI,KAAOklD,EACXnF,EAAE//C,GACGA,EAAI,MACT+/C,EAAE,IAAO//C,IAAM,GAAK+/C,EAAE,IAAW,GAAJ//C,IACxBA,EAAI,OAASA,EAAI,OAElB+/C,EAAE,KADN//C,EAAI,OAAa,QAAJA,GAAyC,KAAtB6tB,EAAI3M,aAAatoB,MAC9B,IAAMmnD,EAAE,IAAQ//C,IAAM,GAAM,IAAM+/C,EAAE,IAAQ//C,IAAM,EAAK,IAAM+/C,EAAE,IAAW,GAAJ//C,KAEzF+/C,EAAE,IAAO//C,IAAM,IAAM+/C,EAAE,IAAQ//C,IAAM,EAAK,IAAM+/C,EAAE,IAAW,GAAJ//C,GAChE,CACD,OAAOs+C,GAAIpkD,EAAI,EAAGkrD,EACrB,WCjzCWjH,GAAAA,mBAAAA,iBAAAA,EAAAA,KAAAA,QC5JL,IAAMkH,GAAiB,SAC1B7nD,EACA8nD,EACAC,GAEA,IAAM14C,EAAOy4C,GAAgB,GAC7Bz4C,EAAI,GAAS04C,EAAgB,GAAS,EAAI,EAC1C14C,EAAI,GAAQ,IAAIJ,MAAOozB,UAAU5U,WACjCpe,EAAI,IAAU6iB,GAAOE,YAErB,IAAM41B,EAAShoD,EAAIK,MAAM,KACzB,GAAI2nD,EAAOzsD,OAAS,EAAG,CACnB,IADmBupC,EAAAE,EAAAC,EACJ+iB,EAAO,GAAG3nD,MAAM,MADZ,IAEnB,IAAwB2kC,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IACdmT,EADcs1B,EAAA1oC,MACNiE,MAAM,KAAK,GACrBgP,EAAKG,WACEH,EAAKG,EAEnB,CAPkB,CAAA,MAAAnH,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAQtB,CAED,IAAM8zB,EAAejoD,EAAII,QAAQ,MAAQ,EAAI,IAAM,IACnD,OAAOJ,EAAMioD,EnBsfc,SAAUC,GAA4D,IAC7FC,EACAC,EAFgEC,yDAAgB,IAG9EC,EAAoB,GAQ1B,OANAz0B,GAAMq0B,GAAU,SAAU1yB,EAAKhmB,GAC3B24C,EAAUnc,mBAAmBxW,EAAI/H,YACjC26B,EAAUpc,mBAAmBx8B,GAC7B84C,EAAQA,EAAQ/sD,QAAU6sD,EAAU,IAAMD,CAC7C,IAEMG,EAAQxpD,KAAKupD,EACvB,CmBlgB+BE,CAAgBl5C,EAC/C,EAEYm5C,GAAiB,SAAjBA,EAAkBphD,EAA6B3D,GACxD,GAAIA,EAAQglD,MAAQrhD,EAAKC,OACrB,OAAO,IAAIqhD,KAAK,CAACthD,EAAKC,QAAS,CAAExJ,KAAM,eAG3C,GAAI4F,EAAQklD,YAAcllD,EAAQglD,KAAM,CACpC,IAAM53C,EAAO23C,EAAephD,EAAM,CAAEggC,OAAQ,SAC5C,OAAO,IAAIshB,KAAK,CAAC73C,GAAO,CAAEhT,KAAM,qCACnC,CAED,GAAuB,SAAnB4F,EAAQ2jC,OACR,OAAO,KAGX,IAAIwhB,EACkBn5C,EAYtB,OATIm5C,EAFA1rD,MAAMwzB,QAAQtpB,KADIqI,EACkBrI,EADoD,wBAAtCpM,OAAOS,UAAUgyB,SAAS9xB,KAAK8T,IAGrE,QAAUu8B,mBAAmB5kC,GAE7B,QAAU4kC,mBAAmB5kC,EAAKA,MAG9C,gBAAiBA,GAAQA,EAAKwzC,cAC9BgO,GAAa,gBAAkBxhD,EAAKwzC,aAGjCgO,CACV,EAEYC,GAAM,SAWF1P,GAAA,IAVbn5C,IAAAA,IACAoH,IAAAA,KACA0hD,IAAAA,QACArlD,IAAAA,QACA+e,IAAAA,SACAumC,IAAAA,sBACAC,IAAAA,WACAC,IAAAA,WAGaC,EAAA/P,EAFbtqC,QAAAA,aAAU,IAEGq6C,EADbC,IAAAA,cAEMC,EAAM,IAAIC,eAChBD,EAAIE,KAAK7lD,EAAQ2jC,QAAU,MAAOpnC,GAAK,GAEvC,IAAM6Q,EAAO23C,GAAephD,EAAM3D,GAElCowB,GAAMi1B,GAAS,SAAUS,EAAaC,GAClCJ,EAAIK,iBAAiBD,EAAYD,EACpC,IAEsB,SAAnB9lD,EAAQ2jC,QAAsB3jC,EAAQglD,MACtCW,EAAIK,iBAAiB,eAAgB,qCAGzCL,EAAIv6C,QAAUA,EAGdu6C,EAAIM,iBAAkB,EACtBN,EAAIO,mBAAqB,WACrB,GAAuB,IAAnBP,EAAIl8C,WAEJ,GAAmB,MAAfk8C,EAAI5O,QACJ,GAAIh4B,EAAU,CACV,IAAIuhB,EACJ,IACIA,EAAWhiB,KAAK+L,MAAMs7B,EAAIQ,aAD9B,CAEE,MAAOntD,GAEL,YADAs0B,GAAOn0B,MAAMH,EAEhB,CACD+lB,EAASuhB,EACZ,MAEyB,mBAAfklB,GACPA,EAAWG,GAIX,CAAC,IAAK,IAAK,IAAK,KAAKhpD,QAAQgpD,EAAI5O,QAAU,GAC3CwO,EAAWa,QAAQ,CACf7pD,IAAAA,EACAoH,KAAAA,EACA3D,QAAAA,EACAqlD,QAAAA,EACAC,uBAAwBA,GAAyB,GAAK,EACtDvmC,SAAAA,IAIW,MAAf4mC,EAAI5O,SACJ2O,SAAAA,EAAgBC,IAGhB5mC,GACAA,EAAS,CAAEg4B,OAAQ,KAKnC4O,EAAIU,KAAKj5C,EACZ,EC5HKk5C,GAAgB,KAqBtB,IAAaC,GAAb,SAAAxL,GAAAC,EAAAuL,EAAAxL,GAAA,IAAAE,EAAAC,EAAAqL,GAOI,SAAYf,EAAAA,EAAqDgB,GAA0B,IAAAj6C,EAAA,OAAAguB,EAAAniC,KAAAmuD,IACvFh6C,EAAA0uC,EAAA/iD,KAAAE,OACKmiD,WAAY,EACjBhuC,EAAKk6C,MAAQ,GACbl6C,EAAKm6C,aAAc,EACnBn6C,EAAKi5C,WAAaA,EAClBj5C,EAAKi6C,YAAcA,EAEG,oBAAXt6C,QAA0B,WAAYA,OAAO4iB,YACpDviB,EAAKm6C,YAAcx6C,OAAO4iB,UAAU63B,OACpCz6C,OAAOrC,iBAAiB,UAAU,WAC9B0C,EAAKq6C,2BAET16C,OAAOrC,iBAAiB,WAAW,WAC/B0C,EAAKm6C,aAAc,MAd4Dn6C,CAiB1F,CAxBL,OAAA41B,EAAAokB,EAAA,CAAA,CAAAx6C,IAAA,UAAApT,MA0BI,SAAQkuD,GACJ,IAAMvB,EAAwBuB,EAAYvB,uBAAyB,EACnE,KAAIA,GAAyB,IAA7B,CAGA,IAAMwB,EAxCP,SAA4BxB,GAC/B,IAAMyB,EAAiB,IAAAtjD,KAAAujD,IAAO,EAAK1B,GAC7B2B,EAAaF,EAAiB,EAC9BG,EAAoBzjD,KAAKC,IAAI4iD,GAAeS,GAE5CI,GADiB1jD,KAAKs1B,SAAW,KACNmuB,EAAoBD,GACrD,OAAOxjD,KAAK0+C,KAAK+E,EAAoBC,EACxC,CAiC6BC,CAAmB9B,GACnC+B,EAAU,IAAI77C,KAAKA,KAAKD,MAAQu7C,GAEtC1uD,KAAKquD,MAAMvtD,KAAK,CAAEmuD,QAAAA,EAASR,YAAAA,IAC3BhiD,QAAQC,KAAR,wCAAAnL,OAAqDmtD,IAChD1uD,KAAKmiD,YACNniD,KAAKmiD,WAAY,EACjBniD,KAAKyiD,OARR,CAUJ,GAxCL,CAAA9uC,IAAA,OAAApT,MA0CI,WAAa,IAAA8lC,EAAArmC,KACTA,KAAKsiD,SAAW1wC,aAAa5R,KAAKsiD,SAClCtiD,KAAKsiD,QAAU5wC,YAAW,WAClB20B,EAAKioB,aAAejoB,EAAKgoB,MAAM3uD,OAAS,GACxC2mC,EAAK6oB,QAET7oB,EAAKoc,SACNziD,KAAKuiD,cACX,GAlDL,CAAA5uC,IAAA,QAAApT,MAoDI,WAEI,IAAM4S,EAAM,IAAIC,KAAKA,KAAKD,OACpBg8C,EAAUnvD,KAAKquD,MAAMr0C,QAAO,SAAAsjC,GAAA,SAAG2R,QAAwB97C,CAA3B,IAClC,GAAIg8C,EAAQzvD,OAAS,EAAG,CACpBM,KAAKquD,MAAQruD,KAAKquD,MAAMr0C,QAAO,SAAAo1C,GAAA,SAAGH,SAAyB97C,CAA5B,IADX,IAAA81B,EAAAE,EAAAC,EAEU+lB,GAFV,IAEpB,IAAuChmB,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IAA1BiuD,UAAAA,YACTzuD,KAAKqvD,mBAAmBZ,EAC3B,CAJmB,CAAA,MAAAjiD,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CAKvB,CACJ,GA9DL,CAAA3kB,IAAA,SAAApT,MAgEI,WACQP,KAAKsiD,UACL1wC,aAAa5R,KAAKsiD,SAClBtiD,KAAKsiD,aAAUz5C,GAHR,IAAAm2C,EAAAK,EAAAjW,EAMmBppC,KAAKquD,OANxB,IAMX,IAA0ChP,EAAA//C,MAAA0/C,EAAAK,EAAA7/C,KAAAgB,MAAA,CAAA,IAA7BiuD,UAAAA,YACDtqD,EAAuBsqD,EAAvBtqD,IAAKoH,EAAkBkjD,EAAlBljD,KAAM3D,EAAY6mD,EAAZ7mD,QAEnB,GAAI5H,KAAKouD,YAAYkB,cAAc1nD,EAAQoyC,WACnC3jB,GAAOC,OACP7pB,QAAQC,KAAK,iEAKrB,IAGIoH,OAAO4iB,UAAUo2B,WAAW3oD,EAAKwoD,GAAephD,EAADwjC,EAAAA,EAAA,CAAA,EAAYnnC,GAAZ,CAAA,EAAA,CAAqBklD,YAAY,KAHpF,CAIE,MAAOlsD,GAGDy1B,GAAOC,OACP7pB,QAAQ1L,MAAMH,EAErB,CACJ,CA3BU,CAAA,MAAA4L,GAAA6yC,EAAAz+C,EAAA4L,EAAA,CAAA,QAAA6yC,EAAA/mB,GAAA,CA4BXt4B,KAAKquD,MAAQ,EAChB,GA7FL,CAAA16C,IAAA,qBAAApT,MA+FI,SAA8GgvD,GAAA,IAAzFprD,IAAAA,IAAKoH,IAAAA,KAAM3D,IAAAA,QAASqlD,IAAAA,QAAStmC,IAAAA,SAAUumC,IAAAA,sBACpDltD,KAAKouD,YAAYkB,cAAc1nD,EAAQoyC,WACnC3jB,GAAOC,OACP7pB,QAAQC,KAAK,iEAKrBsgD,GAAI,CACA7oD,IAAAA,EACAoH,KAAMA,GAAQ,CAFd,EAGA3D,QAASA,GAAW,CAHpB,EAIAqlD,QAASA,GAAW,CAJpB,EAKAC,sBAAuBA,GAAyB,EAChDvmC,SAAAA,EACAwmC,WAAYntD,KACZotD,WAAYptD,KAAKotD,WACjBE,cAAettD,KAAKouD,YAAYoB,eAEvC,GAlHL,CAAA77C,IAAA,wBAAApT,MAoHI,WACIP,KAAKsuD,aAAc,EACnBtuD,KAAKkvD,OACR,KAvHLf,CAAA,CAAA,CAAgClM;;;;;;;;;KChB3B52C,KAAKokD,QACNpkD,KAAKokD,MAAQ,SAAUhwC,GACnB,OAAOA,EAAI,EAAIpU,KAAK0+C,KAAKtqC,GAAKpU,KAAKwyC,MAAMp+B,KAK5ChB,OAAOixC,YACRjxC,OAAOixC,UAAY,SAAUnvD,GACzB,MAAwB,iBAAVA,GAAsBovD,SAASpvD,IAAU8K,KAAKwyC,MAAMt9C,KAAWA,IAIrF,IAAMqvD,GAAS,mBAGFC,GAAb,WAEI,SAAAA,EAAqB7nC,GACjB,GAD8Cma,EAAAniC,KAAA6vD,GAAA7vD,KAA7BgoB,MAAAA,EACI,KAAjBA,EAAMtoB,OACN,MAAM,IAAIe,UAAU,qBAE3B,CANL,OAAAspC,EAAA8lB,EAAA,CAAA,CAAAl8C,IAAA,WAAApT,MAuDI,WAEI,IADA,IAAI2B,EAAO,GACF3C,EAAI,EAAGA,EAAIS,KAAKgoB,MAAMtoB,OAAQH,IACnC2C,EAAOA,EAAO0tD,GAAOhpD,OAAO5G,KAAKgoB,MAAMzoB,KAAO,GAAKqwD,GAAOhpD,OAAuB,GAAhB5G,KAAKgoB,MAAMzoB,IAClE,IAANA,GAAiB,IAANA,GAAiB,IAANA,GAAiB,IAANA,IACjC2C,GAAQ,KAIhB,GAAoB,KAAhBA,EAAKxC,OAGL,MAAM,IAAI+W,MAAM,gCAEpB,OAAOvU,CACV,GAtEL,CAAAyR,IAAA,QAAApT,MAyEI,WACI,OAAO,IAAIsvD,EAAK7vD,KAAKgoB,MAAM1mB,MAAM,GACpC,GA3EL,CAAAqS,IAAA,SAAApT,MA8EI,SAAOuvD,GACH,OAAiC,IAA1B9vD,KAAK+vD,UAAUD,EACzB,GAhFL,CAAAn8C,IAAA,YAAApT,MAsFI,SAAUuvD,GACN,IAAK,IAAIvwD,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,IAAMywD,EAAOhwD,KAAKgoB,MAAMzoB,GAAKuwD,EAAM9nC,MAAMzoB,GACzC,GAAa,IAATywD,EACA,OAAO3kD,KAAK4kD,KAAKD,EAExB,CACD,OAAO,CACV,IA9FL,CAAA,CAAAr8C,IAAA,eAAApT,MAgBI,SAAoB2vD,EAAkBC,EAAeC,EAAiBC,GAClE,IACK5xC,OAAOixC,UAAUQ,KACjBzxC,OAAOixC,UAAUS,KACjB1xC,OAAOixC,UAAUU,KACjB3xC,OAAOixC,UAAUW,IAClBH,EAAW,GACXC,EAAQ,GACRC,EAAU,GACVC,EAAU,GACVH,EAAW,gBACXC,EAAQ,MACRC,EAAU,YACVC,EAAU,WAEV,MAAM,IAAIC,WAAW,uBAGzB,IAAMtoC,EAAQ,IAAI5B,WAAW,IAiB7B,OAhBA4B,EAAM,GAAKkoC,EAAW7kD,KAAAujD,IAAA,EAAK,IAC3B5mC,EAAM,GAAKkoC,EAAW7kD,KAAAujD,IAAA,EAAK,IAC3B5mC,EAAM,GAAKkoC,EAAW7kD,KAAAujD,IAAA,EAAK,IAC3B5mC,EAAM,GAAKkoC,EAAW7kD,KAAAujD,IAAA,EAAK,IAC3B5mC,EAAM,GAAKkoC,EAAW7kD,KAAAujD,IAAA,EAAK,GAC3B5mC,EAAM,GAAKkoC,EACXloC,EAAM,GAAK,IAAQmoC,IAAU,EAC7BnoC,EAAM,GAAKmoC,EACXnoC,EAAM,GAAK,IAAQooC,IAAY,GAC/BpoC,EAAM,GAAKooC,IAAY,GACvBpoC,EAAM,IAAMooC,IAAY,EACxBpoC,EAAM,IAAMooC,EACZpoC,EAAM,IAAMqoC,IAAY,GACxBroC,EAAM,IAAMqoC,IAAY,GACxBroC,EAAM,IAAMqoC,IAAY,EACxBroC,EAAM,IAAMqoC,EACL,IAAIR,EAAK7nC,EACnB,KApDL6nC,CAAA,CAAA,GAkGMU,wDACkB,oBACF,GACQ1iB,EAAA7tC,KAAA,SAAA,IAAIwwD,sCAY9B,WACI,IAAMjwD,EAAQP,KAAKywD,kBACnB,QAAc5nD,IAAVtI,EACA,OAAOA,EAGPP,KAAK0sB,UAAY,EACjB,IAAMgkC,EAAkB1wD,KAAKywD,kBAC7B,QAAwB5nD,IAApB6nD,EACA,MAAM,IAAIj6C,MAAM,iDAEpB,OAAOi6C,CAEd,gCAWD,WACI,IAGMC,EAAKv9C,KAAKD,MAChB,GAAIw9C,EAAK3wD,KAAK0sB,UACV1sB,KAAK0sB,UAAYikC,EACjB3wD,KAAK4wD,mBACF,MAAID,EANgB,IAMU3wD,KAAK0sB,WAUtC,OARA1sB,KAAK6wD,UACD7wD,KAAK6wD,QAVO,gBAYZ7wD,KAAK0sB,YACL1sB,KAAK4wD,eAKZ,CAED,OAAOf,GAAKiB,aACR9wD,KAAK0sB,UACLrhB,KAAKokD,MAAMzvD,KAAK6wD,iBAAU,EAAK,KAC/B7wD,KAAK6wD,QAAWxlD,KAAKujD,IAAA,EAAA,IAAK,EAC1B5uD,KAAK2gC,OAAOowB,aAEnB,6BAGD,WACI/wD,KAAK6wD,QAAqC,KAA3B7wD,KAAK2gC,OAAOowB,cAAmD,KAA3B/wD,KAAK2gC,OAAOowB,aAClE,UAODC,GAAwE,SAACxlD,GAEzE,GAAoC,oBAAzBylD,sBAAwCA,qBAC/C,MAAM,IAAIx6C,MAAM,6CAGpB,IAAK,IAAIlX,EAAI,EAAGA,EAAIiM,EAAO9L,OAAQH,IAC/BiM,EAAOjM,GAA4C,MAAvC8L,KAAKokD,MAAsB,MAAhBpkD,KAAKs1B,UAAkCt1B,KAAKokD,MAAsB,MAAhBpkD,KAAKs1B,UAElF,OAAOn1B,CACV,EAGqB,oBAAX0lD,QAA0BA,OAAOF,kBACxCA,GAAkB,SAACxlD,GAAD,OAAY0lD,OAAOF,gBAAgBxlD,SAoBrD2lD,GAZEX,qDACwB,IAAIplD,YAAY,oBACzBipB,yCACjB,WAKI,OAJIr0B,KAAKoxD,QAAUpxD,KAAKwL,OAAO9L,SAC3BsxD,GAAgBhxD,KAAKwL,QACrBxL,KAAKoxD,OAAS,GAEXpxD,KAAKwL,OAAOxL,KAAKoxD,SAC3B,UAWQC,GAAS,WAAA,OAAcC,KAAY1/B,UAA1B,EAGhB0/B,GAAY,WAAA,OAAaH,KAAqBA,GAAmB,IAAIZ,KAAgBgB,UAAzE,EClPZC,GAA2B,KAC3BC,GAA2B,GAC3BC,GAAuB,MAEhBC,GAAb,WAYI,SAAYtqB,EAAAA,EAAgCpD,GAAiC9B,EAAAniC,KAAA2xD,GAAA9jB,EAAA7tC,KAAA,4BAFb,IAG5DA,KAAKqnC,OAASA,EACdrnC,KAAKikC,YAAcA,EACnBjkC,KAAK4xD,eAAY/oD,EACjB7I,KAAK6xD,gBAAahpD,EAClB7I,KAAK8xD,uBAAyB,KAC9B9xD,KAAK+xD,0BAA4B,KAEjC,IAAMC,EAAkB3qB,EAAM,kBAAwBA,EAAM,MACxD4qB,EAAiB5qB,EAAM,8BAAoCmqB,GAsB/D,GApB8B,iBAAnBS,GACPxlD,QAAQC,KAAK,sFACbulD,EAAiBT,IACVS,EAAiBT,GACxB/kD,QAAQC,KACJ,wGAEGulD,EAAiBR,IACxBhlD,QAAQC,KACJ,oGAIR1M,KAAKkyD,kBACwF,IAAzF7mD,KAAKC,IAAID,KAAKspC,IAAIsd,EAAgBR,IAA2BD,IACjExxD,KAAKmyD,uBAAyB,MAAQH,EAAkB,aACxDhyD,KAAKoyD,mCAAqC,MAAQJ,EAAkB,yBAIhEhyD,KAAKqyD,wBAAyB,CAC9B,IAAMC,EAAephB,GAAajf,MAAMjyB,KAAKmyD,wBAEvCI,EAAsBrhB,GAAajf,MAAMjyB,KAAKoyD,oCAChDE,IAAiBC,EAEjBvyD,KAAK4xD,UAAYU,EAGjBphB,GAAa3rB,OAAOvlB,KAAKmyD,wBAG7BjhB,GAAah9B,IAAIlU,KAAKoyD,oCAAoC,EAC7D,CAEDpyD,KAAKwyD,uBACR,CA3DL,OAAAzoB,EAAA4nB,EAAA,CAAA,CAAAh+C,IAAA,cAAApT,MA6DI,SAAYomB,GAAgD,IAAAxS,EAAAnU,KAWxD,YARuC6I,IAAnC7I,KAAKyyD,4BACLzyD,KAAKyyD,0BAA4B,IAGrCzyD,KAAKyyD,0BAA0B3xD,KAAK6lB,GAChC3mB,KAAK6xD,YACLlrC,EAAS3mB,KAAK6xD,WAAY7xD,KAAK4xD,WAE5B,WACHz9C,EAAKs+C,0BAA4Bt+C,EAAKs+C,0BAA0Bz4C,QAAO,SAACiF,GAAD,OAAOA,IAAM0H,CAAb,IAE9E,GA3EL,CAAAhT,IAAA,wBAAApT,MA6EI,WAEI,MAAmC,WAA5BP,KAAKqnC,OAAOpD,cAA6BjkC,KAAKikC,YAAY8N,UAAYb,GAAa/B,cA/ElG,GAAA,CAAAx7B,IAAA,eAAApT,MAsFI,SAAqBk1C,GACbA,IAAaz1C,KAAK4xD,YAClB5xD,KAAK4xD,UAAYnc,EACbz1C,KAAKqyD,yBACLnhB,GAAah9B,IAAIlU,KAAKmyD,uBAAwB1c,GAGzD,GA7FL,CAAA9hC,IAAA,eAAApT,MA+FI,WACI,OAAIP,KAAK4xD,UACE5xD,KAAK4xD,UAEZ5xD,KAAKqyD,wBACEnhB,GAAajf,MAAMjyB,KAAKmyD,wBAG5B,IAvGf,GAAA,CAAAx+C,IAAA,gBAAApT,MA4GI,SACIm1C,EACAgd,EACAC,GAGIjd,IAAc11C,KAAK6xD,YACnBa,IAA6B1yD,KAAK+xD,2BAClCY,IAA0B3yD,KAAK8xD,yBAE/B9xD,KAAK8xD,uBAAyBa,EAC9B3yD,KAAK+xD,0BAA4BW,EACjC1yD,KAAK6xD,WAAanc,EAClB11C,KAAKikC,YAAYmE,SAAjByF,EAAA,CAAA,EACK/K,GAAa,CAAC4vB,EAA0Bhd,EAAWid,KAG/D,GA7HL,CAAAh/C,IAAA,gBAAApT,MA+HI,WACI,GAAIP,KAAK6xD,YAAc7xD,KAAK+xD,2BAA6B/xD,KAAK8xD,uBAC1D,MAAO,CAAC9xD,KAAK+xD,0BAA2B/xD,KAAK6xD,WAAY7xD,KAAK8xD,wBAElE,IAAMpc,EAAY11C,KAAKikC,YAAYja,MAAM8Y,IAOzC,OALIzhC,MAAMwzB,QAAQ6gB,IAAmC,IAArBA,EAAUh2C,QAEtCg2C,EAAU50C,KAAK40C,EAAU,IAGtBA,GAAa,CAAC,EAAG,KAAM,EA1ItC,GAAA,CAAA/hC,IAAA,iBAAApT,MA+II,WACIP,KAAK4yD,cAAc,KAAM,KAAM,KAClC,GAjJL,CAAAj/C,IAAA,wBAAApT,MAyJI,WAAsC,IAAA8lC,EAAArmC,KAClC8T,OAAOrC,iBAAiB,gBAAgB,WAChC40B,EAAKgsB,yBACLnhB,GAAa3rB,OAAO8gB,EAAK+rB,sCAGpC,GA/JL,CAAAz+C,IAAA,gCAAApT,MAiLI,WAAkF,IAApDsyD,0DACpBnmC,0DADkE,QACxC,IAAItZ,MAAOozB,UAG3CssB,EAAArpB,EAAiDzpC,KAAK+yD,gBAAtD,GAAKC,EAALF,EAAA,GAAoBpd,EAApBod,EAAA,GAA+BG,EAA/BH,EAAA,GACIrd,EAAWz1C,KAAKkzD,eAEdC,EACFF,GAAkBA,EAAiB,GAAK5nD,KAAKi3B,IAAI5V,EAAYumC,GAAkBvB,GAE/E0B,GAAgB,GAEf1d,IACCmd,GAAYxnD,KAAKi3B,IAAI5V,EAAYsmC,GAAiBhzD,KAAKkyD,mBACzDiB,GAEAzd,EAAY2b,KACZ5b,EAAW4b,KACX4B,EAAiBvmC,EACjB0mC,GAAgB,GACR3d,IACRA,EAAW4b,KACX+B,GAAgB,GAGpB,IAAMC,EAAiC,IAAlBL,IAAwBH,GAAYM,EAA2BzmC,EAAYsmC,EAC1FL,EAA2C,IAAnBM,GAAuB,IAAI7/C,MAAOozB,UAAYysB,EAS5E,OAPAjzD,KAAKszD,aAAa7d,GAClBz1C,KAAK4yD,cAAcld,EAAW2d,EAAcV,GAExCS,GACApzD,KAAKyyD,0BAA0Bl9C,SAAQ,SAACsJ,GAAD,OAAaA,EAAQ62B,EAAWD,MAGpE,CACHC,UAAAA,EACAD,SAAAA,EACAkd,sBAAAA,EAEP,KAzNLhB,CAAA,CAAA,GCyCa4B,GAQTxpB,GAAA,SAAAwpB,EAAYC,EAAmBC,EAAuBC,EAAoBC,GAAiBxxB,EAAAniC,KAAAuzD,GAEvFvzD,KAAKgG,KAAO,aACZhG,KAAK4zD,UAAY,SAAUC,GACvBA,GAAwB,SAACj+C,GAAwB,IAAAk+C,EAAAC,EAAAC,EAAAC,EAAAC,EAC7C,GAAoB,UAAhBt+C,EAAMof,QAAsBw+B,EAASvmB,SAAU,OAAOr3B,EACrDA,EAAMu+C,OAAMv+C,EAAMu+C,KAAO,CAAA,GAE9B,IAAMzyD,EAAO8xD,EAASnsB,OAAO+sB,SAAWZ,EAASnsB,OAAOgtB,SACxDz+C,EAAMu+C,KAAK,sBAAwBzyD,EAAO,WAAa8xD,EAASxoB,kBAC5DwoB,EAASc,4BACT1+C,EAAMu+C,KAAK,yBAA2BX,EAASe,uBAAuB,CAAEC,eAAe,KAG3F,IAAMC,GAAa,QAAA7+C,EAAAA,EAAM8+C,iBAAN,IAAAZ,OAAA,EAAAA,EAAiBxqC,SAAU,GAExC/d,EAAoD,CAEtDopD,mBAAkB,UAAEF,EAAW,UAAb,IAAAV,OAAA,EAAEA,EAAexzD,MACnCq0D,gBAAe,UAAEH,EAAW,UAAb,IAAAT,OAAA,EAAEA,EAAehyD,KAChC6yD,qBAAsBnzD,EAAO,WAAa8xD,EAASxoB,kBAEnD8pB,iBAAkBl/C,EAAMm/C,SACxBC,kBAAmBp/C,EAAM8+C,UACzBO,0BAAyB,UAAER,EAAW,UAAb,IAAAR,OAAA,EAAEA,EAAe1zD,MAC1C20D,uBAAsB,UAAET,EAAW,UAAb,IAAAP,OAAA,EAAEA,EAAelyD,KACvCmzD,aAAcv/C,EAAMu+C,MAYxB,OATIV,GAAgBC,IAChBnoD,EAAI,aACCooD,GAAU,oCACXF,EACA,oBACAC,EACA,UACA99C,EAAMm/C,UACdvB,EAASrhD,QAAQ,aAAc5G,GACxBqK,CACV,IAER,ICtDQw/C,GAA2B,SAACC,GAChCC,SAAYA,QAAQC,SACrB9oD,QAAQC,KAAK,uFAGjB,IAAM8oD,EAAc,SAAC5qD,EAA2BgU,GACvChU,EAAIgL,MAAM6/C,QAAU7qD,EAAIgL,MAAM8/C,cAAgBL,EAAQrqB,mBAEvDqqB,EAAQziD,QAERhI,EAAIgL,MAAM6/C,QAAU7qD,EAAIgL,MAAM6/C,SAAWJ,EAAQrqB,oBACjDqqB,EAAQjtB,SAAS,CACb2C,YAAangC,EAAIgL,MAAM6/C,SAE3BJ,EAAQzmB,sBAGZ,IAAM+mB,EAAuBN,EAAQO,4BAA4Bh3C,EAAWhU,EAAIgL,MAAM0pB,YAEtF,OADA10B,EAAIgL,MAAM0pB,WAAangC,OAAOC,OAAO,GAAIu2D,EAAsB/qD,EAAIgL,MAAM0pB,YAClE10B,GAGX,MAAO,CACH5E,KAAM,aACNhE,KAAM,aACNi0B,QAAS,QACT4/B,SAAU,WAAA,OAAM,CAJb,EAOHlkB,KAAM,WAAA,OAAM2jB,QAAQC,SAPjB,EAQHO,MAAO,SAAClrD,GAAD,OAAS4qD,EAAY5qD,EAAKA,EAAIgL,MAAMA,MARxC,EASHmgD,KAAM,SAACnrD,GAAD,OAAS4qD,EAAY5qD,EAAK,YAT7B,EAUHorD,SAAU,SAACprD,GAAD,OAAS4qD,EAAY5qD,EAAK,YAVjC,EAWHw1B,OAAQ,SAACx1B,GAAD,OAAS4qD,EAAY5qD,EAAK,UAA1B,EAEf,EClDYqrD,GAAb,WAAA,SAAAA,IAAA,IAAA9hD,EAAAnU,KAAAmiC,EAAAniC,KAAAi2D,GAAApoB,EAAA7tC,KAAA,oBAEuB,GAFvB6tC,EAAA7tC,KAAA,qBAoFwB,WAAM,IAAAk2D,EAAAC,EAAAC,EAAAC,EACjBliD,EAAKmiD,gBACNniD,EAAKmiD,cAAgBniD,EAAKoiD,uBAE9B,IAAMC,EAAeriD,EAAKmiD,cAEpBG,EAAUtiD,EAAKuiD,WACfC,EAAexiD,EAAKyiD,gBACpBC,EAAW1iD,EAAK2iD,YAChBC,EAAgB5iD,EAAK6iD,iBAE3BR,EAAaS,YAAcR,EAC3BD,EAAaU,WAAa7rD,KAAKspC,IAAI8hB,EAAT,QAAAP,EAAkBM,EAAaU,kBAA/B,IAAAhB,EAAAA,EAA6C,GACvEM,EAAaW,gBAAkB9rD,KAAKspC,IAAIgiB,EAAT,QAAAR,EAAuBK,EAAaW,uBAApC,IAAAhB,EAAAA,EAAuD,GAEtFK,EAAaY,aAAeP,EAC5BL,EAAaa,YAAchsD,KAAKspC,IAAIkiB,EAAT,QAAAT,EAAmBI,EAAaa,mBAAhC,IAAAjB,EAAAA,EAA+C,GAC1EI,EAAac,iBAAmBjsD,KAAKspC,IAAIoiB,EAAT,QAAAV,EAAwBG,EAAac,wBAArC,IAAAjB,EAAAA,EAAyD,KArGjG,CAAA,OAAAtsB,EAAAksB,EAAA,CAAA,CAAAtiD,IAAA,sBAAApT,MAII,WACI,MAAO,CACHy/B,SAAUlsB,GAAOtC,SAASwuB,SAEjC,GARL,CAAArsB,IAAA,aAAApT,MAUI,WAAsC,IAAAg3D,EAC9BC,EAkBJ,OAfKx3D,KAAKy3D,kBAOND,EAAmBx3D,KAAKs2D,cACxBt2D,KAAKs2D,cAAgBt2D,KAAKu2D,wBAP1Bv2D,KAAKy3D,kBAAmB,EACxBD,OAAmB3uD,EACd7I,KAAKs2D,gBACNt2D,KAAKs2D,cAAgBt2D,KAAKu2D,wBASlC7kD,WAAW1R,KAAK03D,kBAAmB,GAEnC3oB,EAAA,CACI4oB,wBAAuB,QAAAJ,EAAEC,SAAF,IAAAD,OAAA,EAAEA,EAAkBv3B,UACxChgC,KAAK43D,mCAAmCJ,GAElD,GAjCL,CAAA7jD,IAAA,cAAApT,MAmCI,WACI,IAAMi3D,EAAmBx3D,KAAKs2D,cAC9B,OAAAvnB,EAAA,CACI4oB,wBAAyBH,aAAF,EAAEA,EAAkBx3B,UACxChgC,KAAK43D,mCAAmCJ,GAElD,GAzCL,CAAA7jD,IAAA,qCAAApT,MA2CI,SAAmCi3D,GAC/B,IACKA,GACmC,MAApCA,EAAiBL,iBACe,MAAhCK,EAAiBP,aACc,MAA/BO,EAAiBN,YACoB,MAArCM,EAAiBF,kBACgB,MAAjCE,EAAiBJ,cACe,MAAhCI,EAAiBH,YAEjB,MAAO,GAGX,IAAMF,EAA0FK,EAA1FL,gBAAiBF,EAAyEO,EAAzEP,YAAaC,EAA4DM,EAA5DN,WAAYI,EAAgDE,EAAhDF,iBAAkBF,EAA8BI,EAA9BJ,aAAcC,EAAgBG,EAAhBH,YAgBhF,OAbAF,EAAkB9rD,KAAK0+C,KAAKoN,GAC5BF,EAAc5rD,KAAK0+C,KAAKkN,GACxBC,EAAa7rD,KAAK0+C,KAAKmN,GACvBI,EAAmBjsD,KAAK0+C,KAAKuN,GAC7BF,EAAe/rD,KAAK0+C,KAAKqN,GACzBC,EAAchsD,KAAK0+C,KAAKsN,GAQjB,CACHQ,2BAA4BZ,EAC5Ba,sCAPyBX,GAAmB,EAAI,EAAIY,GAAMd,EAAcE,EAAiB,EAAG,GAQ5Fa,0BAA2Bd,EAC3Be,qCARwBd,GAAmB,EAAI,EAAIY,GAAMb,EAAaC,EAAiB,EAAG,GAS1Fe,4BAA6Bd,EAC7Be,uCAT0Bb,GAAoB,EAAI,EAAIS,GAAMX,EAAeE,EAAkB,EAAG,GAUhGc,2BAA4Bf,EAC5BgB,sCAVyBf,GAAoB,EAAI,EAAIS,GAAMV,EAAcC,EAAkB,EAAG,GAYrG,GAlFL,CAAA3jD,IAAA,+BAAApT,MAwGI,WACIuT,GAAOrC,iBAAiB,SAAUzR,KAAK03D,mBACvC5jD,GAAOrC,iBAAiB,YAAazR,KAAK03D,mBAC1C5jD,GAAOrC,iBAAiB,SAAUzR,KAAK03D,kBAC1C,GA5GL,CAAA/jD,IAAA,8BAAApT,MA8GI,WACIuT,GAAOzB,oBAAoB,SAAUrS,KAAK03D,mBAC1C5jD,GAAOzB,oBAAoB,YAAarS,KAAK03D,mBAC7C5jD,GAAOzB,oBAAoB,SAAUrS,KAAK03D,kBAC7C,GAlHL,CAAA/jD,IAAA,gBAAApT,MAoHI,WACI,OAAO8K,KAAKspC,IAAI,EAAG7gC,GAAOhO,SAASgP,gBAAgB6hD,aAAe7iD,GAAOhO,SAASgP,gBAAgBC,aACrG,GAtHL,CAAApB,IAAA,WAAApT,MAwHI,WACI,OAAOuT,GAAO2iD,SAAW3iD,GAAOsc,aAAetc,GAAOhO,SAASgP,gBAAgB1H,WAAa,CAC/F,GA1HL,CAAAuG,IAAA,iBAAApT,MA4HI,WACI,OAAOuT,GAAOhO,SAASgP,gBAAgB6hD,cAAgB,CAC1D,GA9HL,CAAAhjD,IAAA,YAAApT,MAgII,WACI,IAAMwU,EAAejB,GAAOhO,SAASgP,gBAAgBC,cAAgB,EACrE,OAAO/U,KAAK02D,WAAa3hD,CAC5B,KAnILkhD,CAAA,CAAA,GAsIA,SAAS8B,GAAMjtD,EAAWQ,EAAaqpC,GACnC,OAAOtpC,KAAKspC,IAAIrpC,EAAKD,KAAKC,IAAIR,EAAG6pC,GACpC,CCvKM,SAAS2jB,GAAQz+C,GACpB,MAAwB,oBAAV6a,OAAyB6jC,GAAa1+C,EAAW6a,MAClE,CAMM,SAAS6jC,GAAa1+C,EAAoB2+C,GAC7C,IACI,OAAO3+C,aAAqB2+C,CADhC,CAEE,MAAOzuD,GACL,OAAO,CACV,CACJ,CAEM,SAAS0uD,GACZ5+C,GAEA,OAAqB,OAAdA,GAA4C,WAArB0O,EAAO1O,IAA+C,mBAAdA,CACzE,CAqBM,SAAS6+C,GAAU7+C,EAAoBtS,GAC1C,OAAOpI,OAAOS,UAAUgyB,SAAS9xB,KAAK+Z,KAA0BtS,WAAAA,OAAAA,EAAhE,IACH,CAMM,SAASoxD,GAAW9+C,GACvB,OAAO6+C,GAAU7+C,EAAW,WAC/B,CCvBD,IAAM++C,GAAuB,kBACvBC,GAAyB,GAEzBC,GAAmB,IA0BzB,SAASC,GAAYxN,EAAkBz4C,EAAckmD,EAAiBC,GAClE,IAAMC,EAAoB,CACtB3N,SAAAA,EACA4N,SAAUrmD,EACVsmD,QAAQ,GAWZ,YARevwD,IAAXmwD,IACAE,EAAMF,OAASA,QAGLnwD,IAAVowD,IACAC,EAAMD,MAAQA,GAGXC,CACV,CAOD,IAAMG,GACF,6IACEC,GAAkB,gCAkClBC,GACF,uIACEC,GAAiB,gDA+BjBC,GAAa,uFA6FZ,IAAMC,GA7CN,WAAuE,IAAA,IAAAviC,EAAA13B,UAAAC,OAAzCi6D,EAAyC,IAAAt4D,MAAA81B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAzCuiC,EAAyCviC,GAAA33B,UAAA23B,GAC1E,IAAMwiC,EAAgBD,EAAQpU,MAAK,SAAC5/C,EAAGihB,GAAJ,OAAUjhB,EAAE,GAAKihB,EAAE,EAAnB,IAAuB7jB,KAAI,SAACpD,GAAD,OAAOA,EAAE,EAAT,IAE9D,OAAO,SAAC8E,GAIJ,IAJmD,IAAhCo1D,yDAAY,EACzBC,EAAuB,GACvB5mC,EAAQzuB,EAAMD,MAAM,MAEjBjF,EAAIs6D,EAAWt6D,EAAI2zB,EAAMxzB,OAAQH,IAAK,CAC3C,IAAMizB,EAAOU,EAAM3zB,GAKnB,KAAIizB,EAAK9yB,OAAS,MAAlB,CAMA,IAAMq6D,EAAcnB,GAAqBt0D,KAAKkuB,GAAQA,EAAK5uB,QAAQg1D,GAAsB,MAAQpmC,EAIjG,IAAIunC,EAAY1zD,MAAM,cAAtB,CAhB2C,IAAA4iC,EAAAE,EAAAC,EAoBtBwwB,GApBsB,IAoB3C,IAAoCzwB,EAAA7pC,MAAA2pC,EAAAE,EAAA3pC,KAAAgB,MAAA,CAAA,IAC1B04D,GAAQ75B,EADkB4J,EAAA1oC,OACXw5D,GAErB,GAAIb,EAAO,CACPY,EAAOh5D,KAAKo4D,GACZ,KACH,CACJ,CA3B0C,CAAA,MAAA1sD,GAAA28B,EAAAvoC,EAAA4L,EAAA,CAAA,QAAA28B,EAAA7Q,GAAA,CA6B3C,GAAIwhC,EAAOp6D,QAAUm5D,GACjB,KAZH,CAlB0C,CAgC9C,CAED,OAzDD,SAAiBp0D,GACpB,IAAKA,EAAM/E,OACP,MAAO,GAGX,IAAMs6D,EAAav1D,EAAMnD,MAAM,EAAGu3D,IAIlC,OAFAmB,EAAWC,UAEJD,EAAWj3D,KAAI,SAACm2D,GAAD,OAAAnqB,EAAAA,EAAA,CAAA,EACfmqB,GADe,CAAA,EAAA,CAElB3N,SAAU2N,EAAM3N,UAAYyO,EAAWA,EAAWt6D,OAAS,GAAG6rD,SAC9D4N,SAAUD,EAAMC,UAAY,KAHV,GAKzB,CA2Ccc,CAAQH,GAEtB,EAEiC/5D,WAAA,EA/DK,CApEe,CA5E9B,GAiDU,SAACyyB,GAC/B,IAAM9tB,EAAQ20D,GAAY/yD,KAAKksB,GAE/B,GAAI9tB,EAAO,CAGP,GAFeA,EAAM,IAAmC,IAA7BA,EAAM,GAAGH,QAAQ,QAEhC,CACR,IAAM21D,EAAWZ,GAAgBhzD,KAAK5B,EAAM,IAExCw1D,IAEAx1D,EAAM,GAAKw1D,EAAS,GACpBx1D,EAAM,GAAKw1D,EAAS,GACpBx1D,EAAM,GAAKw1D,EAAS,GAVrB,CAgBP,IAAAC,EAAA1wB,EAAyB2wB,GAA8B11D,EAAM,IAAMo0D,GAAkBp0D,EAAM,IAA3F,GAAOoO,EAAPqnD,EAAA,GAEA,OAAOpB,GAFPoB,EAAA,GAE6BrnD,EAAMpO,EAAM,IAAMA,EAAM,QAAKmE,EAAWnE,EAAM,IAAMA,EAAM,QAAKmE,EAC/F,CAGJ,GAsCoD,CA9G9B,GAmFU,SAAC2pB,GAC9B,IAAM9tB,EAAQ60D,GAAWjzD,KAAKksB,GAE9B,GAAI9tB,EAAO,CAEP,GADeA,EAAM,IAAMA,EAAM,GAAGH,QAAQ,YAAc,EAC9C,CACR,IAAM21D,EAAWV,GAAelzD,KAAK5B,EAAM,IAEvCw1D,IAEAx1D,EAAM,GAAKA,EAAM,IAAM,OACvBA,EAAM,GAAKw1D,EAAS,GACpBx1D,EAAM,GAAKw1D,EAAS,GACpBx1D,EAAM,GAAK,GAElB,CAED,IAAI6mD,EAAW7mD,EAAM,GACjBoO,EAAOpO,EAAM,IAAMo0D,GAfhBuB,EAAA5wB,EAgBa2wB,GAA8BtnD,EAAMy4C,GAhBjD,GAkBP,OAFEz4C,EAhBKunD,EAAA,GAkBAtB,GAFCxN,EAhBD8O,EAAA,GAkBsBvnD,EAAMpO,EAAM,IAAMA,EAAM,QAAKmE,EAAWnE,EAAM,IAAMA,EAAM,QAAKmE,EAC/F,CAGJ,GAcoD,CA3H9B,GAmHU,SAAC2pB,GAC9B,IAAM9tB,EAAQ+0D,GAAWnzD,KAAKksB,GAE9B,OAAO9tB,EACDq0D,GAAYr0D,EAAM,GAAIA,EAAM,IAAMo0D,IAAmBp0D,EAAM,GAAIA,EAAM,IAAMA,EAAM,QAAKmE,QACtFA,CACT,KA2GKuxD,GAAgC,SAACtnD,EAAcy4C,GACjD,IAAM+O,GAA0D,IAAtCxnD,EAAKvO,QAAQ,oBACjCg2D,GAAiE,IAA1CznD,EAAKvO,QAAQ,wBAE1C,OAAO+1D,GAAqBC,EACtB,EAC2B,IAAvBznD,EAAKvO,QAAQ,KAAcuO,EAAKtO,MAAM,KAAK,GAAKs0D,GAChDwB,EAAwC/O,oBAAAA,OAAAA,GAAqCA,wBAAAA,OAAAA,IAEjF,CAACz4C,EAAMy4C,EAChB,EClQKiP,GACF,2GAuBEC,GAAsB,8BAgBrB,SAASC,GAAiBC,GAI7B,IAAMzoC,EAAayoC,EAAGzoC,YAAcyoC,EAAGl2D,OAAS,GAE1Cm2D,EApBV,SAAoBD,GAChB,GAAIA,EAAI,CACJ,GAA8B,iBAAnBA,EAAGE,YACV,OAAOF,EAAGE,YAGd,GAAIJ,GAAoBn2D,KAAKq2D,EAAG9nC,SAC5B,OAAO,CAEd,CAED,OAAO,CACV,CAQmBioC,CAAWH,GAE3B,IACI,OAAOjB,GAAmBxnC,EAAY0oC,EAD1C,CAEE,MAAOh6D,GAER,CAED,MAAO,EACV,CAED,SAASm6D,GAAyBh6D,GAC9B,IAAM+4D,EAASY,GAAiB35D,GAEhC,MAAO,CACH6zD,gBAAiB7zD,EAAMiF,KACvB2uD,mBAAoB5zD,EAAM8xB,QAC1BmoC,2BAA4B90C,KAAKC,UAAU2zC,GAElD,CAcD,SAASmB,GAA+BvG,GAA4D,IAAxBwG,yDAAY,GAC9E18C,EAAOrf,OAAOqf,KAAKk2C,GAGzB,GAFAl2C,EAAK+mC,QAEA/mC,EAAK9e,OACN,MAAO,uBAGX,IAAK,IAAIH,EAAIif,EAAK9e,OAAQH,EAAI,EAAGA,IAAK,CAClC,IAAM47D,EAAa38C,EAAKld,MAAM,EAAG/B,GAAG0D,KAAK,MACzC,KAAIk4D,EAAWz7D,OAASw7D,GAGxB,OAAI37D,IAAMif,EAAK9e,QAGRy7D,EAAWz7D,QAAUw7D,EAFjBC,EAEJ,GAAA55D,OAAiD45D,EAAW75D,MAAM,EAAG45D,GAA5E,MACH,CAED,MAAO,EACV,CASM,SAASE,GAA0F9d,GAAA,IAAA8R,EAAA3lB,EAAA6T,EAAA,GAAvE1nC,EAAuEw5C,EAAA,GAAhE/6C,EAAgE+6C,EAAA,GAAxD4J,EAAwD5J,EAAA,GAAhD6J,EAAgD7J,EAAA,GAAzCruD,EAAyCquD,EAAA,GAElGiM,EAGA,CAAA,EAEJ,QAAcxyD,IAAV9H,GAAwC,iBAAV6U,EAAoB,CAClD,IAAI5P,EAAO,QACP6sB,EAAUjd,EACRq1B,EAASr1B,EAAMvP,MAAMm0D,IACvBvvB,IACAjlC,EAAOilC,EAAO,GACdpY,EAAUoY,EAAO,IAErBowB,EAAkB,CACdzG,gBAAiB5uD,EACjB2uD,mBAAoB9hC,EAE3B,CAED,IAAMhZ,EAAY9Y,GAAS6U,EAE3B,GAAI+iD,GAAW9+C,IFtGZ,SAAwBA,GAC3B,OAAO6+C,GAAU7+C,EAAW,eAC/B,CEoGgCyhD,CAAezhD,GAAY,CAIpD,IAAM0hD,EAAe1hD,EAErB,GFpHD,SAA0BA,GAC7B,MAAO,UAAYA,CACtB,CEkHW2hD,CAAiB3hD,GACjBwhD,EAAkBN,GAAyBlhD,OACxC,CACH,IAAM7T,EAAOu1D,EAAav1D,OAAS2yD,GAAW4C,GAAgB,WAAa,gBACrE1oC,EAAU0oC,EAAa1oC,QAAb,GAAAtxB,OAA0ByE,EAA1B,MAAAzE,OAAmCg6D,EAAa1oC,SAAY7sB,EAC5Eq1D,EA3EZ,SAAmCxhD,GAC/B,MAAO,CACH+6C,gBAAiB,QACjBD,mBAAoB96C,EAE3B,CAsE6B4hD,CAA0B5oC,GAC5CwoC,EAAgBzG,gBAAkB+D,GAAW4C,GAAgB,WAAa,eAC1EF,EAAgB1G,mBAAqB0G,EAAgB1G,oBAAsB9hC,CAC9E,CACG,SAAU0oC,IACVF,EAAe,6BAAsCE,GAAAA,OAAAA,EAAaG,MAhB1E,MAkBO,GFpIJ,SAAsB9lD,GACzB,OAAO8iD,GAAU9iD,EAAO,aAC3B,CEkIc+lD,CAAa9hD,IAA6BA,EAAyB9Y,MAC1Es6D,EAAkBN,GAA0BlhD,EAAyB9Y,YAClE,GFjJJ,SAAiB8Y,GACpB,OAAQ1a,OAAOS,UAAUgyB,SAAS9xB,KAAK+Z,IACnC,IAAK,iBACL,IAAK,qBACL,IAAK,wBACD,OAAO,EACX,QACI,OAAO0+C,GAAa1+C,EAAWpD,OAE1C,CEwIcmlD,CAAQ/hD,GACfwhD,EAAkBN,GAAyBlhD,QACxC,GFrKJ,SAAuBA,GAC1B,OAAO6+C,GAAU7+C,EAAW,SAC/B,CEmKcgiD,CAAchiD,IAAcy+C,GAAQz+C,GAAY,CAGvDwhD,EAvDR,SAAmCxhD,GAC/B,MAAO,CACH+6C,gBAAiB0D,GAAQz+C,GAAaA,EAAU+O,YAAY5iB,KAAO,QACnE2uD,uCAAiC,YAAf,wBAAkDsG,GAA+BphD,IAE1G,CAkDyBiiD,CADMjiD,GAExBwhD,EAAgBU,yBAA0B,CAC7C,MAEGV,EAAgBzG,gBAAkByG,EAAgBzG,iBAAmB,QACrEyG,EAAgB1G,mBAAqB0G,EAAgB1G,oBAAsB96C,EAC3EwhD,EAAgBU,yBAA0B,EAG9C,OAAAhtB,EAAAA,EAAAA,EAAAA,EAAA,GACOssB,GADP,GAAA,CAGIzG,gBAAiByG,EAAgBzG,iBAAmB,mBACpDD,mBAAoB0G,EAAgB1G,oBAAsB,IACtDtgD,EACE,CACI2nD,kBAAmB3nD,GAEvB,CAAA,GACF2kD,EAAS,CAAEiD,kBAAmBjD,GAAW,CAAA,GACzCC,EAAQ,CAAEiD,iBAAkBjD,GAAU,CAX9C,EAaH,CC5LD,ICQYkD,GAeAC,GDrBCC,GAAb,WAQI,SAAAA,EAAYv4B,GAAmB3B,EAAAniC,KAAAq8D,GAAAxuB,EAAA7tC,KAAA,8BAL+C6I,GAK/CglC,EAAA7tC,KAAA,2CAJyE6I,GAIzEglC,EAAA7tC,KAAA,iBAFI,IAG/BA,KAAK8jC,SAAWA,CACnB,CAVL,OAAAiG,EAAAsyB,EAAA,CAAA,CAAA1oD,IAAA,WAAApT,MAYI,WACI,GAAIP,KAAK8jC,SAASK,WAAW,SAAU,CAAA,IAAA,IAAAm4B,EAAAnlC,EAAA13B,UAAAC,OADvB8T,EACuB,IAAAnS,MAAA81B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IADvB5jB,EACuB4jB,GAAA33B,UAAA23B,IACnCklC,EAAA7vD,SAAQwqB,IAAIl3B,MAAAu8D,EAAA,CAAA,iDAA6C9oD,GAC5D,CACJ,GAhBL,CAAAG,IAAA,iBAAApT,MAkBI,WAAiB,IAAAg8D,EACb,GAAKv8D,KAAKy8C,cAAN,QAAA8f,EAAsBzoD,GAAOgpB,eAA7B,IAAAy/B,IAAqBA,EAAyBC,0BAIlD,IACIx8D,KAAKy8D,uBAAyB3oD,GAAOgpB,QAErChpB,GAAOgpB,QAAU,WAAqE,IAAA,IAAAxF,EAAA73B,UAAAC,OAA/B8T,EAA+B,IAAAnS,MAAAi2B,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAA/BhkB,EAA+BgkB,GAAA/3B,UAAA+3B,GAGlF,OAFAx3B,KAAK08D,iBAAiBlpD,KAElBxT,KAAKy8D,wBAEEz8D,KAAKy8D,uBAAuB18D,MAAMC,KAAMwT,EAItD,EAACmK,KAAK3d,MACL8T,GAAOgpB,QAAgB0/B,0BAA2B,EAEpDx8D,KAAK28D,oCAAsC7oD,GAAO8oD,qBAElD9oD,GAAO8oD,qBAAuB,WAGnB,IAAA,IAAAllC,EAAAj4B,UAAAC,OADJ8T,EACI,IAAAnS,MAAAq2B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IADJnkB,EACImkB,GAAAl4B,UAAAk4B,GACP,IAAM0jC,EDgJf,SAA4F9L,GAAA,IAAnDsN,EAAmDpzB,EAAA8lB,EAAA,GAAA,GAE3FxuD,EAAiB87D,EACrB,IAGQ,WAAYA,EACZ97D,EAAQ87D,EAAGC,OAON,WAAYD,GAAM,WAAaA,EAAWE,SAC/Ch8D,EAAS87D,EAAWE,OAAOD,OAZnC,CAcE,MAAOE,GAjBsF,CAsB/F,IAAI3B,EAGA,CAAA,EAUJ,OARIA,EADA5C,GAAY13D,GACM,CACd4zD,mBAAwE95B,oDAAAA,OAAAA,OAAO95B,KAGjEq6D,GAAkB,CAACr6D,KAEzBk8D,oBAAqB,EAErCluB,EAAAA,EAAA,CAAA,EACOssB,GADP,CAAA,EAAA,CAGIzG,gBAAkByG,EAAgBzG,gBAAkB,qBACpDD,mBAAqB0G,EAAgB1G,mBACjC0G,EAAgB1G,oBAAuBkI,EAAWC,QAAUjiC,OAAO95B,IAE9E,CC1LwDm8D,CAA+B1pD,GAGxE,OAFAxT,KAAKm9D,mBAAmB9B,IAEpBr7D,KAAK28D,qCAEE38D,KAAK28D,oCAAoC58D,MAAM+T,GAAQN,EAIrE,EAACmK,KAAK3d,MACL8T,GAAO8oD,qBAA6BJ,0BAA2B,CA/BrE,CAgCE,MAAO57D,GACL6L,QAAQ1L,MAAM,gDAAiDH,GAC/DZ,KAAKo9D,eACR,CACJ,GA3DL,CAAAzpD,IAAA,gBAAApT,MA6DI,WAAgB,IAAA88D,EAAAC,OACwBz0D,IAAhC7I,KAAKy8D,yBACL3oD,GAAOgpB,QAAU98B,KAAKy8D,uBACtBz8D,KAAKy8D,uBAAyB,MAElC,QAAAY,EAAQvpD,GAAOgpB,eAAf,IAAAugC,UAAOA,EAAyBb,8BAEiB3zD,IAA7C7I,KAAK28D,sCACL7oD,GAAO8oD,qBAAuB58D,KAAK28D,oCACnC38D,KAAK28D,oCAAsC,MAE/C,QAAAW,EAAQxpD,GAAO8oD,4BAAf,IAAAU,UAAOA,EAAsCd,wBAChD,GAzEL,CAAA7oD,IAAA,cAAApT,MA2EI,WAAc,IAAAg9D,EACV,QAAS,UAACzpD,GAAOgpB,eAAR,IAAAygC,IAAAA,EAAyBf,yBACrC,GA7EL,CAAA7oD,IAAA,YAAApT,MA+EI,WAAY,IAAAi9D,EACR,OAAA,QAAOA,EAAAx9D,KAAKu9C,qBAAZ,IAAAigB,GAAAA,CACH,GAjFL,CAAA7pD,IAAA,sBAAApT,MAmFI,SAAoB2nC,GAChB,IAAMu1B,EAAgCv1B,EAASw1B,sBAE/C,GADA19D,KAAKu9C,gBAAkBkgB,IAAiC,GAEnDhF,GAAYgF,IACb,qBAAsBA,GACtBp8D,MAAMwzB,QAAQ4oC,EAA8BE,kBAC9C,CACE,IAAMC,EAAYH,EAA8BE,iBAEhD39D,KAAK69D,eAAiBD,EAAU76D,KAAI,SAACG,GACjC,OAAO,IAAIR,OAAOQ,EACrB,GACJ,CAEGlD,KAAKy8C,aACLz8C,KAAK89D,iBACL99D,KAAK+9D,SAAS,+DAAgEN,IAE9Ez9D,KAAK+9D,SACD,oEACAN,EAGX,GA3GL,CAAA9pD,IAAA,mBAAApT,MA6GI,SAAiBiT,EAAsB8rB,GACnC,IAAM+7B,EAAkBD,GAAkB5nD,GAE1C,GAAIxT,KAAK69D,eAAepyD,MAAK,SAAC2yB,GAAD,OAAWA,EAAM95B,KAAK+2D,EAAgB1G,oBAAsB,GAA5D,IACzB30D,KAAK+9D,SAAS,4CAA6C1C,OAD/D,CAKA,IAAM2C,EAAgBjvB,EAAAA,EAAA,CAAA,EAAQzP,GAAe+7B,GAEvC4C,EAAcj+D,KAAK8jC,SAASK,WAAW,YAAcnkC,KAAK8jC,SAASK,WAAW,YACpFk3B,EAAgBxG,qBAAuBoJ,EAAc,WAAaj+D,KAAK8jC,SAASkH,kBAEhFhrC,KAAKm9D,mBAAmBa,EAPvB,CAQJ,GA3HL,CAAArqD,IAAA,qBAAApT,MAgII,SAAmB++B,GACft/B,KAAK8jC,SAAS3xB,QAAQ,aAAcmtB,EAAY,CAC5Cwa,UAAW,MACXvO,OAAQ,OACRgK,SAtIyB,MAuIzBwE,aAAa,EACbC,UAAW,kBAElB,KAxILqiB,CAAA,CAAA,aCMYF,GAAAA,oBAAAA,kBAAAA,gBAAAA,yBAAAA,EAAAA,KAAAA,iBAeAC,GAAAA,cAAAA,yCAAAA,uCAAAA,YAAAA,kBAAAA,aAAAA,EAAAA,KAAAA,QA6BZ,ICaK8B,GAKDC,GAGAC,GDrBSC,GAAb,WAGI,SAAAA,EAAYv6B,GAAmB3B,EAAAniC,KAAAq+D,GAC3Br+D,KAAK8jC,SAAWA,CACnB,CALL,OAAAiG,EAAAs0B,EAAA,CAAA,CAAA1qD,IAAA,aAAApT,MAOI,SAAWomB,GAA+C,IAAAxS,EAAAnU,KAArBs+D,0DAC3BC,EAAkBv+D,KAAK8jC,SAASoG,aAAa/G,IACnD,GAAKo7B,IAAmBD,EAYpB,OAAO33C,EAAS43C,GAXhBv+D,KAAK8jC,SAASwH,cAAd,GAAA/pC,OACOvB,KAAK8jC,SAASK,WAAW,YAAkC,wBAAA5iC,OAAAvB,KAAK8jC,SAASK,WAAW,UACvF,GACA,CAAEoH,OAAQ,QACV,SAACrD,GAAa,IAAA0D,EACJ4yB,EAAUt2B,EAASs2B,QAEzB,eADI5yB,EAAAz3B,EAAC2vB,SAASG,4BAAamE,SAA3ByF,EAAA,CAAA,EAAuC1K,GAAUq7B,IAC1C73C,EAAS63C,KAM/B,GAvBL,CAAA7qD,IAAA,2BAAApT,MAyBI,SAAyBomB,GAA+C,IAAA0f,EAAArmC,KAArBs+D,0DAC/Ct+D,KAAKy+D,YAAW,SAACD,GACb,IAeME,EAfgBF,EAAQxkD,QAAO,SAAC2kD,GAClC,SAAUA,EAAOC,YAAeD,EAAOE,SAC1C,IAC6C7kD,QAAO,SAAC2kD,GAAW,IAAAG,EAAAC,EAC7D,IAAKJ,EAAOK,WACR,OAAO,EAEX,IAAMC,EAAW,QAAAH,EAAAH,EAAOK,kBAAP,IAAAF,IAAAA,EAAmB36D,KAC9B2P,OAAOtC,SAAS7N,KAAKY,QAAQo6D,EAAOK,WAAW76D,MAAQ,EAEvD+6D,EAAgB,QAAAP,EAAAA,EAAOK,kBAAP,IAAAD,IAAAA,EAAmB/3B,UACnClhC,SAASq5D,cAAcR,EAAOK,WAAWh4B,UAE/C,OAAOi4B,GAAYC,CACtB,IACuDllD,QAAO,SAAC2kD,GAC5D,IAAKA,EAAOS,kBAAoBT,EAAOU,mBACnC,OAAO,EAEX,IAAMC,GAAkBX,EAAOS,iBACzB/4B,EAAKvC,SAASkF,aAAau2B,iBAAiBZ,EAAOS,iBAEnDI,GAAqBb,EAAOU,oBAC5Bh5B,EAAKvC,SAASkF,aAAau2B,iBAAiBZ,EAAOU,oBAEzD,OAAOC,GAAmBE,CAC7B,IAED,OAAO74C,EAAS+3C,EA7BpB,GA8BGJ,EACN,KAzDLD,CAAA,CAAA,GE/CMoB,GAAwB,CAC1B,mCAAoCvqB,GACpC,+BAAgC,UAGvBwqB,GAAb,WAAA,SAAAA,IAAAv9B,EAAAniC,KAAA0/D,GAAA7xB,EAAA7tC,KAAA,SACqC,CAAA,EADrC,CAAA,OAAA+pC,EAAA21B,EAAA,CAAA,CAAA/rD,IAAA,gBAAApT,MAGI,SAAco/D,GACV,IAAMC,EAAa5/D,KAAK6/D,OAAOF,GAAY,YAAa,EAExD,OAAmB,IAAfC,IAGG,IAAIxsD,MAAOozB,UAAYo5B,CACjC,GAVL,CAAAjsD,IAAA,gBAAApT,MAYI,SAAc2nC,GAAgC,IAAA/zB,EAAAnU,KAClB,MAApBkoC,EAASyW,QAIbx/C,OAAO4lB,QAAQ06C,IAAuBlqD,SAAQ,SAAwB+nC,GAAA,IAAA8R,EAAA3lB,EAAA6T,EAAA,GAAtBwiB,EAAsB1Q,EAAA,GAAduQ,EAAcvQ,EAAA,GAC5D2Q,EAAiB73B,EAAS83B,kBAAkBF,GAClD,GAAKC,EAAL,CAIA,IAAIE,EAAoBC,SAASH,EAAgB,IAKjD,GAJIrhD,MAAMuhD,KACNA,EAAoB,IAGpBA,EAAmB,CACnB,IAAME,EAAuC,IAApBF,EACzB9rD,EAAK0rD,OAAOF,IAAY,IAAIvsD,MAAOozB,UAAY25B,CAClD,CAVA,IAYR,KAjCLT,CAAA,CAAA,aDuDKxB,GAAAA,EAAAA,+BAAAA,EAAAA,gCAAAA,EAAAA,KAAAA,QAaL,IAAMkC,GAAS,aACTC,GAAc,CAAA,EAEdC,GAAwB,UAOxBC,GAAUzsD,GAAO05C,gBAAkB,oBAAqB,IAAIA,eAK9DgT,IAAoBD,KAA0C,IAA/B5pC,GAAUpyB,QAAQ,UAAoD,IAAlCoyB,GAAUpyB,QAAQ,WAEnFk8D,GAAgB,WAAA,IAAAC,EAAAC,EAAAC,EAAA,MAAsB,CACxCvM,SAAU,0BACVwM,WAAY,OACZC,cAAe,MACf1M,QAAS,KACTjsB,MAAO,GACP1E,aAAa,EACbs9B,WAAW,EACXC,wBAAoF,KAA5Dl7D,UAAA,QAAAA,EAAAA,GAAU0L,gBAAV,IAAAkvD,GAA8Bn8D,QAA9Bo8D,EAAAD,EAAoB5wB,gBAAUvrC,IAAAA,OAA9BuB,EAA8BvB,EAAAA,QAAQ,kBAC9D0/B,YAAa,SACbg9B,iBAAkB,GAClBC,YAAa,GACbC,OAAQf,GACRgB,cAAc,EACd7vB,uBAAwB,GACxB8vB,0BAA2B,GAC3BC,eAAe,EACfh9D,MAAM,EACNg6C,SAAS,EACTijB,kBAAkB,EAClBC,mBAAmB,EACnBC,OAAO,EACPC,kBAAmB,IACnBC,SAAS,EACTC,2BAA2B,EAC3BC,qBAAqB,EACrBC,gBAAgB,EAChBC,kCAA8Bl5D,EAC9Bm5D,cAA8C,YAA/BluD,UAAkBmuD,QAAlBnuD,EAAAA,GAAQtC,gBAAUywD,IAAAA,OAAlBnuD,EAAkBmuD,EAAAA,UACjCC,IAAI,EACJC,8BAA8B,EAC9BC,gCAAgC,EAChCC,mCAAoC,eACpCC,gCAAiC,KACjCC,kBAAkB,EAClBC,mBAAoB,GACpBC,aAAa,EACbC,oBAAqB,KACrBC,YAAa,CAtC2B,EAuCxCC,eAAgB,KAChBC,uBAAuB,EACvBC,kBAAkB,EAClBC,6BAA8B,MAC9BC,kBAAmB,CA3CqB,EA4CxCC,6BAA6B,EAC7BC,eAAe,EACfC,yBAAyB,EACzBC,gCAAgC,EAChCC,8CAA8C,EAC9CC,kCAAkC,EAClCC,aAAc,SAAChW,GACX,IAAMxsD,EAAQ,oBAAsBwsD,EAAI5O,OAAS,IAAM4O,EAAIiW,WAC3D/2D,QAAQ1L,MAAMA,EApDsB,EAsDxC0iE,cAAe,SAACC,GAAD,OAAUA,CAtDe,EAwDxCC,WAAYvD,GACZwD,yBAAqB/6D,EACrB7C,KAAM,UACN69D,YAAa,eACbC,UAAW,CA5D6B,EA6DxCC,qBAAqB,EACrBC,6BAA8B,KA9DZ,EAyEhBC,GAAe,SACjB97B,EACAd,EACArhC,EACAk+D,GAEA,IAAIpgC,EACE5xB,EACFlM,IAASs6D,IAA0BlC,GAAkCp4D,EAAOo4D,GAAep4D,QAAQ6C,EAA/Cu1D,GAClD+F,EAAmB,CACrBC,cAAc,EACdC,UAAU,GAERC,EAAiB,SAACC,GAAD,OAAiD,SAACzgC,GAChEqgC,EAAiBI,KAClBJ,EAAiBI,IAAgB,EAC7BJ,EAAiBC,cAAgBD,EAAiBE,WAClDH,SAAAA,EAAiBpgC,OAK7B,GAAI5xB,GAAUisD,KAAcD,GAASsG,YACjC1gC,EAAW5xB,MACR,CACH,GAAIA,IAAWkmB,GAASlmB,GAKpB,YAJAzF,QAAQ1L,MAAM,gCAAkCiF,GAMpD89B,EAAW,IAAI2gC,EAClB,CAmBD,GAjBA3gC,EAAS4gC,MAAMv8B,EAAOd,EAAQrhC,EAAMs+D,EAAe,iBACnDxgC,EAAS8a,QAAQ4B,mBAEjB1c,EAAS4S,iBAAmB,IAAItB,GAAiBtR,GACjDA,EAAS4S,iBAAiBE,0BAE1B9S,EAAS+a,eAAiB,IAAIrC,GAAuB1Y,GACrDA,EAAS+a,eAAe8lB,0BAEpB7gC,EAASK,WAAW,qCACpBL,EAAS8gC,gBAAgBC,+BAG7B/gC,EAASgb,qBAAuB,IAAIud,GAAkBv4B,GAEtDA,EAASkE,cAAgBlE,EAASK,WAAW,eAC7CV,GAAYI,yBAAyBC,GACjCL,GAAYG,sBAAuB,CACnCE,EAASkE,cAAgBlE,EAASK,WAAW,eAGxCV,GAAY4E,kBAAkBvE,EAASK,WAAW,SAFnC,IACQ,KAIhBV,GAAYgF,qBAIpBhF,GAAY7nB,KAAKkoB,IAHjBA,EAASkE,eAAgB,EACzB9S,GAAO+B,IAAI,gFAJX6M,EAASkE,eAAgB,EACzB9S,GAAO+B,IAAI,+DArDZ,CA4EP,OAZAZ,GAAOC,MAAQD,GAAOC,OAASwN,EAASK,WAAW,cAI7B,IAAXjyB,GAA0BkmB,GAASlmB,KAG1C4xB,EAASghC,eAAehlE,KAAKgkC,EAASihC,OAAS7yD,EAAe6yD,QAC9DjhC,EAASghC,eAAe5yD,IAG5BoyD,EAAe,WAAfA,CAA2BxgC,GACpBA,CACV,EAMY2gC,GAAb,WAuCI,SAAcA,IAAA,IAAAtwD,EAAAnU,KAAAmiC,EAAAniC,KAAAykE,GACVzkE,KAAKqnC,OAASo5B,KACdzgE,KAAK++C,YAAc,GACnB/+C,KAAK0rC,sBAAuB,EAC5B1rC,KAAKuzD,kBAAoBA,GACzBvzD,KAAKglE,mBAAqB,WAAA,OAAM5P,GAAyBjhD,IACzDnU,KAAKilE,eAAiB,GACtBjlE,KAAKklE,gBAAkB,GACvBllE,KAAKitC,UAAW,EAChBjtC,KAAKq3C,+BAA4BxuC,EACjC7I,KAAKgoC,mBAAgBn/B,EACrB7I,KAAKmlE,KAAO,aAEZnlE,KAAKgpC,aAAe,IAAIU,GAAoB1pC,MAC5CA,KAAK4+C,QAAU,IAAIW,GAAQv/C,MAC3BA,KAAK4kE,gBAAkB,IAAI3O,GAC3Bj2D,KAAKw+D,QAAU,IAAIH,GAAer+D,MAClCA,KAAKouD,YAAc,IAAIsR,GAGvB1/D,KAAK+kE,OAAS,CACV7wD,IAAK,SAACkC,EAA2BnV,EAAa0lB,GAC1C,IAAMy+C,EAA2B,iBAAThvD,EAAPy3B,EAAA,CAAA,EAA8Bz3B,EAAOnV,GAAOmV,EAC7DjC,EAAKkxD,oBAAoBD,GACzBz+C,SAAAA,EAAW,CAAA,EAJL,EAMV2+C,SAAU,SAAClvD,EAA2BnV,EAAa0lB,GAC/C,IAAMy+C,EAA2B,iBAAThvD,EAAPy3B,EAAA,CAAA,EAA8Bz3B,EAAOnV,GAAOmV,EAC7DjC,EAAKkxD,yBAAoBx8D,EAAWu8D,GACpCz+C,SAAAA,EAAW,CAAA,EACd,EArEb,CAAA,OAAAojB,EAAA06B,EAAA,CAAA,CAAA9wD,IAAA,OAAApT,MA2FI,SAAK4nC,EAAed,EAAiCrhC,GACjD,GAAIkxB,GAAalxB,GACbyG,QAAQ1L,MAAM,iEADlB,CAIA,GAAIiF,IAASs6D,GAAb,CAKA,IAAMx8B,EAAoBmgC,GAAa97B,EAAOd,EAAQrhC,GAAM,SAAC89B,GACzDs6B,GAAep4D,GAAQ89B,EACvBA,EAASyhC,SACZ,IAGD,OAFAnH,GAAep4D,GAAQ89B,EAEhBA,CARN,CAFGr3B,QAAQ1L,MAAM,6FAFjB,CA/FT,GAAA,CAAA4S,IAAA,QAAApT,MA2HI,SACI4nC,GAII,IAAAq9B,EAAAC,EAAAp/B,EAAArmC,KAHJqnC,yDAAiC,CAAA,EACjCrhC,EAEIvG,UAAAC,OAAA,EAAAD,UAAA,QAAAoJ,EADJu7D,EACI3kE,UAAAC,OAAA,EAAAD,UAAA,QAAAoJ,EACJ7I,KAAKitC,UAAW,EAChBjtC,KAAKqnC,OAAS,GACdrnC,KAAK0lE,kBAAoB,GAOzB,IA0BkDC,EA1B5CxB,EAAmB,CAAEyB,iBAAiB,EAAOvB,UAAU,GACvDwB,EAAqB,SAACtB,GAAD,OAAiD,WAInEJ,EAAiBI,KAClBJ,EAAiBI,IAAgB,EAC7BJ,EAAiByB,iBAAmBzB,EAAiBE,WACrDD,SAAAA,EAAe/9B,QAK3BrmC,KAAK8lE,WACD7tC,GAAQ,CAAD,EAAKwoC,KAAiBp5B,EAAQ,CACjCrhC,KAAMA,EACNmiC,MAAOA,EACP07B,aAAc79D,IAASs6D,GAAwBt6D,EAAOs6D,GAAwB,IAAMt6D,GAAQ,WAIpGhG,KAAKmlE,KAAO,aAKRrxD,kBAAA0xD,EAAA1xD,GAAQiiB,sBAAO3I,QAAUtZ,UAAAA,GAAQkiB,eAGjCh2B,KAAKq3C,0BAA4BvjC,UAAA,QAAAA,EAAAA,GAAQiiB,aAAR,IAAA4vC,OAAA7xD,EAAA6xD,EAAe1vC,SAmCpD,GAhCAj2B,KAAKikC,YAAc,IAAIoN,GAAmBrxC,KAAKqnC,QAE/CrnC,KAAK+lE,cAAgB,IAAIrjB,GAAa1iD,KAAKgmE,qBAAqBroD,KAAK3d,OACrEA,KAAKimE,YAAc,IAAI9X,GAAWnuD,KAAKmkC,WAAW,gBAAiBnkC,KAAKouD,aACxEpuD,KAAKilE,eAAiB,GACtBjlE,KAAKklE,gBAAkB,GAEvBllE,KAAK61C,eAAiB,IAAI8b,GAAiB3xD,KAAKqnC,OAAQrnC,KAAKikC,aAC7DjkC,KAAKkmE,mBAC2B,mBAA5BlmE,KAAKqnC,OAAOpD,YACNjkC,KAAKikC,YACL,IAAIoN,GAAJtC,EAAAA,EAAA,CAAA,EAA4B/uC,KAAKqnC,QAAjC,GAAA,CAAyCpD,YAAa,oBAEhEjkC,KAAKmmE,aAED9+B,EAAO++B,SAEPpmE,KAAKqnC,OAAOo8B,cAAgB,WAAA,OAAMp8B,EAAO++B,QAAQC,OAAO3Q,aAA5B,EAGxBruB,EAAO++B,QAAQC,OAAOz9D,OACtB5I,KAAKooC,SAAS,CACV2C,YAAa1D,EAAO++B,QAAQC,OAAOz9D,OAEvC5I,KAAKikC,YAAYqiC,eAAe,eAGpCj/B,EAAO++B,QAAQh+B,SAASpoC,KAAKglE,sBAAsBuB,KAAKV,EAAmB,qBAE3EA,EAAmB,kBAAnBA,QAGiCh9D,aAAjC48D,EAAAp+B,EAAOy8B,gCAAW0C,YAA0B,CAAA,IAAAC,EAAAC,EACtChD,EAAO1jE,KAAKmkC,WAAW,gBAAhBnkC,CAAiCqxD,MACxCsV,EAAW,QAAAt/B,EAAAA,EAAOy8B,iBAAP,IAAA2C,GAAAA,EAAkBG,eAAiBlD,EAAOr8B,EAAOy8B,UAAU0C,WAC5ExmE,KAAKikC,YAAYqiC,eAAiCM,QAAlBv/B,EAAAA,EAAOy8B,iBAAW8C,IAAAA,GAAAA,EAAAA,eAAiB,aAAe,aAClF5mE,KAAKooC,SAAS,CACV2C,YAAa1D,EAAOy8B,UAAU0C,WAC9BK,WAAYF,GAEnB,CAED,GAAI3mE,KAAKq+C,+BAAgC,CAAA,IAAAyoB,EAAAC,EAC/BC,EAAc7nE,OAAOqf,MAAK,UAAA6oB,EAAOy8B,iBAAP,IAAAgD,OAAA,EAAAA,EAAkB99B,eAAgB,CAAA,GAC7DhvB,QAAO,SAACu0B,GAAD,IAAA04B,EAAAC,EAAA,QAAW,QAAAD,EAAC5/B,EAAOy8B,iBAAR,IAAAmD,GAAC,QAADC,EAACD,EAAkBj+B,oBAAlB,IAAAk+B,IAAAA,EAAiC34B,GADrC,IAEfE,QACG,SAACC,EAAuC/6B,GAAxC,IAAAwzD,EAAAC,EAAA,OACK14B,EAAI/6B,IAAO,UAAA0zB,EAAOy8B,iBAAP,IAAAqD,GAAiCxzD,QAAjCyzD,EAAAD,EAAkBn+B,oBAAer1B,IAAAA,OAAjC,EAAiCA,EAAAA,MAAQ,EAAQ+6B,CAJrD,GAMZ,CANY,GAQd24B,EAAsBloE,OAAOqf,MAAK,UAAA6oB,EAAOy8B,iBAAP,IAAAiD,OAAA,EAAAA,EAAkBM,sBAAuB,CAAA,GAC5ErtD,QAAO,SAACrG,GAAD,OAASqzD,EAAYrzD,EADL,IAEvB86B,QAAO,SAACC,EAA+B/6B,GAAQ,IAAA2zD,EAAAC,EACMC,EAAAC,EAA9C,QAAApgC,EAAAA,EAAOy8B,iBAAP,IAAAwD,GAAA,QAAAC,EAAAD,EAAkBD,2BAAlB,IAAAE,GAAAA,EAAwC5zD,KACxC+6B,EAAI/6B,GAAJ,QAAA6zD,EAAWngC,EAAOy8B,iBAAlB,IAAA0D,GAAW,QAAXC,EAAWD,EAAkBH,2BAAlB,IAAAI,OAAX,EAAWA,EAAwC9zD,IAEvD,OAAO+6B,CANa,GAOrB,CAPqB,GAS5B1uC,KAAKgpC,aAAayC,qBAAqB,CAAEzC,aAAcg+B,EAAaK,oBAAAA,GACvE,CAED,IAAKrnE,KAAKgrC,kBAAmB,CAIzB,IAAM04B,EAAO1jE,KAAKmkC,WAAW,gBAAhBnkC,CAAiCqxD,MAC9CrxD,KAAK0nE,cACD,CACI38B,YAAa24B,EACbmD,WAAYnD,GAEhB,IAGJ1jE,KAAKikC,YAAYqiC,eAAe,YAtHhC,CA0HJxyD,GAAOrC,kBACHqC,GAAOrC,iBAAiB,eAAgBk2D,KAAO,WAAa,SAAU3nE,KAAK4nE,eAAejqD,KAAK3d,OAInG6lE,EAAmB,WAAnBA,EA/PR,GAAA,CAAAlyD,IAAA,UAAApT,MAoQI,WAII,IAAMsnE,EAAgB7nE,KAAKmkC,WAAW,2BACjC0jC,GACD7nE,KAAKgpC,aAAa2B,oBAAmB,GAGzC,IACI3qC,KAAKmkC,WAAW,SAAhBnkC,CAA0BA,KAD9B,CAEE,MAAOwM,GACLC,QAAQ1L,MAAM,2BAA4ByL,EAC7C,CAEDxM,KAAK8nE,2BAID9nE,KAAKmkC,WAAW,qBAChBnkC,KAAKmS,QAAQ,YAAa,CAAE2tC,MAAOh6C,GAASg6C,OAAS,CAAEkC,gBAAgB,IAMtE6lB,GACD,IAAIzpB,GAAOp+C,MAAMF,MAExB,GAjSL,CAAA6T,IAAA,2BAAApT,MAmSI,WAEiD,IAAAwnE,EADxC/nE,KAAKgoE,2BACFhoE,KAAKmkC,WAAW,8BACX4hC,EAAAA,KAAAA,8BAAetjB,OAG/B,GAzSL,CAAA9uC,IAAA,cAAApT,MA2SI,WAAoB,IAAAunC,EAAA9nC,KACXA,KAAKgoE,2BACN3wC,GAAWr3B,KAAKklE,iBAAiB,SAAC1qD,GAC9BstB,EAAKwD,cAADvrC,MAAA+nC,EAAAmgC,EAAkBztD,GACzB,IAGLxa,KAAKklE,gBAAkB,GAEvBllE,KAAK8nE,0BACR,GArTL,CAAAn0D,IAAA,oBAAApT,MAiUI,SAAkBomB,EAA4Bpb,GAC1C,GAAI2rB,GAAavQ,GACb,OAAO,KAGX,GAAI45C,GACA,OAAO,SAAUr4B,GACbvhB,EAASuhB,EAAU38B,IAMvB,IAAM28D,EAAMloE,KAAKmlE,KACXgD,EAAgB,GAAK98D,KAAKwyC,MAAsB,IAAhBxyC,KAAKs1B,UACrCynC,EAAkBpoE,KAAKmkC,WAAW,eAAiB,IAAMgkC,EAAgB,IAK/E,OAJAD,EAAIC,GAAiB,SAAUjgC,UACpBggC,EAAIC,GACXxhD,EAASuhB,EAAU38B,IAEhB68D,CAEd,GAvVL,CAAAz0D,IAAA,iBAAApT,MAyVI,WAAuB,IAAA8nE,EAAAC,EACdtoE,KAAKmkC,WAAW,qBAOjBnkC,KAAKmkC,WAAW,qBAAuBnkC,KAAKmkC,WAAW,sBACvDnkC,KAAKmS,QAAQ,sBAGZ4zD,EAAAA,KAAAA,8BAAewC,iBACftC,EAAAA,KAAAA,4BAAasC,UAXVvoE,KAAKmkC,WAAW,qBAAuBnkC,KAAKmkC,WAAW,sBACvDnkC,KAAKmS,QAAQ,aAAc,KAAM,CAAE2nC,UAAW,cAWzD,GAvWL,CAAAnmC,IAAA,uBAAApT,MAyWI,SAAqB4D,EAAaoH,EAA2B3D,GACzD,IAAM4gE,EAAWtiD,KAAKC,UAAU5a,GAChCvL,KAAKyoE,iCAAiCtkE,EAAKqkE,EAAU5gE,GAAWy4D,GAAaD,GAChF,GA5WL,CAAAzsD,IAAA,mCAAApT,MA8WI,SACI4D,EACAqkE,EACA5gE,EACA+e,GAEA,IAAyB+hD,EE9mB1B,SACH3pB,EACAypB,EACA5gE,GAEA,OAAIm3C,IAAgB+F,GAAY6jB,OAErB,CACHjd,GAASE,GAAQ4c,GAAW,CAAEhd,MAAO,WAChC5jD,GAFF,CAAA,EAAA,CAEWglD,MAAM,EAAMX,aAAc,CAAElN,YAAa+F,GAAY6jB,WAGhE,CAAC,CAAEp9D,KAAMquB,GAAc4uC,IAAa5gE,EAElD,CFgmBgC8gE,CAA+B1oE,KAAK++C,YErnB1C+F,GAAY6jB,QACxB7jB,GAAY6jB,OAEZ7jB,GAAY8jB,OFknBwDJ,EAAU5gE,GAArFihE,EAAAp/B,EAAAq/B,EAAA,GAAOv9D,EAAPs9D,EAAA,GAAaE,EAAbF,EAAA,GACA7oE,KAAKsrC,cAAcnnC,EAAKoH,EAAMw9D,EAAUpiD,EAC3C,GAtXL,CAAAhT,IAAA,gBAAApT,MAwXI,SAAc4D,EAAaoH,EAA2B3D,EAAyB+e,GAC3E,GAAK3mB,KAAKitC,UAAajtC,KAAKimE,YAG5B,GAAIjmE,KAAKouD,YAAYkB,cAAc1nD,EAAQoyC,WACnCh6C,KAAKmkC,WAAW,UAChB13B,QAAQC,KAAK,kEAKrB,GAAI8zD,GACAxgE,KAAKklE,gBAAgBpkE,KAAK,CAACqD,EAAKoH,EAAM3D,EAAS+e,QADnD,CAKA,IAAMqiD,EAAkB,CACpBz9B,OAAQvrC,KAAKmkC,WAAW,cACxB2V,UAAW95C,KAAKmkC,WAAW,iBAC3Bma,QAASt+C,KAAKmkC,WAAW,YAG7Bv8B,EAAUqwB,GAAQ+wC,EAAiBphE,GAAW,CAA7B,GACZ24D,KACD34D,EAAQ2jC,OAAS,OAGrB,IAAM09B,EAAgB,eAAgBn1D,GAAO4iB,WAAmC,eAAtB9uB,EAAQkyC,UAKlE,GAJA31C,EAAM6nD,GAAe7nD,EAAKyD,EAAQqkD,cAAgB,CAAA,EAAI,CAClDiW,GAAIliE,KAAKmkC,WAAW,QAGpB8kC,EAGA,IACIn1D,GAAO4iB,UAAUo2B,WAAW3oD,EAAKwoD,GAAephD,EAADwjC,EAAAA,EAAA,CAAA,EAAYnnC,GAAZ,CAAA,EAAA,CAAqBklD,YAAY,KADpF,CAEE,MAAOlsD,GAGR,MACE,GAAI2/D,GACP,IACIvT,GAAI,CACA7oD,IAAKA,EACLoH,KAAMA,EACN0hD,QAASjtD,KAAKmkC,WAAW,eACzBv8B,QAASA,EACT+e,SAAAA,EACAumC,sBAAuB,EACvBC,WAAYntD,KAAKimE,YACjB7Y,WAAYptD,KAAKmkC,WAAW,gBAC5BmpB,cAAettD,KAAKouD,YAAYoB,eAVxC,CAYE,MAAO5uD,GACL6L,QAAQ1L,MAAMH,EACjB,KACE,CAAA,IAAAsoE,EACGx5D,EAAS5J,GAASF,cAAc,UACtC8J,EAAO1N,KAAO,kBACd0N,EAAOy5D,OAAQ,EACfz5D,EAAO05D,OAAQ,EACf15D,EAAO/B,IAAMxJ,EACb,IAAM7E,EAAIwG,GAASujE,qBAAqB,UAAU,GAClD,QAAA/pE,EAAAA,EAAEmI,kBAAF,IAAAyhE,GAAAA,EAAcjsC,aAAavtB,EAAQpQ,EACtC,CAnDA,CAoDJ,GA1bL,CAAAqU,IAAA,iBAAApT,MAwcI,SAAe+oE,GAAiC,IACxCC,EADwCr7B,EAAAluC,KAEtCwpE,EAAkC,GAClCC,EAAkC,GAClCC,EAAsC,GAC5CryC,GAAWiyC,GAAO,SAAC9uD,GACXA,IACA+uD,EAAU/uD,EAAK,GACX4d,GAASmxC,GACTG,EAAgB5oE,KAAK0Z,GACE,mBAATA,EACZA,EAAa1a,KAAKouC,GACb9V,GAAS5d,IAAqB,UAAZ+uD,EACzBC,EAAY1oE,KAAK0Z,GAEjB4d,GAAS5d,KACuB,IAAhC+uD,EAAQhlE,QAAQ,YACkB,mBAA1B2pC,EAAaq7B,GAErBG,EAAgB5oE,KAAK0Z,GAErBivD,EAAY3oE,KAAK0Z,GAG5B,IAED,IAAMmvD,EAAU,SAAUC,EAA2B7xC,GACjDV,GACIuyC,GACA,SAAUpvD,GACN,GAAI4d,GAAS5d,EAAK,IAAK,CAEnB,IAAIqvD,EAAS9xC,EACbC,GAAMxd,GAAM,SAAU1a,GAClB+pE,EAASA,EAAO/pE,EAAK,IAAIC,MAAM8pE,EAAQ/pE,EAAKwB,MAAM,GACrD,GACJ,MAGGtB,KAAKwa,EAAK,IAAIza,MAAMC,KAAMwa,EAAKlZ,MAAM,GAZvC,GAeNy2B,IAIR4xC,EAAQH,EAAaxpE,MACrB2pE,EAAQF,EAAazpE,MACrB2pE,EAAQD,EAAiB1pE,KAC5B,GAzfL,CAAA2T,IAAA,+BAAApT,MA2fI,WAAwC,IAAAupE,EAAAC,EACpC,eACKD,EAAA9pE,KAAKqnC,OAAOy8B,gCAAW96B,eAAgB7pC,OAAOqf,KAAP,QAAAurD,EAAY/pE,KAAKqnC,OAAOy8B,iBAAxB,IAAAiG,OAAA,EAAYA,EAAuB/gC,cAActpC,OAAS,IAClG,CAEP,GAhgBL,CAAAiU,IAAA,OAAApT,MA8gBI,SAAKia,GACDxa,KAAK8kE,eAAe,CAACtqD,GACxB,GAhhBL,CAAA7G,IAAA,mBAAApT,MA4hBI,SAAiBm0D,EAAkBp1B,GAA+B,IAAA0qC,EACnCtN,QAA3BsN,EAAAhqE,KAAK8+C,4BAAsB4d,IAAAA,GAAAA,EAAAA,iBACvB,CAAChI,EAAU1uD,UAAM6C,OAAWA,OAAWA,EAAW6rD,GAClDp1B,EAEP,GAjiBL,CAAA3rB,IAAA,UAAApT,MAqjBI,SACImyC,EACApT,GAEoB,IADpB13B,yDAA0By4D,GAI1B,IAAKrgE,KAAKitC,WAAajtC,KAAKkmE,qBAAuBlmE,KAAK+lE,cACpD,OAAO7wC,GAAO0C,oBAAoB,mBAGtC,IjBlnBD,SAAsBy9B,EAAkB4U,GAC3C,IAAIC,GAAW,EAEf,IACI,IAAM/hC,EAAQktB,EAAQlxB,WAAW,SAC3B6c,EAAaqU,EAAQlxB,WAAW,eAChCsd,EAAkB4T,EAAQlxB,WAAW,sCACrCud,EAAoB2T,EAAQlxB,WAAW,yCAAsCt7B,EAC7EsI,EAAMkkD,EAAQlxB,WAAW,UAE3BgE,IAEA+hC,EAAWnpB,GAAY5Y,EAAO,CAC1B6Y,WAAAA,EACAS,gBAAAA,EACAC,kBAAAA,EACA5tC,OAAQ3C,IAbpB,CAgBE,MAAO3E,GACAy9D,GACDx9D,QAAQ1L,MAAM,4DAA8DyL,EAEnF,CACD,OAAO09D,CACV,CiBylBWC,CAAanqE,MAAM,GAAvB,CAKA,IAAM85C,GADNlyC,EAAUA,GAAWy4D,IACI,UAMzB,GALIvmB,IACAlyC,EAAQkyC,UAAYA,GAIpB5iB,GAAawb,IAAqC,iBAAfA,EACnCjmC,QAAQ1L,MAAM,kDAIlB,IAAIi6B,GAAarE,GAAW32B,KAAKmkC,WAAW,8BAA5C,CAKAnkC,KAAKkmE,mBAAmBkE,wBAEpBpqE,KAAKmkC,WAAW,iBAChBnkC,KAAKkmE,mBAAmBmE,yBAExBrqE,KAAKmkC,WAAW,kBAChBnkC,KAAKkmE,mBAAmBoE,uBAG5B,IAAI/+D,EAAsB,CACtBm4D,KAAMrS,KACNz7C,MAAO88B,EACPpT,WAAYt/B,KAAK41D,4BAA4BljB,EAAYpT,GAAc,CAAA,IAGxD,cAAfoT,IACAnnC,EAAI,KAAW3D,EAAO,KACtB2D,EAAI,UAAgB3D,EAAO,YAG/B2D,EAAO6tB,GACH7tB,EACA3D,EAAQmyC,YAAc,KAAO/5C,KAAKmkC,WAAW,kCAE5CzX,UAAY9kB,EAAQ8kB,WAAa,IAAItZ,KAEtCpT,KAAKmkC,WAAW,UAChBjP,GAAO+B,IAAI,kBAAmB1rB,GAElC,IAAMi9D,EAAWtiD,KAAKC,UAAU5a,GAE1BpH,EAAMnE,KAAKmkC,WAAW,aAAev8B,EAAQ2tC,UAAY,OAEzDg1B,EAAoB3iE,IAAYy4D,GActC,OAXIrgE,KAAKmkC,WAAW,qBACdomC,IAAqB3iE,EAAQoyC,WAC9BpyC,EAAQo6C,eAIThiD,KAAKyoE,iCAAiCtkE,EAAKqkE,EAAU5gE,GAFrD5H,KAAK+lE,cAAc/X,QAAQ7pD,EAAKoH,EAAM3D,GAK1C5H,KAAKwqE,oBAAoB93B,EAAYnnC,GAE9BA,CA3Ea,CASnB,CAmEJ,GAroBL,CAAAoI,IAAA,kBAAApT,MAuoBI,SAAgBomB,GACZ3mB,KAAKilE,eAAenkE,KAAK6lB,EAC5B,GAzoBL,CAAAhT,IAAA,sBAAApT,MA2oBI,SAAoBqe,EAAmB6rD,GACnCzqE,KAAKqnC,OAAOs8B,WAAW/kD,EAAW6rD,GAClCzyC,GAAMh4B,KAAKilE,gBAAgB,SAACt+C,GAAD,OAAcA,EAAS/H,EAAvB,GAC9B,GA9oBL,CAAAjL,IAAA,8BAAApT,MAgpBI,SAA4BmyC,EAAoBg4B,GAC5C,IAAK1qE,KAAKikC,cAAgBjkC,KAAKkmE,mBAC3B,OAAOwE,EAIX,IAAMC,EAAkB3qE,KAAKikC,YAAY2mC,mBAAmBl4B,GACxDpT,EAAkBorC,EAAAA,CAAAA,EAAAA,GAGtB,GAFAprC,EAAU,MAAYt/B,KAAKmkC,WAAW,SAEnB,cAAfuO,EAA4B,CAC5B,IAAMm4B,EAAgB97B,EAAAA,EAAA,CAAA,EAAQ/uC,KAAKikC,YAAY3E,cAAiBt/B,KAAKkmE,mBAAmB5mC,cAExF,OADAA,EAAU,YAAkBurC,EAAiB9/B,YACtCzL,CACV,CAED,IAAMwrC,EAAiB3tC,GAAMmC,aAE7B,GAAIt/B,KAAK61C,eAAgB,CACrB,IAAAk1B,EAAgC/qE,KAAK61C,eAAeqB,gCAA5CxB,IAAAA,UAAWD,IAAAA,SACnBnW,EAAU,YAAkBoW,EAC5BpW,EAAU,WAAiBmW,CAC9B,CAED,GAAIz1C,KAAKmkC,WAAW,oCAAqC,CACrD,IAAI6mC,EAA6C,CAAA,EAC9B,cAAft4B,EACAs4B,EAAwBhrE,KAAK4kE,gBAAgBqG,aACvB,eAAfv4B,IACPs4B,EAAwBhrE,KAAK4kE,gBAAgBsG,eAEjD5rC,EAAarH,GAAQqH,EAAY0rC,EACpC,CAMD,GAJmB,cAAft4B,IACApT,EAAU,MAAYx5B,GAASg6C,OAGhB,uBAAfpN,EAAqC,CACrC,IAAMm4B,EAAmB7qE,KAAKikC,YAAY3E,aAI1C,OAFAA,EAAU,YAAkBurC,EAAiB9/B,YAC7CzL,EAAU,aAAmBwrC,EAAejrC,aACrCP,CA3C2E,CA+CtF,QAA+B,IAApBqrC,EAAiC,CACxC,IAAMQ,GAAiB,IAAI/3D,MAAOozB,UAAYmkC,EAC9CrrC,EAAU,UAAgBnM,YAAYg4C,EAAiB,KAAMC,QAAQ,GAjDa,CAyDtF9rC,EAAarH,GACT,CAAA,EACAkF,GAAMmC,aACNt/B,KAAKikC,YAAY3E,aACjBt/B,KAAKkmE,mBAAmB5mC,aACxBA,GAGJ,IAAMkjC,EAAqBxiE,KAAKmkC,WAAW,sBACvC/L,GAASoqC,GACTxqC,GAAMwqC,GAAoB,SAAU6I,UACzB/rC,EAAW+rC,EACrB,IAED5+D,QAAQ1L,MAAM,gDAAkDyhE,GAGpE,IAAME,EAAsB1iE,KAAKmkC,WAAW,uBAK5C,OAJIu+B,IACApjC,EAAaojC,EAAoBpjC,EAAYoT,IAG1CpT,CACV,GAhuBL,CAAA3rB,IAAA,WAAApT,MAwvBI,SAAS++B,EAAwBkQ,GAAqB,IAAA87B,EAChCljC,QAAlBkjC,EAAAtrE,KAAKikC,mBAAamE,IAAAA,GAAAA,EAAAA,SAAS9I,EAAYkQ,EAC1C,GA1vBL,CAAA77B,IAAA,gBAAApT,MAmxBI,SAAc++B,EAAwB4S,EAA0B1C,GAAqB,IAAA+7B,UAC5EtnC,EAAAA,KAAAA,4BAAayjC,cAAcpoC,EAAY4S,EAAe1C,EAC9D,GArxBL,CAAA77B,IAAA,uBAAApT,MA8yBI,SAAqB++B,GAA8B,IAAAksC,EAC/C,QAAAA,EAAAxrE,KAAKkmE,0BAAL,IAAAsF,GAAAA,EAAyBpjC,SAAS9I,EACrC,GAhzBL,CAAA3rB,IAAA,aAAApT,MAuzBI,SAAWyP,GAAwB,IAAAy7D,EAC/B,QAAAA,EAAAzrE,KAAKikC,mBAAL,IAAAwnC,GAAAA,EAAkBv+B,WAAWl9B,EAChC,GAzzBL,CAAA2D,IAAA,yBAAApT,MAg0BI,SAAuByP,GAAwB,IAAA07D,EAC3C,QAAAA,EAAA1rE,KAAKkmE,0BAAL,IAAAwF,GAAAA,EAAyBx+B,WAAWl9B,EACvC,GAl0BL,CAAA2D,IAAA,mBAAApT,MAo0BI,SAAiB6V,EAAc7V,GAC3BP,KAAKooC,SAALyF,EAAA,CAAA,EAAiBz3B,EAAO7V,GAC3B,GAt0BL,CAAAoT,IAAA,iBAAApT,MAk1BI,SAAeoT,EAAa/L,GACxB,OAAO5H,KAAKgpC,aAAaoD,eAAez4B,EAAK/L,EAChD,GAp1BL,CAAA+L,IAAA,wBAAApT,MAk2BI,SAAsBoT,GAClB,IAAMoG,EAAU/Z,KAAKgpC,aAAa2iC,sBAAsBh4D,GACxD,IACI,OAAOuS,KAAK+L,MAAMlY,EADtB,CAEE,MAAM6xD,GACJ,OAAO7xD,CACV,CACJ,GAz2BL,CAAApG,IAAA,mBAAApT,MAq3BI,SAAiBoT,EAAa/L,GAC1B,OAAO5H,KAAKgpC,aAAau2B,iBAAiB5rD,EAAK/L,EAClD,GAv3BL,CAAA+L,IAAA,qBAAApT,MAy3BI,WACIP,KAAKgpC,aAAa4F,oBACrB,GA33BL,CAAAj7B,IAAA,qCAAApT,MA83BI,SAAmCoT,EAAa85B,GAC5CztC,KAAKgpC,aAAa6iC,mCAAmCl4D,EAAK85B,EAC7D,GAh4BL,CAAA95B,IAAA,yBAAApT,MAm4BI,SAAuBomB,GAAkE,IAA5BwnB,0DACzD,OAAOnuC,KAAKgpC,aAAa8iC,uBAAuBnlD,EAAUwnB,EAC7D,GAr4BL,CAAAx6B,IAAA,iBAAApT,MAm5BI,SAAeomB,GACX,OAAO3mB,KAAKgpC,aAAa+iC,eAAeplD,EAC3C,GAr5BL,CAAAhT,IAAA,cAAApT,MAo6BI,SAAYomB,GAAgD,IAAAqlD,EAAAC,EACxD,OAAA,QAAOD,EAAP,QAAOC,EAAAjsE,KAAK61C,sBAAZ,IAAAo2B,OAAA,EAAOA,EAAqBC,YAAYvlD,UAAxC,IAAAqlD,EAAAA,EAAsD,YACzD,GAt6BL,CAAAr4D,IAAA,aAAApT,MAy6BI,SAAWomB,GAAqD,IAA3B23C,0DACjCt+D,KAAKw+D,QAAQC,WAAW93C,EAAU23C,EACrC,GA36BL,CAAA3qD,IAAA,2BAAApT,MA86BI,SAAyBomB,GAAqD,IAA3B23C,0DAC/Ct+D,KAAKw+D,QAAQ2N,yBAAyBxlD,EAAU23C,EACnD,GAh7BL,CAAA3qD,IAAA,WAAApT,MAg+BI,SAAS6rE,EAA0BC,EAAkCC,GACjE,IAAKtsE,KAAKitC,WAAajtC,KAAKikC,YACxB,OAAO/O,GAAO0C,oBAAoB,oBAGtC,GAAKw0C,EAAL,CAKA,IAAMG,EAAuBvsE,KAAKgrC,kBAGlC,GAFAhrC,KAAKooC,SAAS,CAAEokC,SAAUJ,KAErBpsE,KAAKkqC,aAAa,cAAe,CAGlC,IAAMuiC,EAAYF,EAClBvsE,KAAK0nE,cACD,CACIgF,4BAA4B,EAC5B7F,WAAY4F,GAEhB,GAtBqG,CA2BzGL,IAAoBG,GAAwBH,IAAoBpsE,KAAKkqC,aAAa1H,MAClFxiC,KAAKktC,WAAW1K,IAChBxiC,KAAKooC,SAAS,CAAE2C,YAAaqhC,KAGjC,IAAMO,EAAyD,cAAtC3sE,KAAKikC,YAAY2oC,iBAItCR,IAAoBG,GAAwBI,GAC5C3sE,KAAKikC,YAAYqiC,eAAe,cAGhCtmE,KAAKguC,4BAA4Bq+B,GAAuB,CAAxD,GAA4D,GAE5DrsE,KAAKmS,QACD,YACA,CACI44B,YAAaqhC,EACb5hC,kBAAmB+hC,GAEvB,CAAEx+B,KAAMs+B,GAAuB,CAA/B,EAAmCQ,UAAWP,GAA2B,CAAA,IAI7EtsE,KAAKgpC,aAAa8jC,uBAAuBP,KAClCF,GAAuBC,IAE9BtsE,KAAKqlE,oBAAoBgH,EAAqBC,GAK9CF,IAAoBG,IACpBvsE,KAAK4uC,qBAEL5uC,KAAKktC,WAAW9J,IAvDnB,MAFG32B,QAAQ1L,MAAM,sDA2DrB,GAjiCL,CAAA4S,IAAA,sBAAApT,MA0iCI,SAAoB8rE,EAAkCC,IAC7CD,GAAwBC,KAK7BtsE,KAAKguC,4BAA4Bq+B,GAAuB,CAAA,GAExDrsE,KAAKmS,QAAQ,OAAQ,CAAE47B,KAAMs+B,GAAuB,CAA/B,EAAmCQ,UAAWP,GAA2B,CAAA,IACjG,GAnjCL,CAAA34D,IAAA,QAAApT,MA8jCI,SAAMuuC,EAAmBi+B,EAAkBC,GACvC,GAAKl+B,GAAci+B,EAAnB,CAKA,IAAME,EAAiBjtE,KAAKkrC,YAGxB+hC,EAAen+B,KAAei+B,GAC9B/sE,KAAKktE,6BAA6Bp+B,GAGtC9uC,KAAKooC,SAAS,CAAE+kC,QAAcF,EAAAA,EAAAA,CAAAA,EAAAA,GAAiBn+B,CAAAA,EAAAA,EAAAA,CAAAA,EAAAA,EAAYi+B,MAEvDC,IACAhtE,KAAKmS,QAAQ,iBAAkB,CAC3Bi7D,YAAat+B,EACbu+B,WAAYN,EACZO,WAAYN,IAEhBhtE,KAAKutE,2BAAL1/B,EAAA,CAAA,EAAmCiB,EAAYk+B,KAK/CC,EAAen+B,KAAei+B,GAAaC,GAC3ChtE,KAAK4uC,oBAvBR,MAFGniC,QAAQ1L,MAAM,oDA2BrB,GA3lCL,CAAA4S,IAAA,cAAApT,MAgmCI,WACIP,KAAKooC,SAAS,CAAE+kC,QAAS,CAAA,IACzBntE,KAAKktE,+BAGLltE,KAAK4uC,oBACR,GAtmCL,CAAAj7B,IAAA,8BAAApT,MA6mCI,SAA4B++B,GAAyD,IAAjCsP,6DAChD5uC,KAAKgpC,aAAagF,4BAA4B1O,EAAYsP,EAC7D,GA/mCL,CAAAj7B,IAAA,gCAAApT,MAinCI,WACIP,KAAKgpC,aAAawkC,+BACrB,GAnnCL,CAAA75D,IAAA,6BAAApT,MA6nCI,SAA2B++B,GAA6E,IAAjCsP,6DACnE5uC,KAAKgpC,aAAaukC,2BAA2BjuC,EAAYsP,EAC5D,GA/nCL,CAAAj7B,IAAA,+BAAApT,MAioCI,SAA6ByuC,GACzBhvC,KAAKgpC,aAAakkC,6BAA6Bl+B,EAClD,GAnoCL,CAAAr7B,IAAA,QAAApT,MAyoCI,SAAMktE,GAAiC,IAAAC,EAAAC,EAAAC,EAAAC,EACnC,IAAK7tE,KAAKitC,SACN,OAAO/X,GAAO0C,oBAAoB,iBAEtC,IAAM60C,EAAYzsE,KAAKkqC,aAAa,sBAC/BjG,EAAAA,KAAAA,4BAAahZ,gBACbi7C,EAAAA,KAAAA,mCAAoBj7C,QACzB,QAAA2iD,EAAA5tE,KAAKikC,mBAAL,IAAA2pC,GAAAA,EAAkBtH,eAAe,qBAC5BzwB,EAAAA,KAAAA,+BAAgBi4B,iBACrB,IAAMpK,EAAO1jE,KAAKmkC,WAAW,gBAAhBnkC,CAAiCqxD,MAC9CrxD,KAAK0nE,cACD,CACI38B,YAAa24B,EACbmD,WAAY4G,EAAkB/J,EAAO+I,GAEzC,GAEP,GA1pCL,CAAA94D,IAAA,kBAAApT,MA4qCI,WACI,OAAOP,KAAKkqC,aAAa,cAC5B,GA9qCL,CAAAv2B,IAAA,YAAApT,MAgrCI,WACI,OAAOP,KAAKkqC,aAAa,YAAc,CAAA,CAC1C,GAlrCL,CAAAv2B,IAAA,iBAAApT,MA2rCI,WAAyB,IAAAwtE,EAAAC,EACrB,OAAA,QAAOD,EAAP,QAAOC,EAAAhuE,KAAK61C,sBAAZ,IAAAm4B,OAAA,EAAOA,EAAqB92B,+BAA8B,GAAMxB,iBAAhE,IAAAq4B,EAAAA,EAA6E,EAChF,GA7rCL,CAAAp6D,IAAA,yBAAApT,MAssCI,SAAuBqH,GACnB,IAAK5H,KAAK61C,eACN,MAAO,GAEX,IAAMn0C,EAAO1B,KAAKqnC,OAAO+sB,SAAWp0D,KAAKqnC,OAAOgtB,SAChD4Z,EAA6CjuE,KAAK61C,eAAeqB,+BAA8B,GAAvFxB,IAAAA,UAAWid,IAAAA,sBACfxuD,EAAMzC,EAAO,WAAag0C,EAC9B,GAAI9tC,SAAAA,EAAS4sD,eAAiB7B,EAAuB,CAAA,IAAAub,EAC3CC,UAAYvmE,EAAAA,EAAQwmE,iCAAqB,GAC/C,IAAKzb,EACD,OAAOxuD,EAEX,IAAMkqE,EAAqBhjE,KAAKspC,IAC5BtpC,KAAKwyC,QAAO,IAAIzqC,MAAOozB,UAAYmsB,GAAyB,KAAQwb,EACpE,GAEJhqE,GAAG,MAAA5C,OAAU8sE,EAChB,CAED,OAAOlqE,CACV,GA1tCL,CAAAwP,IAAA,QAAApT,MAivCI,SAAM+tE,EAAev6D,GAIjB,OAAIu6D,IAAUtuE,KAAKkqC,aAAa3H,KAC5BrN,GAAOuC,SAAS,oEACR,IAGRP,GAAanjB,KACbA,EAAW/T,KAAKgrC,mBAEhBsjC,IAAUv6D,GACV/T,KAAKuuE,iBAAiB/rC,GAAc8rC,GAC7BtuE,KAAKmS,QAAQ,gBAAiB,CAAEm8D,MAAOA,EAAOvjC,YAAah3B,MAElEtH,QAAQ1L,MAAM,0DACdf,KAAKg2D,SAASsY,IACN,GAEf,GArwCL,CAAA36D,IAAA,aAAApT,MA44CI,SAAW8mC,GACP,IACuBmnC,EAAAC,EADjBC,EAAS3/B,EAAA,CAAA,EAAQ/uC,KAAKqnC,QACxB5O,GAAU4O,KACVpP,GAAQj4B,KAAKqnC,OAAQA,GAEhBrnC,KAAKmkC,WAAW,sBACjBnkC,KAAKqnC,OAAO45B,iBAAmBjhE,KAAKqnC,OAAO65B,aAE1ClhE,KAAKmkC,WAAW,yBACjBnkC,KAAKqnC,OAAOw6B,oBAAsB7hE,KAAKqnC,OAAOy6B,gBAGlD,QAAA0M,EAAAxuE,KAAKikC,mBAAL,IAAAuqC,GAAAA,EAAkB58B,cAAc5xC,KAAKqnC,QACrC,QAAAonC,EAAAzuE,KAAKkmE,0BAAL,IAAAuI,GAAAA,EAAyB78B,cAAc5xC,KAAKqnC,QAExCgJ,GAAWlB,gBAAiD,SAA/BkB,GAAWl6B,IAAI,cAC5CnW,KAAKqnC,OAAOo6B,OAAQ,GAEpBzhE,KAAKmkC,WAAW,WAChB9N,GAAOC,OAAQ,GAGft2B,KAAK02C,uBAAgE,IAArCrP,EAAOu6B,2BACnC8M,EAAU9M,4BAA8Bv6B,EAAOu6B,4BAC3Cv6B,EAAOu6B,0BACP5hE,KAAK02C,iBAAiBV,gBAEtBh2C,KAAK02C,iBAAiBE,2BAKzC,GA56CL,CAAAjjC,IAAA,wBAAApT,MAk7CI,WACIP,KAAK8lE,WAAW,CAAElE,2BAA2B,GAChD,GAp7CL,CAAAjuD,IAAA,uBAAApT,MA07CI,WACIP,KAAK8lE,WAAW,CAAElE,2BAA2B,GAChD,GA57CL,CAAAjuD,IAAA,0BAAApT,MAk8CI,WAAmC,IAAAouE,EAC/B,kBAAS3uE,KAAK02C,gCAALi4B,EAAuBC,UACnC,GAp8CL,CAAAj7D,IAAA,cAAApT,MA28CI,SAAYg9B,GACR,OAAOv9B,KAAK4+C,QAAQc,YAAYniB,EACnC,GA78CL,CAAA5pB,IAAA,aAAApT,MAk9CI,SAA0CsuE,GAAgC,IAAA9mC,EACtE,OAAO,QAAPA,EAAO/nC,KAAKqnC,cAAL,IAAAU,OAAA,EAAAA,EAAc8mC,EACxB,GAp9CL,CAAAl7D,IAAA,eAAApT,MAw+CI,SAAauuE,GAA6C,IAAAC,EACtD,OAAA,QAAAA,EAAO/uE,KAAKikC,mBAAZ,IAAA8qC,OAAA,EAAOA,EAAA,MAA4BD,EACtC,GA1+CL,CAAAn7D,IAAA,qBAAApT,MA+/CI,SAAmBuuE,GAA6C,IAAAE,EAC5D,OAAA,QAAAA,EAAOhvE,KAAKkmE,0BAAZ,IAAA8I,OAAA,EAAOA,EAAA,MAAmCF,EAC7C,GAjgDL,CAAAn7D,IAAA,WAAApT,MAmgDI,WAAmB,IAAA0uE,EACXjpE,YAAOhG,KAAKmkC,WAAW,uBAAWm8B,GAItC,OAHIt6D,IAASs6D,KACTt6D,EAAOs6D,GAAwB,IAAMt6D,GAElCA,CAxgDf,GAAA,CAAA2N,IAAA,aAAApT,MA4gDI,WACgG,iBAA1DP,KAAKmkC,WAAW,uCAGjBkM,GAAWlB,kBACnCnvC,KAAKkvE,0BAA4BlvE,KAAKkvE,uBAAuB,CAAEC,iBAAkB,YAClFnvE,KAAKovE,iBAAiB,CAAEC,oBAAoB,KAE3CrvE,KAAKgoE,2BAA6BhoE,KAAKgoE,wBAAwB,CAAEmH,iBAAkB,YACpFnvE,KAAKsvE,kBAAkB,CAAEC,mBAAmB,IAEhDvvE,KAAKwvE,2BAA2B,CAC5BL,iBAAkB,SAClBE,oBAAoB,KAKxBrvE,KAAKgoE,0BACLhoE,KAAKyvE,yBAAyB,CAAEF,mBAAmB,IAMlDvvE,KAAKkvE,2BACLlvE,KAAKmkC,WAAW,kCAAmC+K,GAAY/4B,IAAI,eAEpE+4B,GAAY3pB,OAAO,aACnBvlB,KAAKsvE,kBAAkB,CACnBC,kBAAmBvvE,KAAKmkC,WAAW,oCAG9C,GA7iDL,CAAAxwB,IAAA,2BAAApT,MAqjDI,SAAyBqH,GAAkD,IAAA8nE,EAAAC,EACnE59B,EASoF69B,EAGOC,EAX/F,GAAIjoE,GAAWA,EAAO,kBAClBmqC,GAAW,MACR,KAAInqC,IAAWA,EAAO,mBAGzB,OAFAmqC,GAAW,CAGd,CAEI/xC,KAAKmkC,WAAW,yBAA0B,QAAAurC,EAAA1vE,KAAKikC,mBAAL,IAAAyrC,OAAA,EAAAA,EAAkB39B,YAAaA,IAC1E,QAAA69B,EAAA5vE,KAAKikC,mBAAL,IAAA2rC,GAAAA,EAAkBr9B,aAAaR,IAE9B/xC,KAAKmkC,WAAW,yBAA0B,QAAAwrC,EAAA3vE,KAAKkmE,0BAAL,IAAAyJ,OAAA,EAAAA,EAAyB59B,YAAaA,IACjF,QAAA89B,EAAA7vE,KAAKkmE,0BAAL,IAAA2J,GAAAA,EAAyBt9B,aAAaR,GAnkDlD,GAAA,CAAAp+B,IAAA,kBAAApT,MAwkDI,SACIuS,EACAlL,GAmBA,OAjBAA,EAAUqwB,GACN,CACI9lB,QAASnS,KAAKmS,QAAQwL,KAAK3d,MAC3BmvE,iBAAkBnvE,KAAKmkC,WAAW,sCAClC2rC,cAAe9vE,KAAKmkC,WAAW,mCAC/Bu9B,kBAAmB1hE,KAAKmkC,WAAW,qBACnC68B,uBAAwBhhE,KAAKmkC,WAAW,0BACxC69B,cAAehiE,KAAKmkC,WAAW,kBAEnCv8B,GAAW,CAAA,GAIVyoC,GAAWlB,gBAAkD,iBAAhCvnC,EAAO,mBACrCA,EAAO,iBAAuB,UAG3BkL,EAAK9S,KAAKmkC,WAAW,SAAU,CAClChyB,QAASvK,EAAO,QAChBk6C,iBAAkBl6C,EAAO,mBACzBm6C,kBAAmBn6C,EAAO,mBAC1B65C,gBAAiB75C,EAAO,iBACxB85C,kBAAmB95C,EAAO,cAC1Bg6C,iBAAkBh6C,EAAO,kBACzB45C,qBAAsB55C,EAAO,uBAC7Bi6C,aAAcj6C,EAAO,eAE5B,GAvmDL,CAAA+L,IAAA,mBAAApT,MAsoDI,SAAiBqH,GACbA,EAAUqwB,GACN,CACIo3C,oBAAoB,GAExBznE,GAAW,CAAA,GAGf5H,KAAK+vE,gBAAgBrvB,GAAO94C,GAC5B5H,KAAKyvE,yBAAyB7nE,EACjC,GAhpDL,CAAA+L,IAAA,oBAAApT,MAwqDI,SAAkBqH,GACd,IAAMmhE,EAAW9wC,GACb,CACIs3C,mBAAmB,GAEvB3nE,GAAW,CAAA,GAGf5H,KAAK+vE,gBAAgBnvB,GAAQmoB,GAC7B/oE,KAAKyvE,yBAAyB1G,EACjC,GAlrDL,CAAAp1D,IAAA,yBAAApT,MAisDI,SAAuBqH,GACnB,OAAO5H,KAAK+vE,gBAAgBlvB,GAAYj5C,EAC3C,GAnsDL,CAAA+L,IAAA,0BAAApT,MAktDI,SAAwBqH,GACpB,OAAO5H,KAAK+vE,gBAAgBhvB,GAAan5C,EAC5C,GAptDL,CAAA+L,IAAA,6BAAApT,MA6uDI,SAA2BqH,GACvB,IAAMmhE,EAA8C9wC,GAChD,CACIo3C,oBAAoB,GAExBznE,QAAAA,EAAW,CAAA,GAEf5H,KAAK+vE,gBAAgB1uB,GAAe0nB,GACpC/oE,KAAKyvE,yBAAyB1G,EACjC,GAtvDL,CAAAp1D,IAAA,QAAApT,MAwvDI,SAAMkhE,IACY,IAAVA,GACA3tD,GAAOrH,QAAQwqB,IAAI,+BACnBsZ,cAAgBA,aAAaG,WAAW,YACxC1wC,KAAK8lE,WAAW,CAAErE,OAAO,MAEzB3tD,GAAOrH,QAAQwqB,IACX,qIAEJsZ,cAAgBA,aAAaE,QAAQ,WAAY,QACjDzwC,KAAK8lE,WAAW,CAAErE,OAAO,IAEhC,KApwDLgD,CAAA,CAAA,I/B+B+B,SAAUuL,EAAiBC,GACtD,IAAK,IAAI1wE,EAAI,EAAGA,EAAI0wE,EAAUvwE,OAAQH,IAClCywE,EAAMpwE,UAAUqwE,EAAU1wE,IAAMs5B,GAAUm3C,EAAMpwE,UAAUqwE,EAAU1wE,IAE3E,C+BouDD2wE,CAAgBzL,GAAS,CAAC,aAE1B,IAAM0L,GAAqC,CAAA,EAUrCC,GAAwB,WAG1BhS,GAAc,KAAW,SAAUj2B,EAAgBd,EAAiCrhC,GAChF,GAAIA,EAaA,OAXKo4D,GAAep4D,KAChBo4D,GAAep4D,GAAQmqE,GAAUnqE,GAAQi+D,GACrC97B,GAAS,GACTd,GAAU,CAAA,EACVrhC,GACA,SAAC89B,GACGs6B,GAAep4D,GAAQmqE,GAAUnqE,GAAQ89B,EACzCA,EAASyhC,SACZ,KAGFnH,GAAep4D,GAEtB,IAAI89B,EAAoBs6B,GAmBxB,OAjBI+R,GAAU7P,IAEVx8B,EAAWqsC,GAAU7P,IACdn4B,IAEPrE,EAAWmgC,GAAa97B,EAAOd,GAAU,CAAA,EAAIi5B,IAAuB,SAACx8B,GACjEqsC,GAAU7P,IAAyBx8B,EACnCA,EAASyhC,SACZ,IACD4K,GAAU7P,IAAyBx8B,GAGrCs6B,GAAyBt6B,EACvBq6B,KAAcD,GAASmS,eACrBv8D,GAAewsD,IAAyBlC,IA1CtDpmC,GAAMm4C,IAAW,SAAUrsC,EAAU99B,GAC7BA,IAASs6D,KACTlC,GAAep4D,GAAQ89B,EAE9B,IAyCcA,EAGlB,EAEKwsC,GAAyB,WAE3B,SAASC,IAEAA,EAA2B/vE,OAG9B+vE,EAA2B/vE,MAAO,EAEpCggE,IAAmB,EAEnBxoC,GAAMm4C,IAAW,SAAUK,GACvBA,EAAKC,aACR,IACJ,CAEG3qE,GAAS2L,mBACmB,aAAxB3L,GAASuL,WAKTk/D,IAEAzqE,GAAS2L,iBAAiB,mBAAoB8+D,GAAoB,IAK1E50C,GAAgB7nB,GAAQ,OAAQy8D,GAAoB,EACvD,EAGGpS,GAAYD,GAASmS,aACjBn5C,GAAcpjB,GAAeuhD,WAC3BvhD,GAAeuhD,QAAU,KAE/B+I,GAAkBtqD,GAAeuhD,SAEf,UAAiB+I,GAAc,QAAcA,GAAc,YAEzE3xD,QAAQ1L,MAAM,+DAKlBi3B,GAAMomC,GAAc,IAAQ,SAAU5jD,GAC9BA,GAAQ4d,GAAS5d,KACjB21D,GAAU31D,EAAK,IAAMypD,GAAYlkE,WAAIya,EAAAA,EAAAA,IAE5C,IAED41D,KACEhS,GAAc,OAGhBpmC,GAAMm4C,IAAW,SAAUrsC,GACvBA,EAASyhC,SACZ,IAED+K"}
1
+ {"version":3,"file":"array.full.js","sources":["../node_modules/rrweb-v1/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/ext/tslib/tslib.es6.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/types.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/utils.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/mutation.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observer.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../node_modules/rrweb-v1/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/index.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/error-stack-parser.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/stringify.js","../node_modules/rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record/index.js","../src/loader-recorder.ts","../src/config.ts","../src/utils.ts","../src/autocapture-utils.ts","../src/extensions/rageclick.ts","../src/constants.ts","../src/autocapture.ts","../src/posthog-featureflags.ts","../src/storage.ts","../src/posthog-persistence.ts","../src/extensions/sessionrecording-utils.ts","../src/extensions/sessionrecording.ts","../src/extensions/web-performance.ts","../src/decide.ts","../src/extensions/cloud.ts","../src/extensions/toolbar.ts","../src/gdpr-utils.ts","../src/base-request-queue.ts","../src/request-queue.ts","../node_modules/fflate/esm/browser.js","../src/types.ts","../src/send-request.ts","../src/retry-queue.ts","../src/uuidv7.ts","../src/sessionid.ts","../src/extensions/sentry-integration.ts","../src/extensions/segment-integration.ts","../src/page-view.ts","../src/extensions/exceptions/type-checking.ts","../src/extensions/exceptions/stack-trace.ts","../src/extensions/exceptions/error-conversion.ts","../src/extensions/exceptions/exception-autocapture.ts","../src/posthog-surveys.ts","../src/posthog-core.ts","../src/rate-limiter.ts","../src/compression.ts"],"sourcesContent":["var NodeType;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n var _a;\n var host = (_a = n) === null || _a === void 0 ? void 0 : _a.host;\n return Boolean(host && host.shadowRoot && host.shadowRoot === n);\n}\nfunction maskInputValue(_a) {\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\n var text = value || '';\n if (maskInputOptions[tagName.toLowerCase()] ||\n maskInputOptions[type]) {\n if (maskInputFn) {\n text = maskInputFn(text);\n }\n else {\n text = '*'.repeat(text.length);\n }\n }\n return text;\n}\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\nfunction is2DCanvasBlank(canvas) {\n var ctx = canvas.getContext('2d');\n if (!ctx)\n return true;\n var chunkSize = 50;\n for (var x = 0; x < canvas.width; x += chunkSize) {\n for (var y = 0; y < canvas.height; y += chunkSize) {\n var getImageData = ctx.getImageData;\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\n return false;\n }\n }\n return true;\n}\n\nvar _id = 1;\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\nvar IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n var processedTagName = element.tagName.toLowerCase().trim();\n if (tagNameRegex.test(processedTagName)) {\n return 'div';\n }\n return processedTagName;\n}\nfunction getCssRulesString(s) {\n try {\n var rules = s.rules || s.cssRules;\n return rules ? Array.from(rules).map(getCssRuleString).join('') : null;\n }\n catch (error) {\n return null;\n }\n}\nfunction getCssRuleString(rule) {\n var cssStringified = rule.cssText;\n if (isCSSImportRule(rule)) {\n try {\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\n }\n catch (_a) {\n }\n }\n return cssStringified;\n}\nfunction isCSSImportRule(rule) {\n return 'styleSheet' in rule;\n}\nfunction stringifyStyleSheet(sheet) {\n return sheet.cssRules\n ? Array.from(sheet.cssRules)\n .map(function (rule) { return rule.cssText || ''; })\n .join('')\n : '';\n}\nfunction extractOrigin(url) {\n var origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n }\n else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\nvar canvasService;\nvar canvasCtx;\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absoluteToStylesheet(cssText, href) {\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\n var filePath = path1 || path2 || path3;\n var maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (!RELATIVE_PATH.test(filePath)) {\n return \"url(\" + maybeQuote + filePath + maybeQuote + \")\";\n }\n if (DATA_URI.test(filePath)) {\n return \"url(\" + maybeQuote + filePath + maybeQuote + \")\";\n }\n if (filePath[0] === '/') {\n return \"url(\" + maybeQuote + (extractOrigin(href) + filePath) + maybeQuote + \")\";\n }\n var stack = href.split('/');\n var parts = filePath.split('/');\n stack.pop();\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\n var part = parts_1[_i];\n if (part === '.') {\n continue;\n }\n else if (part === '..') {\n stack.pop();\n }\n else {\n stack.push(part);\n }\n }\n return \"url(\" + maybeQuote + stack.join('/') + maybeQuote + \")\";\n });\n}\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n var pos = 0;\n function collectCharacters(regEx) {\n var chars;\n var match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n var output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n var url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n }\n else {\n var descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n var inParens = false;\n while (true) {\n var c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (c === '(') {\n inParens = true;\n }\n }\n else {\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n var a = doc.createElement('a');\n a.href = attributeValue;\n return a.href;\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\n}\nfunction getHref() {\n var a = document.createElement('a');\n a.href = '';\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value) {\n if (name === 'src' || (name === 'href' && value)) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'xlink:href' && value && value[0] !== '#') {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'background' &&\n value &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'srcset' && value) {\n return getAbsoluteSrcsetString(doc, value);\n }\n else if (name === 'style' && value) {\n return absoluteToStylesheet(value, getHref());\n }\n else if (tagName === 'object' && name === 'data' && value) {\n return absoluteToDoc(doc, value);\n }\n else {\n return value;\n }\n}\nfunction _isBlockedElement(element, blockClass, blockSelector) {\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n }\n else {\n for (var eIndex = 0; eIndex < element.classList.length; eIndex++) {\n var className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n return false;\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\n if (!node) {\n return false;\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n if (typeof maskTextClass === 'string') {\n if (node.classList.contains(maskTextClass)) {\n return true;\n }\n }\n else {\n for (var eIndex = 0; eIndex < node.classList.length; eIndex++) {\n var className = node.classList[eIndex];\n if (maskTextClass.test(className)) {\n return true;\n }\n }\n }\n if (maskTextSelector) {\n if (node.matches(maskTextSelector)) {\n return true;\n }\n }\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n }\n if (node.nodeType === node.TEXT_NODE) {\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n }\n return needMaskingText(node.parentNode, maskTextClass, maskTextSelector);\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n var win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n var fired = false;\n var readyState;\n try {\n readyState = win.document.readyState;\n }\n catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n var timer_1 = setTimeout(function () {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', function () {\n clearTimeout(timer_1);\n fired = true;\n listener();\n });\n return;\n }\n var blankUrl = 'about:blank';\n if (win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === '') {\n setTimeout(listener, 0);\n return;\n }\n iframeEl.addEventListener('load', listener);\n}\nfunction serializeNode(n, options) {\n var _a;\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _b = options.maskInputOptions, maskInputOptions = _b === void 0 ? {} : _b, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _c = options.dataURLOptions, dataURLOptions = _c === void 0 ? {} : _c, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn;\n var rootId;\n if (doc.__sn) {\n var docId = doc.__sn.id;\n rootId = docId === 1 ? undefined : docId;\n }\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== 'CSS1Compat') {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: n.compatMode,\n rootId: rootId\n };\n }\n else {\n return {\n type: NodeType.Document,\n childNodes: [],\n rootId: rootId\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId: rootId\n };\n case n.ELEMENT_NODE:\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\n var tagName = getValidTagName(n);\n var attributes_1 = {};\n for (var _i = 0, _d = Array.from(n.attributes); _i < _d.length; _i++) {\n var _e = _d[_i], name_1 = _e.name, value = _e.value;\n attributes_1[name_1] = transformAttribute(doc, tagName, name_1, value);\n }\n if (tagName === 'link' && inlineStylesheet) {\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\n return s.href === n.href;\n });\n var cssText = null;\n if (stylesheet) {\n cssText = getCssRulesString(stylesheet);\n }\n if (cssText) {\n delete attributes_1.rel;\n delete attributes_1.href;\n attributes_1._cssText = absoluteToStylesheet(cssText, stylesheet.href);\n }\n }\n if (tagName === 'style' &&\n n.sheet &&\n !(n.innerText ||\n n.textContent ||\n '').trim().length) {\n var cssText = getCssRulesString(n.sheet);\n if (cssText) {\n attributes_1._cssText = absoluteToStylesheet(cssText, getHref());\n }\n }\n if (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select') {\n var value = n.value;\n if (attributes_1.type !== 'radio' &&\n attributes_1.type !== 'checkbox' &&\n attributes_1.type !== 'submit' &&\n attributes_1.type !== 'button' &&\n value) {\n attributes_1.value = maskInputValue({\n type: attributes_1.type,\n tagName: tagName,\n value: value,\n maskInputOptions: maskInputOptions,\n maskInputFn: maskInputFn\n });\n }\n else if (n.checked) {\n attributes_1.checked = n.checked;\n }\n }\n if (tagName === 'option') {\n if (n.selected && !maskInputOptions['select']) {\n attributes_1.selected = true;\n }\n else {\n delete attributes_1.selected;\n }\n }\n if (tagName === 'canvas' && recordCanvas) {\n if (n.__context === '2d') {\n if (!is2DCanvasBlank(n)) {\n attributes_1.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n }\n else if (!('__context' in n)) {\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n var blankCanvas = document.createElement('canvas');\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes_1.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n var image_1 = n;\n var oldValue_1 = image_1.crossOrigin;\n image_1.crossOrigin = 'anonymous';\n var recordInlineImage = function () {\n try {\n canvasService.width = image_1.naturalWidth;\n canvasService.height = image_1.naturalHeight;\n canvasCtx.drawImage(image_1, 0, 0);\n attributes_1.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n catch (err) {\n console.warn(\"Cannot inline img src=\" + image_1.currentSrc + \"! Error: \" + err);\n }\n oldValue_1\n ? (attributes_1.crossOrigin = oldValue_1)\n : delete attributes_1.crossOrigin;\n };\n if (image_1.complete && image_1.naturalWidth !== 0)\n recordInlineImage();\n else\n image_1.onload = recordInlineImage;\n }\n if (tagName === 'audio' || tagName === 'video') {\n attributes_1.rr_mediaState = n.paused\n ? 'paused'\n : 'played';\n attributes_1.rr_mediaCurrentTime = n.currentTime;\n }\n if (n.scrollLeft) {\n attributes_1.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes_1.rr_scrollTop = n.scrollTop;\n }\n if (needBlock) {\n var _f = n.getBoundingClientRect(), width = _f.width, height = _f.height;\n attributes_1 = {\n \"class\": attributes_1[\"class\"],\n rr_width: width + \"px\",\n rr_height: height + \"px\"\n };\n }\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes_1.src)) {\n if (!n.contentDocument) {\n attributes_1.rr_src = attributes_1.src;\n }\n delete attributes_1.src;\n }\n return {\n type: NodeType.Element,\n tagName: tagName,\n attributes: attributes_1,\n childNodes: [],\n isSVG: isSVGElement(n) || undefined,\n needBlock: needBlock,\n rootId: rootId\n };\n case n.TEXT_NODE:\n var parentTagName = n.parentNode && n.parentNode.tagName;\n var textContent = n.textContent;\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\n if (isStyle && textContent) {\n try {\n if (n.nextSibling || n.previousSibling) {\n }\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\n textContent = stringifyStyleSheet(n.parentNode.sheet);\n }\n }\n catch (err) {\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \" + err, n);\n }\n textContent = absoluteToStylesheet(textContent, getHref());\n }\n if (isScript) {\n textContent = 'SCRIPT_PLACEHOLDER';\n }\n if (!isStyle &&\n !isScript &&\n needMaskingText(n, maskTextClass, maskTextSelector) &&\n textContent) {\n textContent = maskTextFn\n ? maskTextFn(textContent)\n : textContent.replace(/[\\S]/g, '*');\n }\n return {\n type: NodeType.Text,\n textContent: textContent || '',\n isStyle: isStyle,\n rootId: rootId\n };\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: '',\n rootId: rootId\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: n.textContent || '',\n rootId: rootId\n };\n default:\n return false;\n }\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === undefined) {\n return '';\n }\n else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n return true;\n }\n else if (sn.type === NodeType.Element) {\n if (slimDOMOptions.script &&\n (sn.tagName === 'script' ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'preload' &&\n sn.attributes.as === 'script') ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n sn.attributes.href.endsWith('.js')))) {\n return true;\n }\n else if (slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\n return true;\n }\n else if (sn.tagName === 'meta') {\n if (slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n }\n else if (slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\n return true;\n }\n else if (slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\n return true;\n }\n else if (slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined) {\n return true;\n }\n else if (slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n }\n else if (slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n var doc = options.doc, map = options.map, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, _h = options.keepIframeSrcFn, keepIframeSrcFn = _h === void 0 ? function () { return false; } : _h;\n var _j = options.preserveWhiteSpace, preserveWhiteSpace = _j === void 0 ? true : _j;\n var _serializedNode = serializeNode(n, {\n doc: doc,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n keepIframeSrcFn: keepIframeSrcFn\n });\n if (!_serializedNode) {\n console.warn(n, 'not serialized');\n return null;\n }\n var id;\n if ('__sn' in n) {\n id = n.__sn.id;\n }\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType.Text &&\n !_serializedNode.isStyle &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\n id = IGNORED_NODE;\n }\n else {\n id = genId();\n }\n var serializedNode = Object.assign(_serializedNode, { id: id });\n n.__sn = serializedNode;\n if (id === IGNORED_NODE) {\n return null;\n }\n map[id] = n;\n if (onSerialize) {\n onSerialize(n);\n }\n var recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n if (n.shadowRoot)\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType.Document ||\n serializedNode.type === NodeType.Element) &&\n recordChild) {\n if (slimDOMOptions.headWhitespace &&\n _serializedNode.type === NodeType.Element &&\n _serializedNode.tagName === 'head') {\n preserveWhiteSpace = false;\n }\n var bypassOptions = {\n doc: doc,\n map: map,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: skipChild,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n };\n for (var _i = 0, _k = Array.from(n.childNodes); _i < _k.length; _i++) {\n var childN = _k[_i];\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n if (isElement(n) && n.shadowRoot) {\n for (var _l = 0, _m = Array.from(n.shadowRoot.childNodes); _l < _m.length; _l++) {\n var childN = _m[_l];\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedChildNode.isShadow = true;\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n if (n.parentNode && isShadowRoot(n.parentNode)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'iframe') {\n onceIframeLoaded(n, function () {\n var iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n map: map,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: false,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n });\n if (serializedIframeNode) {\n onIframeLoad(n, serializedIframeNode);\n }\n }\n }, iframeLoadTimeout);\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n var _a = options || {}, _b = _a.blockClass, blockClass = _b === void 0 ? 'rr-block' : _b, _c = _a.blockSelector, blockSelector = _c === void 0 ? null : _c, _d = _a.maskTextClass, maskTextClass = _d === void 0 ? 'rr-mask' : _d, _e = _a.maskTextSelector, maskTextSelector = _e === void 0 ? null : _e, _f = _a.inlineStylesheet, inlineStylesheet = _f === void 0 ? true : _f, _g = _a.inlineImages, inlineImages = _g === void 0 ? false : _g, _h = _a.recordCanvas, recordCanvas = _h === void 0 ? false : _h, _j = _a.maskAllInputs, maskAllInputs = _j === void 0 ? false : _j, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _k = _a.slimDOM, slimDOM = _k === void 0 ? false : _k, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, _l = _a.keepIframeSrcFn, keepIframeSrcFn = _l === void 0 ? function () { return false; } : _l;\n var idNodeMap = {};\n var maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n }\n : maskAllInputs === false\n ? {\n password: true\n }\n : maskAllInputs;\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\n ?\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all',\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return [\n serializeNodeWithId(n, {\n doc: n,\n map: idNodeMap,\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n skipChild: false,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n slimDOMOptions: slimDOMOptions,\n dataURLOptions: dataURLOptions,\n inlineImages: inlineImages,\n recordCanvas: recordCanvas,\n preserveWhiteSpace: preserveWhiteSpace,\n onSerialize: onSerialize,\n onIframeLoad: onIframeLoad,\n iframeLoadTimeout: iframeLoadTimeout,\n keepIframeSrcFn: keepIframeSrcFn\n }),\n idNodeMap,\n ];\n}\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\nfunction parse(css, options) {\n if (options === void 0) { options = {}; }\n var lineno = 1;\n var column = 1;\n function updatePosition(str) {\n var lines = str.match(/\\n/g);\n if (lines) {\n lineno += lines.length;\n }\n var i = str.lastIndexOf('\\n');\n column = i === -1 ? column + str.length : str.length - i;\n }\n function position() {\n var start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n var Position = (function () {\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n return Position;\n }());\n Position.prototype.content = css;\n var errorsList = [];\n function error(msg) {\n var err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg);\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = css;\n if (options.silent) {\n errorsList.push(err);\n }\n else {\n throw err;\n }\n }\n function stylesheet() {\n var rulesList = rules();\n return {\n type: 'stylesheet',\n stylesheet: {\n source: options.source,\n rules: rulesList,\n parsingErrors: errorsList\n }\n };\n }\n function open() {\n return match(/^{\\s*/);\n }\n function close() {\n return match(/^}/);\n }\n function rules() {\n var node;\n var rules = [];\n whitespace();\n comments(rules);\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\n if (node !== false) {\n rules.push(node);\n comments(rules);\n }\n }\n return rules;\n }\n function match(re) {\n var m = re.exec(css);\n if (!m) {\n return;\n }\n var str = m[0];\n updatePosition(str);\n css = css.slice(str.length);\n return m;\n }\n function whitespace() {\n match(/^\\s*/);\n }\n function comments(rules) {\n if (rules === void 0) { rules = []; }\n var c;\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n c = comment();\n }\n return rules;\n }\n function comment() {\n var pos = position();\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\n return;\n }\n var i = 2;\n while ('' !== css.charAt(i) &&\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\n ++i;\n }\n i += 2;\n if ('' === css.charAt(i - 1)) {\n return error('End of comment missing');\n }\n var str = css.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n css = css.slice(i);\n column += 2;\n return pos({\n type: 'comment',\n comment: str\n });\n }\n function selector() {\n var m = match(/^([^{]+)/);\n if (!m) {\n return;\n }\n return trim(m[0])\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\n return m.replace(/,/g, '\\u200C');\n })\n .split(/\\s*(?![^(]*\\)),\\s*/)\n .map(function (s) {\n return s.replace(/\\u200C/g, ',');\n });\n }\n function declaration() {\n var pos = position();\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\n if (!propMatch) {\n return;\n }\n var prop = trim(propMatch[0]);\n if (!match(/^:\\s*/)) {\n return error(\"property missing ':'\");\n }\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\n var ret = pos({\n type: 'declaration',\n property: prop.replace(commentre, ''),\n value: val ? trim(val[0]).replace(commentre, '') : ''\n });\n match(/^[;\\s]*/);\n return ret;\n }\n function declarations() {\n var decls = [];\n if (!open()) {\n return error(\"missing '{'\");\n }\n comments(decls);\n var decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n decl = declaration();\n }\n if (!close()) {\n return error(\"missing '}'\");\n }\n return decls;\n }\n function keyframe() {\n var m;\n var vals = [];\n var pos = position();\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\n vals.push(m[1]);\n match(/^,\\s*/);\n }\n if (!vals.length) {\n return;\n }\n return pos({\n type: 'keyframe',\n values: vals,\n declarations: declarations()\n });\n }\n function atkeyframes() {\n var pos = position();\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\n if (!m) {\n return;\n }\n var vendor = m[1];\n m = match(/^([-\\w]+)\\s*/);\n if (!m) {\n return error('@keyframes missing name');\n }\n var name = m[1];\n if (!open()) {\n return error(\"@keyframes missing '{'\");\n }\n var frame;\n var frames = comments();\n while ((frame = keyframe())) {\n frames.push(frame);\n frames = frames.concat(comments());\n }\n if (!close()) {\n return error(\"@keyframes missing '}'\");\n }\n return pos({\n type: 'keyframes',\n name: name,\n vendor: vendor,\n keyframes: frames\n });\n }\n function atsupports() {\n var pos = position();\n var m = match(/^@supports *([^{]+)/);\n if (!m) {\n return;\n }\n var supports = trim(m[1]);\n if (!open()) {\n return error(\"@supports missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@supports missing '}'\");\n }\n return pos({\n type: 'supports',\n supports: supports,\n rules: style\n });\n }\n function athost() {\n var pos = position();\n var m = match(/^@host\\s*/);\n if (!m) {\n return;\n }\n if (!open()) {\n return error(\"@host missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@host missing '}'\");\n }\n return pos({\n type: 'host',\n rules: style\n });\n }\n function atmedia() {\n var pos = position();\n var m = match(/^@media *([^{]+)/);\n if (!m) {\n return;\n }\n var media = trim(m[1]);\n if (!open()) {\n return error(\"@media missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@media missing '}'\");\n }\n return pos({\n type: 'media',\n media: media,\n rules: style\n });\n }\n function atcustommedia() {\n var pos = position();\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\n if (!m) {\n return;\n }\n return pos({\n type: 'custom-media',\n name: trim(m[1]),\n media: trim(m[2])\n });\n }\n function atpage() {\n var pos = position();\n var m = match(/^@page */);\n if (!m) {\n return;\n }\n var sel = selector() || [];\n if (!open()) {\n return error(\"@page missing '{'\");\n }\n var decls = comments();\n var decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n if (!close()) {\n return error(\"@page missing '}'\");\n }\n return pos({\n type: 'page',\n selectors: sel,\n declarations: decls\n });\n }\n function atdocument() {\n var pos = position();\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\n if (!m) {\n return;\n }\n var vendor = trim(m[1]);\n var doc = trim(m[2]);\n if (!open()) {\n return error(\"@document missing '{'\");\n }\n var style = comments().concat(rules());\n if (!close()) {\n return error(\"@document missing '}'\");\n }\n return pos({\n type: 'document',\n document: doc,\n vendor: vendor,\n rules: style\n });\n }\n function atfontface() {\n var pos = position();\n var m = match(/^@font-face\\s*/);\n if (!m) {\n return;\n }\n if (!open()) {\n return error(\"@font-face missing '{'\");\n }\n var decls = comments();\n var decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n if (!close()) {\n return error(\"@font-face missing '}'\");\n }\n return pos({\n type: 'font-face',\n declarations: decls\n });\n }\n var atimport = _compileAtrule('import');\n var atcharset = _compileAtrule('charset');\n var atnamespace = _compileAtrule('namespace');\n function _compileAtrule(name) {\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\n return function () {\n var pos = position();\n var m = match(re);\n if (!m) {\n return;\n }\n var ret = { type: name };\n ret[name] = m[1].trim();\n return pos(ret);\n };\n }\n function atrule() {\n if (css[0] !== '@') {\n return;\n }\n return (atkeyframes() ||\n atmedia() ||\n atcustommedia() ||\n atsupports() ||\n atimport() ||\n atcharset() ||\n atnamespace() ||\n atdocument() ||\n atpage() ||\n athost() ||\n atfontface());\n }\n function rule() {\n var pos = position();\n var sel = selector();\n if (!sel) {\n return error('selector missing');\n }\n comments();\n return pos({\n type: 'rule',\n selectors: sel,\n declarations: declarations()\n });\n }\n return addParent(stylesheet());\n}\nfunction trim(str) {\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\n}\nfunction addParent(obj, parent) {\n var isNode = obj && typeof obj.type === 'string';\n var childParent = isNode ? obj : parent;\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\n var k = _a[_i];\n var value = obj[k];\n if (Array.isArray(value)) {\n value.forEach(function (v) {\n addParent(v, childParent);\n });\n }\n else if (value && typeof value === 'object') {\n addParent(value, childParent);\n }\n }\n if (isNode) {\n Object.defineProperty(obj, 'parent', {\n configurable: true,\n writable: true,\n enumerable: false,\n value: parent || null\n });\n }\n return obj;\n}\n\nvar tagMap = {\n script: 'noscript',\n altglyph: 'altGlyph',\n altglyphdef: 'altGlyphDef',\n altglyphitem: 'altGlyphItem',\n animatecolor: 'animateColor',\n animatemotion: 'animateMotion',\n animatetransform: 'animateTransform',\n clippath: 'clipPath',\n feblend: 'feBlend',\n fecolormatrix: 'feColorMatrix',\n fecomponenttransfer: 'feComponentTransfer',\n fecomposite: 'feComposite',\n feconvolvematrix: 'feConvolveMatrix',\n fediffuselighting: 'feDiffuseLighting',\n fedisplacementmap: 'feDisplacementMap',\n fedistantlight: 'feDistantLight',\n fedropshadow: 'feDropShadow',\n feflood: 'feFlood',\n fefunca: 'feFuncA',\n fefuncb: 'feFuncB',\n fefuncg: 'feFuncG',\n fefuncr: 'feFuncR',\n fegaussianblur: 'feGaussianBlur',\n feimage: 'feImage',\n femerge: 'feMerge',\n femergenode: 'feMergeNode',\n femorphology: 'feMorphology',\n feoffset: 'feOffset',\n fepointlight: 'fePointLight',\n fespecularlighting: 'feSpecularLighting',\n fespotlight: 'feSpotLight',\n fetile: 'feTile',\n feturbulence: 'feTurbulence',\n foreignobject: 'foreignObject',\n glyphref: 'glyphRef',\n lineargradient: 'linearGradient',\n radialgradient: 'radialGradient'\n};\nfunction getTagName(n) {\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\n if (tagName === 'link' && n.attributes._cssText) {\n tagName = 'style';\n }\n return tagName;\n}\nfunction escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\nfunction addHoverClass(cssText, cache) {\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\n if (cachedStyle)\n return cachedStyle;\n var ast = parse(cssText, {\n silent: true\n });\n if (!ast.stylesheet) {\n return cssText;\n }\n var selectors = [];\n ast.stylesheet.rules.forEach(function (rule) {\n if ('selectors' in rule) {\n (rule.selectors || []).forEach(function (selector) {\n if (HOVER_SELECTOR.test(selector)) {\n selectors.push(selector);\n }\n });\n }\n });\n if (selectors.length === 0) {\n return cssText;\n }\n var selectorMatcher = new RegExp(selectors\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\n .sort(function (a, b) { return b.length - a.length; })\n .map(function (selector) {\n return escapeRegExp(selector);\n })\n .join('|'), 'g');\n var result = cssText.replace(selectorMatcher, function (selector) {\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\n return selector + \", \" + newSelector;\n });\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\n return result;\n}\nfunction createCache() {\n var stylesWithHoverClass = new Map();\n return {\n stylesWithHoverClass: stylesWithHoverClass\n };\n}\nfunction buildNode(n, options) {\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\n switch (n.type) {\n case NodeType.Document:\n return doc.implementation.createDocument(null, '', null);\n case NodeType.DocumentType:\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\n case NodeType.Element:\n var tagName = getTagName(n);\n var node_1;\n if (n.isSVG) {\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\n }\n else {\n node_1 = doc.createElement(tagName);\n }\n var _loop_1 = function (name_1) {\n if (!n.attributes.hasOwnProperty(name_1)) {\n return \"continue\";\n }\n var value = n.attributes[name_1];\n if (tagName === 'option' && name_1 === 'selected' && value === false) {\n return \"continue\";\n }\n value =\n typeof value === 'boolean' || typeof value === 'number' ? '' : value;\n if (!name_1.startsWith('rr_')) {\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\n if (isRemoteOrDynamicCss && hackCss) {\n value = addHoverClass(value, cache);\n }\n if (isTextarea || isRemoteOrDynamicCss) {\n var child = doc.createTextNode(value);\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\n var c = _a[_i];\n if (c.nodeType === node_1.TEXT_NODE) {\n node_1.removeChild(c);\n }\n }\n node_1.appendChild(child);\n return \"continue\";\n }\n try {\n if (n.isSVG && name_1 === 'xlink:href') {\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value);\n }\n else if (name_1 === 'onload' ||\n name_1 === 'onclick' ||\n name_1.substring(0, 7) === 'onmouse') {\n node_1.setAttribute('_' + name_1, value);\n }\n else if (tagName === 'meta' &&\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\n name_1 === 'content') {\n node_1.setAttribute('csp-content', value);\n return \"continue\";\n }\n else if (tagName === 'link' &&\n n.attributes.rel === 'preload' &&\n n.attributes.as === 'script') {\n }\n else if (tagName === 'link' &&\n n.attributes.rel === 'prefetch' &&\n typeof n.attributes.href === 'string' &&\n n.attributes.href.endsWith('.js')) {\n }\n else if (tagName === 'img' &&\n n.attributes.srcset &&\n n.attributes.rr_dataURL) {\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\n }\n else {\n node_1.setAttribute(name_1, value);\n }\n }\n catch (error) {\n }\n }\n else {\n if (tagName === 'canvas' && name_1 === 'rr_dataURL') {\n var image_1 = document.createElement('img');\n image_1.src = value;\n image_1.onload = function () {\n var ctx = node_1.getContext('2d');\n if (ctx) {\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\n }\n };\n }\n else if (tagName === 'img' && name_1 === 'rr_dataURL') {\n var image = node_1;\n if (!image.currentSrc.startsWith('data:')) {\n image.setAttribute('rrweb-original-src', n.attributes.src);\n image.src = value;\n }\n }\n if (name_1 === 'rr_width') {\n node_1.style.width = value;\n }\n else if (name_1 === 'rr_height') {\n node_1.style.height = value;\n }\n else if (name_1 === 'rr_mediaCurrentTime') {\n node_1.currentTime = n.attributes\n .rr_mediaCurrentTime;\n }\n else if (name_1 === 'rr_mediaState') {\n switch (value) {\n case 'played':\n node_1\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\n break;\n case 'paused':\n node_1.pause();\n break;\n }\n }\n }\n };\n for (var name_1 in n.attributes) {\n _loop_1(name_1);\n }\n if (n.isShadowHost) {\n if (!node_1.shadowRoot) {\n node_1.attachShadow({ mode: 'open' });\n }\n else {\n while (node_1.shadowRoot.firstChild) {\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\n }\n }\n }\n return node_1;\n case NodeType.Text:\n return doc.createTextNode(n.isStyle && hackCss\n ? addHoverClass(n.textContent, cache)\n : n.textContent);\n case NodeType.CDATA:\n return doc.createCDATASection(n.textContent);\n case NodeType.Comment:\n return doc.createComment(n.textContent);\n default:\n return null;\n }\n}\nfunction buildNodeWithSN(n, options) {\n var doc = options.doc, map = options.map, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\n if (!node) {\n return null;\n }\n if (n.rootId) {\n console.assert(map[n.rootId] === doc, 'Target document should has the same root id.');\n }\n if (n.type === NodeType.Document) {\n doc.close();\n doc.open();\n if (n.compatMode === 'BackCompat' &&\n n.childNodes &&\n n.childNodes[0].type !== NodeType.DocumentType) {\n if (n.childNodes[0].type === NodeType.Element &&\n 'xmlns' in n.childNodes[0].attributes &&\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\n }\n else {\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\n }\n }\n node = doc;\n }\n node.__sn = n;\n map[n.id] = node;\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\n !skipChild) {\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\n var childN = _c[_i];\n var childNode = buildNodeWithSN(childN, {\n doc: doc,\n map: map,\n skipChild: false,\n hackCss: hackCss,\n afterAppend: afterAppend,\n cache: cache\n });\n if (!childNode) {\n console.warn('Failed to rebuild', childN);\n continue;\n }\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\n node.shadowRoot.appendChild(childNode);\n }\n else {\n node.appendChild(childNode);\n }\n if (afterAppend) {\n afterAppend(childNode);\n }\n }\n }\n return node;\n}\nfunction visit(idNodeMap, onVisit) {\n function walk(node) {\n onVisit(node);\n }\n for (var key in idNodeMap) {\n if (idNodeMap[key]) {\n walk(idNodeMap[key]);\n }\n }\n}\nfunction handleScroll(node) {\n var n = node.__sn;\n if (n.type !== NodeType.Element) {\n return;\n }\n var el = node;\n for (var name_2 in n.attributes) {\n if (!(n.attributes.hasOwnProperty(name_2) && name_2.startsWith('rr_'))) {\n continue;\n }\n var value = n.attributes[name_2];\n if (name_2 === 'rr_scrollLeft') {\n el.scrollLeft = value;\n }\n if (name_2 === 'rr_scrollTop') {\n el.scrollTop = value;\n }\n }\n}\nfunction rebuild(n, options) {\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache;\n var idNodeMap = {};\n var node = buildNodeWithSN(n, {\n doc: doc,\n map: idNodeMap,\n skipChild: false,\n hackCss: hackCss,\n afterAppend: afterAppend,\n cache: cache\n });\n visit(idNodeMap, function (visitedNode) {\n if (onVisit) {\n onVisit(visitedNode);\n }\n handleScroll(visitedNode);\n });\n return [node, idNodeMap];\n}\n\nexport { IGNORED_NODE, NodeType, addHoverClass, buildNodeWithSN, createCache, is2DCanvasBlank, isElement, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\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***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nexport { __assign, __read, __rest, __spreadArray, __values };\n","var EventType;\n(function (EventType) {\n EventType[EventType[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType[EventType[\"Load\"] = 1] = \"Load\";\n EventType[EventType[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType[EventType[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType[EventType[\"Meta\"] = 4] = \"Meta\";\n EventType[EventType[\"Custom\"] = 5] = \"Custom\";\n EventType[EventType[\"Plugin\"] = 6] = \"Plugin\";\n})(EventType || (EventType = {}));\nvar IncrementalSource;\n(function (IncrementalSource) {\n IncrementalSource[IncrementalSource[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource[IncrementalSource[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource[IncrementalSource[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource[IncrementalSource[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource[IncrementalSource[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource[IncrementalSource[\"Input\"] = 5] = \"Input\";\n IncrementalSource[IncrementalSource[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource[IncrementalSource[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource[IncrementalSource[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource[IncrementalSource[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource[IncrementalSource[\"Font\"] = 10] = \"Font\";\n IncrementalSource[IncrementalSource[\"Log\"] = 11] = \"Log\";\n IncrementalSource[IncrementalSource[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource[IncrementalSource[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n})(IncrementalSource || (IncrementalSource = {}));\nvar MouseInteractions;\n(function (MouseInteractions) {\n MouseInteractions[MouseInteractions[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions[MouseInteractions[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions[MouseInteractions[\"Click\"] = 2] = \"Click\";\n MouseInteractions[MouseInteractions[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions[MouseInteractions[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions[MouseInteractions[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions[MouseInteractions[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions[MouseInteractions[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions[MouseInteractions[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions[MouseInteractions[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions[MouseInteractions[\"TouchCancel\"] = 10] = \"TouchCancel\";\n})(MouseInteractions || (MouseInteractions = {}));\nvar CanvasContext;\n(function (CanvasContext) {\n CanvasContext[CanvasContext[\"2D\"] = 0] = \"2D\";\n CanvasContext[CanvasContext[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext[CanvasContext[\"WebGL2\"] = 2] = \"WebGL2\";\n})(CanvasContext || (CanvasContext = {}));\nvar MediaInteractions;\n(function (MediaInteractions) {\n MediaInteractions[MediaInteractions[\"Play\"] = 0] = \"Play\";\n MediaInteractions[MediaInteractions[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions[MediaInteractions[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions[MediaInteractions[\"VolumeChange\"] = 3] = \"VolumeChange\";\n})(MediaInteractions || (MediaInteractions = {}));\nvar ReplayerEvents;\n(function (ReplayerEvents) {\n ReplayerEvents[\"Start\"] = \"start\";\n ReplayerEvents[\"Pause\"] = \"pause\";\n ReplayerEvents[\"Resume\"] = \"resume\";\n ReplayerEvents[\"Resize\"] = \"resize\";\n ReplayerEvents[\"Finish\"] = \"finish\";\n ReplayerEvents[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents[\"EventCast\"] = \"event-cast\";\n ReplayerEvents[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents[\"Flush\"] = \"flush\";\n ReplayerEvents[\"StateChange\"] = \"state-change\";\n ReplayerEvents[\"PlayBack\"] = \"play-back\";\n})(ReplayerEvents || (ReplayerEvents = {}));\n\nexport { CanvasContext, EventType, IncrementalSource, MediaInteractions, MouseInteractions, ReplayerEvents };\n","import { __values } from '../ext/tslib/tslib.es6.js';\nimport { IncrementalSource } from './types.js';\nimport { IGNORED_NODE, isShadowRoot, NodeType } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target) {\n if (target === void 0) { target = document; }\n var options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return function () { return target.removeEventListener(type, fn, options); };\n}\nfunction createMirror() {\n return {\n map: {},\n getId: function (n) {\n if (!n || !n.__sn) {\n return -1;\n }\n return n.__sn.id;\n },\n getNode: function (id) {\n return this.map[id] || null;\n },\n removeNodeFromMap: function (n) {\n var _this = this;\n var id = n.__sn && n.__sn.id;\n delete this.map[id];\n if (n.childNodes) {\n n.childNodes.forEach(function (child) {\n return _this.removeNodeFromMap(child);\n });\n }\n },\n has: function (id) {\n return this.map.hasOwnProperty(id);\n },\n reset: function () {\n this.map = {};\n },\n };\n}\nvar DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\n '\\r\\n' +\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\n '\\r\\n' +\n 'or you can use record.mirror to access the mirror instance during recording.';\nvar _mirror = {\n map: {},\n getId: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset: function () {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n};\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get: function (target, prop, receiver) {\n if (prop === 'map') {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\nfunction throttle(func, wait, options) {\n if (options === void 0) { options = {}; }\n var timeout = null;\n var previous = 0;\n return function (arg) {\n var now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n var context = this;\n var args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n }\n else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win) {\n if (win === void 0) { win = window; }\n var original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(target, key, isRevoked\n ? d\n : {\n set: function (value) {\n var _this = this;\n setTimeout(function () {\n d.set.call(_this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n },\n });\n return function () { return hookSetter(target, key, original || {}, true); };\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return function () { };\n }\n var original_1 = source[name];\n var wrapped = replacement(original_1);\n if (typeof wrapped === 'function') {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original_1,\n },\n });\n }\n source[name] = wrapped;\n return function () {\n source[name] = original_1;\n };\n }\n catch (_a) {\n return function () { };\n }\n}\nfunction getWindowHeight() {\n return (window.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight));\n}\nfunction getWindowWidth() {\n return (window.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth));\n}\nfunction isBlocked(node, blockClass) {\n if (!node) {\n return false;\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n var needBlock_1 = false;\n if (typeof blockClass === 'string') {\n if (node.closest !== undefined) {\n return node.closest('.' + blockClass) !== null;\n }\n else {\n needBlock_1 = node.classList.contains(blockClass);\n }\n }\n else {\n node.classList.forEach(function (className) {\n if (blockClass.test(className)) {\n needBlock_1 = true;\n }\n });\n }\n return needBlock_1 || isBlocked(node.parentNode, blockClass);\n }\n if (node.nodeType === node.TEXT_NODE) {\n return isBlocked(node.parentNode, blockClass);\n }\n return isBlocked(node.parentNode, blockClass);\n}\nfunction isIgnored(n) {\n if ('__sn' in n) {\n return n.__sn.id === IGNORED_NODE;\n }\n return false;\n}\nfunction isAncestorRemoved(target, mirror) {\n if (isShadowRoot(target)) {\n return false;\n }\n var id = mirror.getId(target);\n if (!mirror.has(id)) {\n return true;\n }\n if (target.parentNode &&\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!target.parentNode) {\n return true;\n }\n return isAncestorRemoved(target.parentNode, mirror);\n}\nfunction isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win) {\n if (win === void 0) { win = window; }\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype\n .forEach;\n }\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype\n .forEach;\n }\n if (!Node.prototype.contains) {\n Node.prototype.contains = function contains(node) {\n if (!(0 in arguments)) {\n throw new TypeError('1 argument is required');\n }\n do {\n if (this === node) {\n return true;\n }\n } while ((node = node && node.parentNode));\n return false;\n };\n }\n}\nvar TreeIndex = (function () {\n function TreeIndex() {\n this.reset();\n }\n TreeIndex.prototype.add = function (mutation) {\n var parentTreeNode = this.indexes.get(mutation.parentId);\n var treeNode = {\n id: mutation.node.id,\n mutation: mutation,\n children: [],\n texts: [],\n attributes: [],\n };\n if (!parentTreeNode) {\n this.tree[treeNode.id] = treeNode;\n }\n else {\n treeNode.parent = parentTreeNode;\n parentTreeNode.children[treeNode.id] = treeNode;\n }\n this.indexes.set(treeNode.id, treeNode);\n };\n TreeIndex.prototype.remove = function (mutation, mirror) {\n var _this = this;\n var parentTreeNode = this.indexes.get(mutation.parentId);\n var treeNode = this.indexes.get(mutation.id);\n var deepRemoveFromMirror = function (id) {\n _this.removeIdSet.add(id);\n var node = mirror.getNode(id);\n node === null || node === void 0 ? void 0 : node.childNodes.forEach(function (childNode) {\n if ('__sn' in childNode) {\n deepRemoveFromMirror(childNode.__sn.id);\n }\n });\n };\n var deepRemoveFromTreeIndex = function (node) {\n _this.removeIdSet.add(node.id);\n Object.values(node.children).forEach(function (n) { return deepRemoveFromTreeIndex(n); });\n var _treeNode = _this.indexes.get(node.id);\n if (_treeNode) {\n var _parentTreeNode = _treeNode.parent;\n if (_parentTreeNode) {\n delete _treeNode.parent;\n delete _parentTreeNode.children[_treeNode.id];\n _this.indexes.delete(mutation.id);\n }\n }\n };\n if (!treeNode) {\n this.removeNodeMutations.push(mutation);\n deepRemoveFromMirror(mutation.id);\n }\n else if (!parentTreeNode) {\n delete this.tree[treeNode.id];\n this.indexes.delete(treeNode.id);\n deepRemoveFromTreeIndex(treeNode);\n }\n else {\n delete treeNode.parent;\n delete parentTreeNode.children[treeNode.id];\n this.indexes.delete(mutation.id);\n deepRemoveFromTreeIndex(treeNode);\n }\n };\n TreeIndex.prototype.text = function (mutation) {\n var treeNode = this.indexes.get(mutation.id);\n if (treeNode) {\n treeNode.texts.push(mutation);\n }\n else {\n this.textMutations.push(mutation);\n }\n };\n TreeIndex.prototype.attribute = function (mutation) {\n var treeNode = this.indexes.get(mutation.id);\n if (treeNode) {\n treeNode.attributes.push(mutation);\n }\n else {\n this.attributeMutations.push(mutation);\n }\n };\n TreeIndex.prototype.scroll = function (d) {\n this.scrollMap.set(d.id, d);\n };\n TreeIndex.prototype.input = function (d) {\n this.inputMap.set(d.id, d);\n };\n TreeIndex.prototype.flush = function () {\n var e_1, _a, e_2, _b;\n var _this = this;\n var _c = this, tree = _c.tree, removeNodeMutations = _c.removeNodeMutations, textMutations = _c.textMutations, attributeMutations = _c.attributeMutations;\n var batchMutationData = {\n source: IncrementalSource.Mutation,\n removes: removeNodeMutations,\n texts: textMutations,\n attributes: attributeMutations,\n adds: [],\n };\n var walk = function (treeNode, removed) {\n if (removed) {\n _this.removeIdSet.add(treeNode.id);\n }\n batchMutationData.texts = batchMutationData.texts\n .concat(removed ? [] : treeNode.texts)\n .filter(function (m) { return !_this.removeIdSet.has(m.id); });\n batchMutationData.attributes = batchMutationData.attributes\n .concat(removed ? [] : treeNode.attributes)\n .filter(function (m) { return !_this.removeIdSet.has(m.id); });\n if (!_this.removeIdSet.has(treeNode.id) &&\n !_this.removeIdSet.has(treeNode.mutation.parentId) &&\n !removed) {\n batchMutationData.adds.push(treeNode.mutation);\n if (treeNode.children) {\n Object.values(treeNode.children).forEach(function (n) { return walk(n, false); });\n }\n }\n else {\n Object.values(treeNode.children).forEach(function (n) { return walk(n, true); });\n }\n };\n Object.values(tree).forEach(function (n) { return walk(n, false); });\n try {\n for (var _d = __values(this.scrollMap.keys()), _e = _d.next(); !_e.done; _e = _d.next()) {\n var id = _e.value;\n if (this.removeIdSet.has(id)) {\n this.scrollMap.delete(id);\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 try {\n for (var _f = __values(this.inputMap.keys()), _g = _f.next(); !_g.done; _g = _f.next()) {\n var id = _g.value;\n if (this.removeIdSet.has(id)) {\n this.inputMap.delete(id);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_g && !_g.done && (_b = _f.return)) _b.call(_f);\n }\n finally { if (e_2) throw e_2.error; }\n }\n var scrollMap = new Map(this.scrollMap);\n var inputMap = new Map(this.inputMap);\n this.reset();\n return {\n mutationData: batchMutationData,\n scrollMap: scrollMap,\n inputMap: inputMap,\n };\n };\n TreeIndex.prototype.reset = function () {\n this.tree = [];\n this.indexes = new Map();\n this.removeNodeMutations = [];\n this.textMutations = [];\n this.attributeMutations = [];\n this.removeIdSet = new Set();\n this.scrollMap = new Map();\n this.inputMap = new Map();\n };\n TreeIndex.prototype.idRemoved = function (id) {\n return this.removeIdSet.has(id);\n };\n return TreeIndex;\n}());\nfunction queueToResolveTrees(queue) {\n var e_3, _a;\n var queueNodeMap = {};\n var putIntoMap = function (m, parent) {\n var nodeInTree = {\n value: m,\n parent: parent,\n children: [],\n };\n queueNodeMap[m.node.id] = nodeInTree;\n return nodeInTree;\n };\n var queueNodeTrees = [];\n try {\n for (var queue_1 = __values(queue), queue_1_1 = queue_1.next(); !queue_1_1.done; queue_1_1 = queue_1.next()) {\n var mutation = queue_1_1.value;\n var nextId = mutation.nextId, parentId = mutation.parentId;\n if (nextId && nextId in queueNodeMap) {\n var nextInTree = queueNodeMap[nextId];\n if (nextInTree.parent) {\n var idx = nextInTree.parent.children.indexOf(nextInTree);\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\n }\n else {\n var idx = queueNodeTrees.indexOf(nextInTree);\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\n }\n continue;\n }\n if (parentId in queueNodeMap) {\n var parentInTree = queueNodeMap[parentId];\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\n continue;\n }\n queueNodeTrees.push(putIntoMap(mutation, null));\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (queue_1_1 && !queue_1_1.done && (_a = queue_1.return)) _a.call(queue_1);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return queueNodeTrees;\n}\nfunction iterateResolveTree(tree, cb) {\n cb(tree.value);\n for (var i = tree.children.length - 1; i >= 0; i--) {\n iterateResolveTree(tree.children[i], cb);\n }\n}\nfunction isIframeINode(node) {\n if ('__sn' in node) {\n return (node.__sn.type === NodeType.Element && node.__sn.tagName === 'iframe');\n }\n return false;\n}\nfunction getBaseDimension(node, rootIframe) {\n var _a, _b;\n var frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\n if (!frameElement || frameElement === rootIframe) {\n return {\n x: 0,\n y: 0,\n relativeScale: 1,\n absoluteScale: 1,\n };\n }\n var frameDimension = frameElement.getBoundingClientRect();\n var frameBaseDimension = getBaseDimension(frameElement, rootIframe);\n var relativeScale = frameDimension.height / frameElement.clientHeight;\n return {\n x: frameDimension.x * frameBaseDimension.relativeScale +\n frameBaseDimension.x,\n y: frameDimension.y * frameBaseDimension.relativeScale +\n frameBaseDimension.y,\n relativeScale: relativeScale,\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\n };\n}\nfunction hasShadowRoot(n) {\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\n}\n\nexport { TreeIndex, _mirror, createMirror, getBaseDimension, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIframeINode, isIgnored, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle };\n","import { __values } from '../../ext/tslib/tslib.es6.js';\nimport { isShadowRoot, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isAncestorRemoved, isIframeINode, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\n return '__ln' in n;\n}\nvar DoubleLinkedList = (function () {\n function DoubleLinkedList() {\n this.length = 0;\n this.head = null;\n }\n DoubleLinkedList.prototype.get = function (position) {\n if (position >= this.length) {\n throw new Error('Position outside of list range');\n }\n var current = this.head;\n for (var index = 0; index < position; index++) {\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\n }\n return current;\n };\n DoubleLinkedList.prototype.addNode = function (n) {\n var node = {\n value: n,\n previous: null,\n next: null,\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n var current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n }\n else if (n.nextSibling &&\n isNodeInLinkedList(n.nextSibling) &&\n n.nextSibling.__ln.previous) {\n var current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n }\n else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n this.length++;\n };\n DoubleLinkedList.prototype.removeNode = function (n) {\n var current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n }\n }\n else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n };\n return DoubleLinkedList;\n}());\nvar moveKey = function (id, parentId) { return \"\".concat(id, \"@\").concat(parentId); };\nfunction isINode(n) {\n return '__sn' in n;\n}\nvar MutationBuffer = (function () {\n function MutationBuffer() {\n var _this = this;\n this.frozen = false;\n this.locked = false;\n this.texts = [];\n this.attributes = [];\n this.removes = [];\n this.mapRemoves = [];\n this.movedMap = {};\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.processMutations = function (mutations) {\n mutations.forEach(_this.processMutation);\n _this.emit();\n };\n this.emit = function () {\n var e_1, _a, e_2, _b;\n if (_this.frozen || _this.locked) {\n return;\n }\n var adds = [];\n var addList = new DoubleLinkedList();\n var getNextId = function (n) {\n var ns = n;\n var nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && _this.mirror.getId(ns);\n }\n return nextId;\n };\n var pushAdd = function (n) {\n var _a, _b, _c, _d, _e;\n var shadowHost = n.getRootNode\n ? (_a = n.getRootNode()) === null || _a === void 0 ? void 0 : _a.host\n : null;\n var rootShadowHost = shadowHost;\n while ((_c = (_b = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _b === void 0 ? void 0 : _b.call(rootShadowHost)) === null || _c === void 0 ? void 0 : _c.host)\n rootShadowHost =\n ((_e = (_d = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _d === void 0 ? void 0 : _d.call(rootShadowHost)) === null || _e === void 0 ? void 0 : _e.host) ||\n null;\n var notInDoc = !_this.doc.contains(n) &&\n (rootShadowHost === null || !_this.doc.contains(rootShadowHost));\n if (!n.parentNode || notInDoc) {\n return;\n }\n var parentId = isShadowRoot(n.parentNode)\n ? _this.mirror.getId(shadowHost)\n : _this.mirror.getId(n.parentNode);\n var nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n var sn = serializeNodeWithId(n, {\n doc: _this.doc,\n map: _this.mirror.map,\n blockClass: _this.blockClass,\n blockSelector: _this.blockSelector,\n maskTextClass: _this.maskTextClass,\n maskTextSelector: _this.maskTextSelector,\n skipChild: true,\n inlineStylesheet: _this.inlineStylesheet,\n maskInputOptions: _this.maskInputOptions,\n maskTextFn: _this.maskTextFn,\n maskInputFn: _this.maskInputFn,\n slimDOMOptions: _this.slimDOMOptions,\n recordCanvas: _this.recordCanvas,\n inlineImages: _this.inlineImages,\n onSerialize: function (currentN) {\n if (isIframeINode(currentN)) {\n _this.iframeManager.addIframe(currentN);\n }\n if (hasShadowRoot(n)) {\n _this.shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: function (iframe, childSn) {\n _this.iframeManager.attachIframe(iframe, childSn);\n _this.shadowDomManager.observeAttachShadow(iframe);\n },\n });\n if (sn) {\n adds.push({\n parentId: parentId,\n nextId: nextId,\n node: sn,\n });\n }\n };\n while (_this.mapRemoves.length) {\n _this.mirror.removeNodeFromMap(_this.mapRemoves.shift());\n }\n try {\n for (var _c = __values(_this.movedSet), _d = _c.next(); !_d.done; _d = _c.next()) {\n var n = _d.value;\n if (isParentRemoved(_this.removes, n, _this.mirror) &&\n !_this.movedSet.has(n.parentNode)) {\n continue;\n }\n pushAdd(n);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_1) throw e_1.error; }\n }\n try {\n for (var _e = __values(_this.addedSet), _f = _e.next(); !_f.done; _f = _e.next()) {\n var n = _f.value;\n if (!isAncestorInSet(_this.droppedSet, n) &&\n !isParentRemoved(_this.removes, n, _this.mirror)) {\n pushAdd(n);\n }\n else if (isAncestorInSet(_this.movedSet, n)) {\n pushAdd(n);\n }\n else {\n _this.droppedSet.add(n);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n }\n finally { if (e_2) throw e_2.error; }\n }\n var candidate = null;\n while (addList.length) {\n var node = null;\n if (candidate) {\n var parentId = _this.mirror.getId(candidate.value.parentNode);\n var nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n for (var index = addList.length - 1; index >= 0; index--) {\n var _node = addList.get(index);\n if (_node) {\n var parentId = _this.mirror.getId(_node.value.parentNode);\n var nextId = getNextId(_node.value);\n if (parentId !== -1 && nextId !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n var payload = {\n texts: _this.texts\n .map(function (text) { return ({\n id: _this.mirror.getId(text.node),\n value: text.value,\n }); })\n .filter(function (text) { return _this.mirror.has(text.id); }),\n attributes: _this.attributes\n .map(function (attribute) { return ({\n id: _this.mirror.getId(attribute.node),\n attributes: attribute.attributes,\n }); })\n .filter(function (attribute) { return _this.mirror.has(attribute.id); }),\n removes: _this.removes,\n adds: adds,\n };\n if (!payload.texts.length &&\n !payload.attributes.length &&\n !payload.removes.length &&\n !payload.adds.length) {\n return;\n }\n _this.texts = [];\n _this.attributes = [];\n _this.removes = [];\n _this.addedSet = new Set();\n _this.movedSet = new Set();\n _this.droppedSet = new Set();\n _this.movedMap = {};\n _this.mutationCb(payload);\n };\n this.processMutation = function (m) {\n var e_3, _a, e_4, _b;\n if (isIgnored(m.target)) {\n return;\n }\n switch (m.type) {\n case 'characterData': {\n var value = m.target.textContent;\n if (!isBlocked(m.target, _this.blockClass) && value !== m.oldValue) {\n _this.texts.push({\n value: needMaskingText(m.target, _this.maskTextClass, _this.maskTextSelector) && value\n ? _this.maskTextFn\n ? _this.maskTextFn(value)\n : value.replace(/[\\S]/g, '*')\n : value,\n node: m.target,\n });\n }\n break;\n }\n case 'attributes': {\n var target = m.target;\n var value = m.target.getAttribute(m.attributeName);\n if (m.attributeName === 'value') {\n value = maskInputValue({\n maskInputOptions: _this.maskInputOptions,\n tagName: m.target.tagName,\n type: m.target.getAttribute('type'),\n value: value,\n maskInputFn: _this.maskInputFn,\n });\n }\n if (isBlocked(m.target, _this.blockClass) || value === m.oldValue) {\n return;\n }\n var item = _this.attributes.find(function (a) { return a.node === m.target; });\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n };\n _this.attributes.push(item);\n }\n if (m.attributeName === 'style') {\n var old = _this.doc.createElement('span');\n if (m.oldValue) {\n old.setAttribute('style', m.oldValue);\n }\n if (item.attributes.style === undefined ||\n item.attributes.style === null) {\n item.attributes.style = {};\n }\n var styleObj = item.attributes.style;\n try {\n for (var _c = __values(Array.from(target.style)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var pname = _d.value;\n var newValue = target.style.getPropertyValue(pname);\n var newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) ||\n newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === '') {\n styleObj[pname] = newValue;\n }\n else {\n styleObj[pname] = [newValue, newPriority];\n }\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_3) throw e_3.error; }\n }\n try {\n for (var _e = __values(Array.from(old.style)), _f = _e.next(); !_f.done; _f = _e.next()) {\n var pname = _f.value;\n if (target.style.getPropertyValue(pname) === '') {\n styleObj[pname] = false;\n }\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n }\n finally { if (e_4) throw e_4.error; }\n }\n }\n else {\n item.attributes[m.attributeName] = transformAttribute(_this.doc, m.target.tagName, m.attributeName, value);\n }\n break;\n }\n case 'childList': {\n m.addedNodes.forEach(function (n) { return _this.genAdds(n, m.target); });\n m.removedNodes.forEach(function (n) {\n var nodeId = _this.mirror.getId(n);\n var parentId = isShadowRoot(m.target)\n ? _this.mirror.getId(m.target.host)\n : _this.mirror.getId(m.target);\n if (isBlocked(m.target, _this.blockClass) || isIgnored(n)) {\n return;\n }\n if (_this.addedSet.has(n)) {\n deepDelete(_this.addedSet, n);\n _this.droppedSet.add(n);\n }\n else if (_this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, _this.mirror)) ;\n else if (_this.movedSet.has(n) &&\n _this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(_this.movedSet, n);\n }\n else {\n _this.removes.push({\n parentId: parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) ? true : undefined,\n });\n }\n _this.mapRemoves.push(n);\n });\n break;\n }\n }\n };\n this.genAdds = function (n, target) {\n if (target && isBlocked(target, _this.blockClass)) {\n return;\n }\n if (isINode(n)) {\n if (isIgnored(n)) {\n return;\n }\n _this.movedSet.add(n);\n var targetId = null;\n if (target && isINode(target)) {\n targetId = target.__sn.id;\n }\n if (targetId) {\n _this.movedMap[moveKey(n.__sn.id, targetId)] = true;\n }\n }\n else {\n _this.addedSet.add(n);\n _this.droppedSet.delete(n);\n }\n if (!isBlocked(n, _this.blockClass))\n n.childNodes.forEach(function (childN) { return _this.genAdds(childN); });\n };\n }\n MutationBuffer.prototype.init = function (options) {\n var _this = this;\n [\n 'mutationCb',\n 'blockClass',\n 'blockSelector',\n 'maskTextClass',\n 'maskTextSelector',\n 'inlineStylesheet',\n 'maskInputOptions',\n 'maskTextFn',\n 'maskInputFn',\n 'recordCanvas',\n 'inlineImages',\n 'slimDOMOptions',\n 'doc',\n 'mirror',\n 'iframeManager',\n 'shadowDomManager',\n 'canvasManager',\n ].forEach(function (key) {\n _this[key] = options[key];\n });\n };\n MutationBuffer.prototype.freeze = function () {\n this.frozen = true;\n this.canvasManager.freeze();\n };\n MutationBuffer.prototype.unfreeze = function () {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n };\n MutationBuffer.prototype.isFrozen = function () {\n return this.frozen;\n };\n MutationBuffer.prototype.lock = function () {\n this.locked = true;\n this.canvasManager.lock();\n };\n MutationBuffer.prototype.unlock = function () {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n };\n MutationBuffer.prototype.reset = function () {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n };\n return MutationBuffer;\n}());\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n n.childNodes.forEach(function (childN) { return deepDelete(addsSet, childN); });\n}\nfunction isParentRemoved(removes, n, mirror) {\n var parentNode = n.parentNode;\n if (!parentNode) {\n return false;\n }\n var parentId = mirror.getId(parentNode);\n if (removes.some(function (r) { return r.id === parentId; })) {\n return true;\n }\n return isParentRemoved(removes, parentNode, mirror);\n}\nfunction isAncestorInSet(set, n) {\n var parentNode = n.parentNode;\n if (!parentNode) {\n return false;\n }\n if (set.has(parentNode)) {\n return true;\n }\n return isAncestorInSet(set, parentNode);\n}\n\nexport default MutationBuffer;\n","import { __read, __values, __spreadArray, __assign } from '../../ext/tslib/tslib.es6.js';\nimport { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isTouchEvent, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch } from '../utils.js';\nimport { IncrementalSource, MouseInteractions } from '../types.js';\nimport MutationBuffer from './mutation.js';\n\nvar mutationBuffers = [];\nvar isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\nvar isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\nvar isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\nvar isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\nfunction getEventTarget(event) {\n try {\n if ('composedPath' in event) {\n var path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n }\n else if ('path' in event && event.path.length) {\n return event.path[0];\n }\n return event.target;\n }\n catch (_a) {\n return event.target;\n }\n}\nfunction initMutationObserver(options, rootEl) {\n var _a, _b;\n var mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n var mutationObserverCtor = window.MutationObserver ||\n window.__rrMutationObserver;\n var angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\n if (angularZoneSymbol &&\n window[angularZoneSymbol]) {\n mutationObserverCtor = window[angularZoneSymbol];\n }\n var observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n });\n return observer;\n}\nfunction initMoveObserver(_a) {\n var mousemoveCb = _a.mousemoveCb, sampling = _a.sampling, doc = _a.doc, mirror = _a.mirror;\n if (sampling.mousemove === false) {\n return function () { };\n }\n var threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\n var callbackThreshold = typeof sampling.mousemoveCallback === 'number'\n ? sampling.mousemoveCallback\n : 500;\n var positions = [];\n var timeBaseline;\n var wrappedCb = throttle(function (source) {\n var totalOffset = Date.now() - timeBaseline;\n mousemoveCb(positions.map(function (p) {\n p.timeOffset -= totalOffset;\n return p;\n }), source);\n positions = [];\n timeBaseline = null;\n }, callbackThreshold);\n var updatePosition = throttle(function (evt) {\n var target = getEventTarget(evt);\n var _a = isTouchEvent(evt)\n ? evt.changedTouches[0]\n : evt, clientX = _a.clientX, clientY = _a.clientY;\n if (!timeBaseline) {\n timeBaseline = Date.now();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror.getId(target),\n timeOffset: Date.now() - timeBaseline,\n });\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\n ? IncrementalSource.Drag\n : evt instanceof MouseEvent\n ? IncrementalSource.MouseMove\n : IncrementalSource.TouchMove);\n }, threshold, {\n trailing: false,\n });\n var handlers = [\n on('mousemove', updatePosition, doc),\n on('touchmove', updatePosition, doc),\n on('drag', updatePosition, doc),\n ];\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initMouseInteractionObserver(_a) {\n var mouseInteractionCb = _a.mouseInteractionCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, sampling = _a.sampling;\n if (sampling.mouseInteraction === false) {\n return function () { };\n }\n var disableMap = sampling.mouseInteraction === true ||\n sampling.mouseInteraction === undefined\n ? {}\n : sampling.mouseInteraction;\n var handlers = [];\n var getHandler = function (eventKey) {\n return function (event) {\n var target = getEventTarget(event);\n if (isBlocked(target, blockClass)) {\n return;\n }\n var e = isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n var id = mirror.getId(target);\n var clientX = e.clientX, clientY = e.clientY;\n mouseInteractionCb({\n type: MouseInteractions[eventKey],\n id: id,\n x: clientX,\n y: clientY,\n });\n };\n };\n Object.keys(MouseInteractions)\n .filter(function (key) {\n return Number.isNaN(Number(key)) &&\n !key.endsWith('_Departed') &&\n disableMap[key] !== false;\n })\n .forEach(function (eventKey) {\n var eventName = eventKey.toLowerCase();\n var handler = getHandler(eventKey);\n handlers.push(on(eventName, handler, doc));\n });\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initScrollObserver(_a) {\n var scrollCb = _a.scrollCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, sampling = _a.sampling;\n var updatePosition = throttle(function (evt) {\n var target = getEventTarget(evt);\n if (!target || isBlocked(target, blockClass)) {\n return;\n }\n var id = mirror.getId(target);\n if (target === doc) {\n var scrollEl = (doc.scrollingElement || doc.documentElement);\n scrollCb({\n id: id,\n x: scrollEl.scrollLeft,\n y: scrollEl.scrollTop,\n });\n }\n else {\n scrollCb({\n id: id,\n x: target.scrollLeft,\n y: target.scrollTop,\n });\n }\n }, sampling.scroll || 100);\n return on('scroll', updatePosition, doc);\n}\nfunction initViewportResizeObserver(_a) {\n var viewportResizeCb = _a.viewportResizeCb;\n var lastH = -1;\n var lastW = -1;\n var updateDimension = throttle(function () {\n var height = getWindowHeight();\n var width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height),\n });\n lastH = height;\n lastW = width;\n }\n }, 200);\n return on('resize', updateDimension, window);\n}\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\n var value = __assign({}, v);\n if (!enable)\n delete value.userTriggered;\n return value;\n}\nvar INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nvar lastInputValueMap = new WeakMap();\nfunction initInputObserver(_a) {\n var inputCb = _a.inputCb, doc = _a.doc, mirror = _a.mirror, blockClass = _a.blockClass, ignoreClass = _a.ignoreClass, maskInputOptions = _a.maskInputOptions, maskInputFn = _a.maskInputFn, sampling = _a.sampling, userTriggeredOnInput = _a.userTriggeredOnInput;\n function eventHandler(event) {\n var target = getEventTarget(event);\n var userTriggered = event.isTrusted;\n if (target && target.tagName === 'OPTION')\n target = target.parentElement;\n if (!target ||\n !target.tagName ||\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\n isBlocked(target, blockClass)) {\n return;\n }\n var type = target.type;\n if (target.classList.contains(ignoreClass)) {\n return;\n }\n var text = target.value;\n var isChecked = false;\n if (type === 'radio' || type === 'checkbox') {\n isChecked = target.checked;\n }\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\n maskInputOptions[type]) {\n text = maskInputValue({\n maskInputOptions: maskInputOptions,\n tagName: target.tagName,\n type: type,\n value: text,\n maskInputFn: maskInputFn,\n });\n }\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text: text, isChecked: isChecked, userTriggered: userTriggered }, userTriggeredOnInput));\n var name = target.name;\n if (type === 'radio' && name && isChecked) {\n doc\n .querySelectorAll(\"input[type=\\\"radio\\\"][name=\\\"\".concat(name, \"\\\"]\"))\n .forEach(function (el) {\n if (el !== target) {\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\n text: el.value,\n isChecked: !isChecked,\n userTriggered: false,\n }, userTriggeredOnInput));\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n var lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue ||\n lastInputValue.text !== v.text ||\n lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n var id = mirror.getId(target);\n inputCb(__assign(__assign({}, v), { id: id }));\n }\n }\n var events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\n var handlers = events.map(function (eventName) { return on(eventName, eventHandler, doc); });\n var propertyDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n var hookProperties = [\n [HTMLInputElement.prototype, 'value'],\n [HTMLInputElement.prototype, 'checked'],\n [HTMLSelectElement.prototype, 'value'],\n [HTMLTextAreaElement.prototype, 'value'],\n [HTMLSelectElement.prototype, 'selectedIndex'],\n [HTMLOptionElement.prototype, 'selected'],\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push.apply(handlers, __spreadArray([], __read(hookProperties.map(function (p) {\n return hookSetter(p[0], p[1], {\n set: function () {\n eventHandler({ target: this });\n },\n });\n })), false));\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction getNestedCSSRulePositions(rule) {\n var positions = [];\n function recurse(childRule, pos) {\n if ((isCSSGroupingRuleSupported &&\n childRule.parentRule instanceof CSSGroupingRule) ||\n (isCSSMediaRuleSupported &&\n childRule.parentRule instanceof CSSMediaRule) ||\n (isCSSSupportsRuleSupported &&\n childRule.parentRule instanceof CSSSupportsRule) ||\n (isCSSConditionRuleSupported &&\n childRule.parentRule instanceof CSSConditionRule)) {\n var rules = Array.from(childRule.parentRule.cssRules);\n var index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n else {\n var rules = Array.from(childRule.parentStyleSheet.cssRules);\n var index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction initStyleSheetObserver(_a, _b) {\n var styleSheetRuleCb = _a.styleSheetRuleCb, mirror = _a.mirror;\n var win = _b.win;\n var insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\n var id = mirror.getId(this.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n adds: [{ rule: rule, index: index }],\n });\n }\n return insertRule.apply(this, arguments);\n };\n var deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\n var id = mirror.getId(this.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n removes: [{ index: index }],\n });\n }\n return deleteRule.apply(this, arguments);\n };\n var supportedNestedCSSRuleTypes = {};\n if (isCSSGroupingRuleSupported) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n }\n else {\n if (isCSSMediaRuleSupported) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (isCSSConditionRuleSupported) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (isCSSSupportsRuleSupported) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n var unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(function (_a) {\n var _b = __read(_a, 2), typeKey = _b[0], type = _b[1];\n unmodifiedFunctions[typeKey] = {\n insertRule: type.prototype.insertRule,\n deleteRule: type.prototype.deleteRule,\n };\n type.prototype.insertRule = function (rule, index) {\n var id = mirror.getId(this.parentStyleSheet.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n adds: [\n {\n rule: rule,\n index: __spreadArray(__spreadArray([], __read(getNestedCSSRulePositions(this)), false), [\n index || 0,\n ], false),\n },\n ],\n });\n }\n return unmodifiedFunctions[typeKey].insertRule.apply(this, arguments);\n };\n type.prototype.deleteRule = function (index) {\n var id = mirror.getId(this.parentStyleSheet.ownerNode);\n if (id !== -1) {\n styleSheetRuleCb({\n id: id,\n removes: [{ index: __spreadArray(__spreadArray([], __read(getNestedCSSRulePositions(this)), false), [index], false) }],\n });\n }\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, arguments);\n };\n });\n return function () {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n Object.entries(supportedNestedCSSRuleTypes).forEach(function (_a) {\n var _b = __read(_a, 2), typeKey = _b[0], type = _b[1];\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n };\n}\nfunction initStyleDeclarationObserver(_a, _b) {\n var styleDeclarationCb = _a.styleDeclarationCb, mirror = _a.mirror;\n var win = _b.win;\n var setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\n var _a, _b;\n var id = mirror.getId((_b = (_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet) === null || _b === void 0 ? void 0 : _b.ownerNode);\n if (id !== -1) {\n styleDeclarationCb({\n id: id,\n set: {\n property: property,\n value: value,\n priority: priority,\n },\n index: getNestedCSSRulePositions(this.parentRule),\n });\n }\n return setProperty.apply(this, arguments);\n };\n var removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\n var _a, _b;\n var id = mirror.getId((_b = (_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet) === null || _b === void 0 ? void 0 : _b.ownerNode);\n if (id !== -1) {\n styleDeclarationCb({\n id: id,\n remove: {\n property: property,\n },\n index: getNestedCSSRulePositions(this.parentRule),\n });\n }\n return removeProperty.apply(this, arguments);\n };\n return function () {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n };\n}\nfunction initMediaInteractionObserver(_a) {\n var mediaInteractionCb = _a.mediaInteractionCb, blockClass = _a.blockClass, mirror = _a.mirror, sampling = _a.sampling;\n var handler = function (type) {\n return throttle(function (event) {\n var target = getEventTarget(event);\n if (!target || isBlocked(target, blockClass)) {\n return;\n }\n var _a = target, currentTime = _a.currentTime, volume = _a.volume, muted = _a.muted;\n mediaInteractionCb({\n type: type,\n id: mirror.getId(target),\n currentTime: currentTime,\n volume: volume,\n muted: muted,\n });\n }, sampling.media || 500);\n };\n var handlers = [\n on('play', handler(0)),\n on('pause', handler(1)),\n on('seeked', handler(2)),\n on('volumechange', handler(3)),\n ];\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction initFontObserver(_a) {\n var fontCb = _a.fontCb, doc = _a.doc;\n var win = doc.defaultView;\n if (!win) {\n return function () { };\n }\n var handlers = [];\n var fontMap = new WeakMap();\n var originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n var fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family: family,\n buffer: typeof source !== 'string',\n descriptors: descriptors,\n fontSource: typeof source === 'string'\n ? source\n :\n JSON.stringify(Array.from(new Uint8Array(source))),\n });\n return fontFace;\n };\n var restoreHandler = patch(doc.fonts, 'add', function (original) {\n return function (fontFace) {\n setTimeout(function () {\n var p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }, 0);\n return original.apply(this, [fontFace]);\n };\n });\n handlers.push(function () {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\nfunction mergeHooks(o, hooks) {\n var mutationCb = o.mutationCb, mousemoveCb = o.mousemoveCb, mouseInteractionCb = o.mouseInteractionCb, scrollCb = o.scrollCb, viewportResizeCb = o.viewportResizeCb, inputCb = o.inputCb, mediaInteractionCb = o.mediaInteractionCb, styleSheetRuleCb = o.styleSheetRuleCb, styleDeclarationCb = o.styleDeclarationCb, canvasMutationCb = o.canvasMutationCb, fontCb = o.fontCb;\n o.mutationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mutation) {\n hooks.mutation.apply(hooks, __spreadArray([], __read(p), false));\n }\n mutationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mousemoveCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mousemove) {\n hooks.mousemove.apply(hooks, __spreadArray([], __read(p), false));\n }\n mousemoveCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mouseInteractionCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mouseInteraction) {\n hooks.mouseInteraction.apply(hooks, __spreadArray([], __read(p), false));\n }\n mouseInteractionCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.scrollCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.scroll) {\n hooks.scroll.apply(hooks, __spreadArray([], __read(p), false));\n }\n scrollCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.viewportResizeCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.viewportResize) {\n hooks.viewportResize.apply(hooks, __spreadArray([], __read(p), false));\n }\n viewportResizeCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.inputCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.input) {\n hooks.input.apply(hooks, __spreadArray([], __read(p), false));\n }\n inputCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.mediaInteractionCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.mediaInteaction) {\n hooks.mediaInteaction.apply(hooks, __spreadArray([], __read(p), false));\n }\n mediaInteractionCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.styleSheetRuleCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.styleSheetRule) {\n hooks.styleSheetRule.apply(hooks, __spreadArray([], __read(p), false));\n }\n styleSheetRuleCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.styleDeclarationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.styleDeclaration) {\n hooks.styleDeclaration.apply(hooks, __spreadArray([], __read(p), false));\n }\n styleDeclarationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.canvasMutationCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.canvasMutation) {\n hooks.canvasMutation.apply(hooks, __spreadArray([], __read(p), false));\n }\n canvasMutationCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n o.fontCb = function () {\n var p = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n p[_i] = arguments[_i];\n }\n if (hooks.font) {\n hooks.font.apply(hooks, __spreadArray([], __read(p), false));\n }\n fontCb.apply(void 0, __spreadArray([], __read(p), false));\n };\n}\nfunction initObservers(o, hooks) {\n var e_1, _a;\n if (hooks === void 0) { hooks = {}; }\n var currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return function () { };\n }\n mergeHooks(o, hooks);\n var mutationObserver = initMutationObserver(o, o.doc);\n var mousemoveHandler = initMoveObserver(o);\n var mouseInteractionHandler = initMouseInteractionObserver(o);\n var scrollHandler = initScrollObserver(o);\n var viewportResizeHandler = initViewportResizeObserver(o);\n var inputHandler = initInputObserver(o);\n var mediaInteractionHandler = initMediaInteractionObserver(o);\n var styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n var styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow,\n });\n var fontObserver = o.collectFonts ? initFontObserver(o) : function () { };\n var pluginHandlers = [];\n try {\n for (var _b = __values(o.plugins), _c = _b.next(); !_c.done; _c = _b.next()) {\n var plugin = _c.value;\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\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 function () {\n mutationBuffers.forEach(function (b) { return b.reset(); });\n mutationObserver.disconnect();\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n pluginHandlers.forEach(function (h) { return h(); });\n };\n}\n\nexport { INPUT_TAGS, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","var IframeManager = (function () {\n function IframeManager(options) {\n this.iframes = new WeakMap();\n this.mutationCb = options.mutationCb;\n }\n IframeManager.prototype.addIframe = function (iframeEl) {\n this.iframes.set(iframeEl, true);\n };\n IframeManager.prototype.addLoadListener = function (cb) {\n this.loadListener = cb;\n };\n IframeManager.prototype.attachIframe = function (iframeEl, childSn) {\n var _a;\n this.mutationCb({\n adds: [\n {\n parentId: iframeEl.__sn.id,\n nextId: null,\n node: childSn,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n });\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\n };\n return IframeManager;\n}());\n\nexport { IframeManager };\n","import { __assign } from '../../ext/tslib/tslib.es6.js';\nimport { initMutationObserver, initScrollObserver } from './observer.js';\nimport { patch } from '../utils.js';\n\nvar ShadowDomManager = (function () {\n function ShadowDomManager(options) {\n this.restorePatches = [];\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n var manager = this;\n this.restorePatches.push(patch(HTMLElement.prototype, 'attachShadow', function (original) {\n return function () {\n var shadowRoot = original.apply(this, arguments);\n if (this.shadowRoot)\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\n return shadowRoot;\n };\n }));\n }\n ShadowDomManager.prototype.addShadowRoot = function (shadowRoot, doc) {\n initMutationObserver(__assign(__assign({}, this.bypassOptions), { doc: doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\n initScrollObserver(__assign(__assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\n };\n ShadowDomManager.prototype.observeAttachShadow = function (iframeElement) {\n if (iframeElement.contentWindow) {\n var manager_1 = this;\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\n return function () {\n var shadowRoot = original.apply(this, arguments);\n if (this.shadowRoot)\n manager_1.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\n return shadowRoot;\n };\n }));\n }\n };\n ShadowDomManager.prototype.reset = function () {\n this.restorePatches.forEach(function (restorePatch) { return restorePatch(); });\n };\n return ShadowDomManager;\n}());\n\nexport { ShadowDomManager };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { encode } from '../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nvar webGLVarMap = new Map();\nfunction variableListFor(ctx, ctor) {\n var contextMap = webGLVarMap.get(ctx);\n if (!contextMap) {\n contextMap = new Map();\n webGLVarMap.set(ctx, contextMap);\n }\n if (!contextMap.has(ctor)) {\n contextMap.set(ctor, []);\n }\n return contextMap.get(ctor);\n}\nvar saveWebGLVar = function (value, win, ctx) {\n if (!value ||\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\n return;\n var name = value.constructor.name;\n var list = variableListFor(ctx, name);\n var index = list.indexOf(value);\n if (index === -1) {\n index = list.length;\n list.push(value);\n }\n return index;\n};\nfunction serializeArg(value, win, ctx) {\n if (value instanceof Array) {\n return value.map(function (arg) { return serializeArg(arg, win, ctx); });\n }\n else if (value === null) {\n return value;\n }\n else if (value instanceof Float32Array ||\n value instanceof Float64Array ||\n value instanceof Int32Array ||\n value instanceof Uint32Array ||\n value instanceof Uint8Array ||\n value instanceof Uint16Array ||\n value instanceof Int16Array ||\n value instanceof Int8Array ||\n value instanceof Uint8ClampedArray) {\n var name_1 = value.constructor.name;\n return {\n rr_type: name_1,\n args: [Object.values(value)],\n };\n }\n else if (value instanceof ArrayBuffer) {\n var name_2 = value.constructor.name;\n var base64 = encode(value);\n return {\n rr_type: name_2,\n base64: base64,\n };\n }\n else if (value instanceof DataView) {\n var name_3 = value.constructor.name;\n return {\n rr_type: name_3,\n args: [\n serializeArg(value.buffer, win, ctx),\n value.byteOffset,\n value.byteLength,\n ],\n };\n }\n else if (value instanceof HTMLImageElement) {\n var name_4 = value.constructor.name;\n var src = value.src;\n return {\n rr_type: name_4,\n src: src,\n };\n }\n else if (value instanceof ImageData) {\n var name_5 = value.constructor.name;\n return {\n rr_type: name_5,\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\n };\n }\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\n var name_6 = value.constructor.name;\n var index = saveWebGLVar(value, win, ctx);\n return {\n rr_type: name_6,\n index: index,\n };\n }\n return value;\n}\nvar serializeArgs = function (args, win, ctx) {\n return __spreadArray([], __read(args), false).map(function (arg) { return serializeArg(arg, win, ctx); });\n};\nvar isInstanceOfWebGLObject = function (value, win) {\n var webGLConstructorNames = [\n 'WebGLActiveInfo',\n 'WebGLBuffer',\n 'WebGLFramebuffer',\n 'WebGLProgram',\n 'WebGLRenderbuffer',\n 'WebGLShader',\n 'WebGLShaderPrecisionFormat',\n 'WebGLTexture',\n 'WebGLUniformLocation',\n 'WebGLVertexArrayObject',\n 'WebGLVertexArrayObjectOES',\n ];\n var supportedWebGLConstructorNames = webGLConstructorNames.filter(function (name) { return typeof win[name] === 'function'; });\n return Boolean(supportedWebGLConstructorNames.find(function (name) { return value instanceof win[name]; }));\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { __spreadArray, __read, __values } from '../../../../ext/tslib/tslib.es6.js';\nimport { CanvasContext } from '../../../types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, mirror, win) {\n var e_1, _a;\n var handlers = [];\n var props = Object.getOwnPropertyNames(prototype);\n var _loop_1 = function (prop) {\n try {\n if (typeof prototype[prop] !== 'function') {\n return \"continue\";\n }\n var restoreHandler = patch(prototype, prop, function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var result = original.apply(this, args);\n saveWebGLVar(result, win, prototype);\n if (!isBlocked(this.canvas, blockClass)) {\n var id = mirror.getId(this.canvas);\n var recordArgs = serializeArgs(__spreadArray([], __read(args), false), win, prototype);\n var mutation = {\n type: type,\n property: prop,\n args: recordArgs,\n };\n cb(this.canvas, mutation);\n }\n return result;\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_b) {\n var hookHandler = hookSetter(prototype, prop, {\n set: function (v) {\n cb(this.canvas, {\n type: type,\n property: prop,\n args: [v],\n setter: true,\n });\n },\n });\n handlers.push(hookHandler);\n }\n };\n try {\n for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {\n var prop = props_1_1.value;\n _loop_1(prop);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return handlers;\n}\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, mirror) {\n var handlers = [];\n handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, mirror, win)), false));\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\n handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, mirror, win)), false));\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvasWebGLMutationObserver;\n","import { __rest } from '../../../../ext/tslib/tslib.es6.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\n\nvar CanvasManager = (function () {\n function CanvasManager(options) {\n this.pendingCanvasMutations = new Map();\n this.rafStamps = { latestId: 0, invokeId: null };\n this.frozen = false;\n this.locked = false;\n this.processMutation = function (target, mutation) {\n var newFrame = this.rafStamps.invokeId &&\n this.rafStamps.latestId !== this.rafStamps.invokeId;\n if (newFrame || !this.rafStamps.invokeId)\n this.rafStamps.invokeId = this.rafStamps.latestId;\n if (!this.pendingCanvasMutations.has(target)) {\n this.pendingCanvasMutations.set(target, []);\n }\n this.pendingCanvasMutations.get(target).push(mutation);\n };\n this.mutationCb = options.mutationCb;\n this.mirror = options.mirror;\n if (options.recordCanvas === true)\n this.initCanvasMutationObserver(options.win, options.blockClass);\n }\n CanvasManager.prototype.reset = function () {\n this.pendingCanvasMutations.clear();\n this.resetObservers && this.resetObservers();\n };\n CanvasManager.prototype.freeze = function () {\n this.frozen = true;\n };\n CanvasManager.prototype.unfreeze = function () {\n this.frozen = false;\n };\n CanvasManager.prototype.lock = function () {\n this.locked = true;\n };\n CanvasManager.prototype.unlock = function () {\n this.locked = false;\n };\n CanvasManager.prototype.initCanvasMutationObserver = function (win, blockClass) {\n this.startRAFTimestamping();\n this.startPendingCanvasMutationFlusher();\n var canvasContextReset = initCanvasContextObserver(win, blockClass);\n var canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);\n var canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);\n this.resetObservers = function () {\n canvasContextReset();\n canvas2DReset();\n canvasWebGL1and2Reset();\n };\n };\n CanvasManager.prototype.startPendingCanvasMutationFlusher = function () {\n var _this = this;\n requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });\n };\n CanvasManager.prototype.startRAFTimestamping = function () {\n var _this = this;\n var setLatestRAFTimestamp = function (timestamp) {\n _this.rafStamps.latestId = timestamp;\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n CanvasManager.prototype.flushPendingCanvasMutations = function () {\n var _this = this;\n this.pendingCanvasMutations.forEach(function (values, canvas) {\n var id = _this.mirror.getId(canvas);\n _this.flushPendingCanvasMutationFor(canvas, id);\n });\n requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });\n };\n CanvasManager.prototype.flushPendingCanvasMutationFor = function (canvas, id) {\n if (this.frozen || this.locked) {\n return;\n }\n var valuesWithType = this.pendingCanvasMutations.get(canvas);\n if (!valuesWithType || id === -1)\n return;\n var values = valuesWithType.map(function (value) {\n value.type; var rest = __rest(value, [\"type\"]);\n return rest;\n });\n var type = valuesWithType[0].type;\n this.mutationCb({ id: id, type: type, commands: values });\n this.pendingCanvasMutations.delete(canvas);\n };\n return CanvasManager;\n}());\n\nexport { CanvasManager };\n","import { __assign, __read, __values } from '../../ext/tslib/tslib.es6.js';\nimport { snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, createMirror, getWindowWidth, getWindowHeight, isIframeINode, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\n\nfunction wrapEvent(e) {\n return __assign(__assign({}, e), { timestamp: Date.now() });\n}\nvar wrappedEmit;\nvar takeFullSnapshot;\nvar mirror = createMirror();\nfunction record(options) {\n if (options === void 0) { options = {}; }\n var emit = options.emit, checkoutEveryNms = options.checkoutEveryNms, checkoutEveryNth = options.checkoutEveryNth, _a = options.blockClass, blockClass = _a === void 0 ? 'rr-block' : _a, _b = options.blockSelector, blockSelector = _b === void 0 ? null : _b, _c = options.ignoreClass, ignoreClass = _c === void 0 ? 'rr-ignore' : _c, _d = options.maskTextClass, maskTextClass = _d === void 0 ? 'rr-mask' : _d, _e = options.maskTextSelector, maskTextSelector = _e === void 0 ? null : _e, _f = options.inlineStylesheet, inlineStylesheet = _f === void 0 ? true : _f, maskAllInputs = options.maskAllInputs, _maskInputOptions = options.maskInputOptions, _slimDOMOptions = options.slimDOMOptions, maskInputFn = options.maskInputFn, maskTextFn = options.maskTextFn, hooks = options.hooks, packFn = options.packFn, _g = options.sampling, sampling = _g === void 0 ? {} : _g, mousemoveWait = options.mousemoveWait, _h = options.recordCanvas, recordCanvas = _h === void 0 ? false : _h, _j = options.userTriggeredOnInput, userTriggeredOnInput = _j === void 0 ? false : _j, _k = options.collectFonts, collectFonts = _k === void 0 ? false : _k, _l = options.inlineImages, inlineImages = _l === void 0 ? false : _l, plugins = options.plugins, _m = options.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\n if (!emit) {\n throw new Error('emit function is required');\n }\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\n sampling.mousemove = mousemoveWait;\n }\n var maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true,\n }\n : _maskInputOptions !== undefined\n ? _maskInputOptions\n : { password: true };\n var slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\n ? {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n headMetaAuthorship: _slimDOMOptions === 'all',\n headMetaDescKeywords: _slimDOMOptions === 'all',\n }\n : _slimDOMOptions\n ? _slimDOMOptions\n : {};\n polyfill();\n var lastFullSnapshotEvent;\n var incrementalSnapshotCount = 0;\n var eventProcessor = function (e) {\n var e_1, _a;\n try {\n for (var _b = __values(plugins || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var plugin = _c.value;\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\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 if (packFn) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = function (e, isCheckout) {\n var _a;\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\n e.type !== EventType.FullSnapshot &&\n !(e.type === EventType.IncrementalSnapshot &&\n e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach(function (buf) { return buf.unfreeze(); });\n }\n emit(eventProcessor(e), isCheckout);\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n }\n else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation &&\n e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n var exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n var exceedTime = checkoutEveryNms &&\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n var wrappedMutationEmit = function (m) {\n wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Mutation }, m),\n }));\n };\n var wrappedScrollEmit = function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Scroll }, p),\n }));\n };\n var wrappedCanvasMutationEmit = function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.CanvasMutation }, p),\n }));\n };\n var iframeManager = new IframeManager({\n mutationCb: wrappedMutationEmit,\n });\n var canvasManager = new CanvasManager({\n recordCanvas: recordCanvas,\n mutationCb: wrappedCanvasMutationEmit,\n win: window,\n blockClass: blockClass,\n mirror: mirror,\n });\n var shadowDomManager = new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskInputOptions: maskInputOptions,\n maskTextFn: maskTextFn,\n maskInputFn: maskInputFn,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n sampling: sampling,\n slimDOMOptions: slimDOMOptions,\n iframeManager: iframeManager,\n canvasManager: canvasManager,\n },\n mirror: mirror,\n });\n takeFullSnapshot = function (isCheckout) {\n var _a, _b, _c, _d;\n if (isCheckout === void 0) { isCheckout = false; }\n wrappedEmit(wrapEvent({\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight(),\n },\n }), isCheckout);\n mutationBuffers.forEach(function (buf) { return buf.lock(); });\n var _e = __read(snapshot(document, {\n blockClass: blockClass,\n blockSelector: blockSelector,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n inlineStylesheet: inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskTextFn: maskTextFn,\n slimDOM: slimDOMOptions,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n onSerialize: function (n) {\n if (isIframeINode(n)) {\n iframeManager.addIframe(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: function (iframe, childSn) {\n iframeManager.attachIframe(iframe, childSn);\n shadowDomManager.observeAttachShadow(iframe);\n },\n keepIframeSrcFn: keepIframeSrcFn,\n }), 2), node = _e[0], idNodeMap = _e[1];\n if (!node) {\n return console.warn('Failed to snapshot the document');\n }\n mirror.map = idNodeMap;\n wrappedEmit(wrapEvent({\n type: EventType.FullSnapshot,\n data: {\n node: node,\n initialOffset: {\n left: window.pageXOffset !== undefined\n ? window.pageXOffset\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\n (document === null || document === void 0 ? void 0 : document.body.scrollLeft) ||\n 0,\n top: window.pageYOffset !== undefined\n ? window.pageYOffset\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\n ((_d = (_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.parentElement) === null || _d === void 0 ? void 0 : _d.scrollTop) ||\n (document === null || document === void 0 ? void 0 : document.body.scrollTop) ||\n 0,\n },\n },\n }));\n mutationBuffers.forEach(function (buf) { return buf.unlock(); });\n };\n try {\n var handlers_1 = [];\n handlers_1.push(on('DOMContentLoaded', function () {\n wrappedEmit(wrapEvent({\n type: EventType.DomContentLoaded,\n data: {},\n }));\n }));\n var observe_1 = function (doc) {\n var _a;\n return initObservers({\n mutationCb: wrappedMutationEmit,\n mousemoveCb: function (positions, source) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: {\n source: source,\n positions: positions,\n },\n }));\n },\n mouseInteractionCb: function (d) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.MouseInteraction }, d),\n }));\n },\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: function (d) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.ViewportResize }, d),\n }));\n },\n inputCb: function (v) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Input }, v),\n }));\n },\n mediaInteractionCb: function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.MediaInteraction }, p),\n }));\n },\n styleSheetRuleCb: function (r) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.StyleSheetRule }, r),\n }));\n },\n styleDeclarationCb: function (r) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.StyleDeclaration }, r),\n }));\n },\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: function (p) {\n return wrappedEmit(wrapEvent({\n type: EventType.IncrementalSnapshot,\n data: __assign({ source: IncrementalSource.Font }, p),\n }));\n },\n blockClass: blockClass,\n ignoreClass: ignoreClass,\n maskTextClass: maskTextClass,\n maskTextSelector: maskTextSelector,\n maskInputOptions: maskInputOptions,\n inlineStylesheet: inlineStylesheet,\n sampling: sampling,\n recordCanvas: recordCanvas,\n inlineImages: inlineImages,\n userTriggeredOnInput: userTriggeredOnInput,\n collectFonts: collectFonts,\n doc: doc,\n maskInputFn: maskInputFn,\n maskTextFn: maskTextFn,\n blockSelector: blockSelector,\n slimDOMOptions: slimDOMOptions,\n mirror: mirror,\n iframeManager: iframeManager,\n shadowDomManager: shadowDomManager,\n canvasManager: canvasManager,\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter(function (p) { return p.observer; })) === null || _a === void 0 ? void 0 : _a.map(function (p) { return ({\n observer: p.observer,\n options: p.options,\n callback: function (payload) {\n return wrappedEmit(wrapEvent({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload: payload,\n },\n }));\n },\n }); })) || [],\n }, hooks);\n };\n iframeManager.addLoadListener(function (iframeEl) {\n handlers_1.push(observe_1(iframeEl.contentDocument));\n });\n var init_1 = function () {\n takeFullSnapshot();\n handlers_1.push(observe_1(document));\n };\n if (document.readyState === 'interactive' ||\n document.readyState === 'complete') {\n init_1();\n }\n else {\n handlers_1.push(on('load', function () {\n wrappedEmit(wrapEvent({\n type: EventType.Load,\n data: {},\n }));\n init_1();\n }, window));\n }\n return function () {\n handlers_1.forEach(function (h) { return h(); });\n };\n }\n catch (error) {\n console.warn(error);\n }\n}\nrecord.addCustomEvent = function (tag, payload) {\n if (!wrappedEmit) {\n throw new Error('please add custom event after start recording');\n }\n wrappedEmit(wrapEvent({\n type: EventType.Custom,\n data: {\n tag: tag,\n payload: payload,\n },\n }));\n};\nrecord.freezePage = function () {\n mutationBuffers.forEach(function (buf) { return buf.freeze(); });\n};\nrecord.takeFullSnapshot = function (isCheckout) {\n if (!takeFullSnapshot) {\n throw new Error('please take full snapshot after start recording');\n }\n takeFullSnapshot(isCheckout);\n};\nrecord.mirror = mirror;\n\nexport default record;\n","import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass) {\n var handlers = [];\n try {\n var restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\n return function (contextType) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (!isBlocked(this, blockClass)) {\n if (!('__context' in this))\n this.__context = contextType;\n }\n return original.apply(this, __spreadArray([contextType], __read(args), false));\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_a) {\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvasContextObserver;\n","import { __values, __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { CanvasContext } from '../../../types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, mirror) {\n var e_1, _a;\n var handlers = [];\n var props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\n var _loop_1 = function (prop) {\n try {\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\n return \"continue\";\n }\n var restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\n return function () {\n var _this = this;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!isBlocked(this.canvas, blockClass)) {\n setTimeout(function () {\n var recordArgs = __spreadArray([], __read(args), false);\n if (prop === 'drawImage') {\n if (recordArgs[0] &&\n recordArgs[0] instanceof HTMLCanvasElement) {\n var canvas = recordArgs[0];\n var ctx = canvas.getContext('2d');\n var imgd = ctx === null || ctx === void 0 ? void 0 : ctx.getImageData(0, 0, canvas.width, canvas.height);\n var pix = imgd === null || imgd === void 0 ? void 0 : imgd.data;\n recordArgs[0] = JSON.stringify(pix);\n }\n }\n cb(_this.canvas, {\n type: CanvasContext['2D'],\n property: prop,\n args: recordArgs,\n });\n }, 0);\n }\n return original.apply(this, args);\n };\n });\n handlers.push(restoreHandler);\n }\n catch (_b) {\n var hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\n set: function (v) {\n cb(this.canvas, {\n type: CanvasContext['2D'],\n property: prop,\n args: [v],\n setter: true,\n });\n },\n });\n handlers.push(hookHandler);\n }\n };\n try {\n for (var props2D_1 = __values(props2D), props2D_1_1 = props2D_1.next(); !props2D_1_1.done; props2D_1_1 = props2D_1.next()) {\n var prop = props2D_1_1.value;\n _loop_1(prop);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (props2D_1_1 && !props2D_1_1.done && (_a = props2D_1.return)) _a.call(props2D_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return function () {\n handlers.forEach(function (h) { return h(); });\n };\n}\n\nexport default initCanvas2DMutationObserver;\n","var StackFrame = (function () {\n function StackFrame(obj) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n StackFrame.prototype.toString = function () {\n var lineNumber = this.lineNumber || '';\n var columnNumber = this.columnNumber || '';\n if (this.functionName) {\n return (this.functionName +\n ' (' +\n this.fileName +\n ':' +\n lineNumber +\n ':' +\n columnNumber +\n ')');\n }\n return this.fileName + ':' + lineNumber + ':' + columnNumber;\n };\n return StackFrame;\n}());\nvar FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nvar CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nvar SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nvar ErrorStackParser = {\n parse: function (error) {\n if (!error) {\n return [];\n }\n if (typeof error.stacktrace !== 'undefined' ||\n typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n }\n else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n }\n else if (error.stack) {\n return this.parseFFOrSafari(error);\n }\n else {\n throw new Error('Cannot parse given Error object');\n }\n },\n extractLocation: function (urlLike) {\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n var regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts)\n throw new Error(\"Cannot parse given url: \".concat(urlLike));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n var sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n var location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n var tokens = sanitizedLine.split(/\\s+/).slice(1);\n var locationParts = this.extractLocation(location ? location[1] : tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n return new StackFrame({\n functionName: functionName,\n fileName: fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n return filtered.map(function (line) {\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, ':$1');\n }\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n return new StackFrame({\n functionName: line,\n });\n }\n else {\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n var matches = line.match(functionNameRegex);\n var functionName = matches && matches[1] ? matches[1] : undefined;\n var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e) {\n if (!e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n }\n else if (!e.stack) {\n return this.parseOpera10(e);\n }\n else {\n return this.parseOpera11(e);\n }\n },\n parseOpera9: function (e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }));\n }\n }\n return result;\n },\n parseOpera10: function (e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }));\n }\n }\n return result;\n },\n parseOpera11: function (error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return (!!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/));\n }, this);\n return filtered.map(function (line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = tokens.shift() || '';\n var functionName = functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n\nexport { ErrorStackParser, StackFrame };\n","import { __values } from '../../../../ext/tslib/tslib.es6.js';\n\nfunction pathToSelector(node) {\n if (!node || !node.outerHTML) {\n return '';\n }\n var path = '';\n while (node.parentElement) {\n var name_1 = node.localName;\n if (!name_1) {\n break;\n }\n name_1 = name_1.toLowerCase();\n var parent_1 = node.parentElement;\n var domSiblings = [];\n if (parent_1.children && parent_1.children.length > 0) {\n for (var i = 0; i < parent_1.children.length; i++) {\n var sibling = parent_1.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name_1) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n if (domSiblings.length > 1) {\n name_1 += ':eq(' + domSiblings.indexOf(node) + ')';\n }\n path = name_1 + (path ? '>' + path : '');\n node = parent_1;\n }\n return path;\n}\nfunction isObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\nfunction isObjTooDeep(obj, limit) {\n var e_1, _a;\n if (limit === 0) {\n return true;\n }\n var keys = Object.keys(obj);\n try {\n for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {\n var key = keys_1_1.value;\n if (isObject(obj[key]) && isObjTooDeep(obj[key], limit - 1)) {\n return true;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return false;\n}\nfunction stringify(obj, stringifyOptions) {\n var options = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n var stack = [];\n var keys = [];\n return JSON.stringify(obj, function (key, value) {\n if (stack.length > 0) {\n var thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n }\n else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n }\n else {\n stack.push(value);\n }\n if (value === null || value === undefined) {\n return value;\n }\n if (shouldIgnore(value)) {\n return toString(value);\n }\n if (value instanceof Event) {\n var eventResult = {};\n for (var eventKey in value) {\n var eventValue = value[eventKey];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(eventValue.length ? eventValue[0] : null);\n }\n else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n }\n else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n }\n else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n });\n function shouldIgnore(_obj) {\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n if (typeof _obj === 'function') {\n return true;\n }\n if (isObject(_obj) && isObjTooDeep(_obj, options.depthOfLimit)) {\n return true;\n }\n return false;\n }\n function toString(_obj) {\n var str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = \"\".concat(str.slice(0, options.stringLengthLimit), \"...\");\n }\n return str;\n }\n}\n\nexport { stringify };\n","import { __values, __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';\nimport { patch } from '../../../utils.js';\nimport { ErrorStackParser } from './error-stack-parser.js';\nimport { stringify } from './stringify.js';\n\nvar defaultLogOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\nfunction initLogObserver(cb, win, logOptions) {\n var e_1, _a;\n var loggerType = logOptions.logger;\n if (!loggerType) {\n return function () { };\n }\n var logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n }\n else {\n logger = loggerType;\n }\n var logCount = 0;\n var cancelHandlers = [];\n if (logOptions.level.includes('error')) {\n if (window) {\n var errorHandler_1 = function (event) {\n var message = event.message, error = event.error;\n var trace = ErrorStackParser.parse(error).map(function (stackFrame) { return stackFrame.toString(); });\n var payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace: trace,\n payload: payload,\n });\n };\n window.addEventListener('error', errorHandler_1);\n cancelHandlers.push(function () {\n if (window)\n window.removeEventListener('error', errorHandler_1);\n });\n }\n }\n try {\n for (var _b = __values(logOptions.level), _c = _b.next(); !_c.done; _c = _b.next()) {\n var levelType = _c.value;\n cancelHandlers.push(replace(logger, levelType));\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 function () {\n cancelHandlers.forEach(function (h) { return h(); });\n };\n function replace(_logger, level) {\n var _this = this;\n if (!_logger[level]) {\n return function () { };\n }\n return patch(_logger, level, function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n original.apply(_this, args);\n try {\n var trace = ErrorStackParser.parse(new Error())\n .map(function (stackFrame) { return stackFrame.toString(); })\n .splice(1);\n var payload = args.map(function (s) {\n return stringify(s, logOptions.stringifyOptions);\n });\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level: level,\n trace: trace,\n payload: payload,\n });\n }\n else if (logCount === logOptions.lengthThreshold) {\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n }\n catch (error) {\n original.apply(void 0, __spreadArray(['rrweb logger error:', error], __read(args), false));\n }\n };\n });\n }\n}\nvar PLUGIN_NAME = 'rrweb/console@1';\nvar getRecordConsolePlugin = function (options) { return ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options\n ? Object.assign({}, defaultLogOptions, options)\n : defaultLogOptions,\n}); };\n\nexport { PLUGIN_NAME, getRecordConsolePlugin };\n","import { version } from 'rrweb-v1/package.json'\n\n// Same as loader-globals.ts except includes rrweb scripts.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport rrwebRecord from 'rrweb-v1/es/rrweb/packages/rrweb/src/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { getRecordConsolePlugin } from 'rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\n\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\n\n;(win as any).rrweb = { record: rrwebRecord, version: 'v1', rrwebVersion: version }\n;(win as any).rrwebConsoleRecord = { getRecordConsolePlugin }\n\nexport default rrwebRecord\n","import { version } from '../package.json'\n\n// overriden in posthog-core,\n// e.g. Config.DEBUG = Config.DEBUG || instance.get_config('debug')\nconst Config = {\n DEBUG: false,\n LIB_VERSION: version,\n}\n\nexport default Config\n","import Config from './config'\nimport { Breaker, EventHandler, Properties } from './types'\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\nconst ArrayProto = Array.prototype\nconst ObjProto = Object.prototype\nconst toString = ObjProto.toString\nconst hasOwnProperty = ObjProto.hasOwnProperty\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\nconst navigator = win.navigator || { userAgent: '' }\nconst document = win.document || {}\nconst userAgent = navigator.userAgent\nconst localDomains = ['localhost', '127.0.0.1']\n\nconst nativeForEach = ArrayProto.forEach,\n nativeIndexOf = ArrayProto.indexOf,\n nativeIsArray = Array.isArray,\n breaker: Breaker = {}\n\n// Console override\nconst logger = {\n /** @type {function(...*)} */\n log: function (...args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n // Don't log PostHog debug messages in rrweb\n const log =\n '__rrweb_original__' in window.console.log\n ? (window.console.log as any)['__rrweb_original__']\n : window.console.log\n\n try {\n log.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n log(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n error: function (..._args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n critical: function (..._args: any[]) {\n if (!_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n unintializedWarning: function (methodName: string): void {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n logger.error(`[PostHog] You must initialize PostHog before calling ${methodName}`)\n }\n },\n}\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nexport const _trim = function (str: string): string {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n}\n\nexport const _bind_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = obj[func].bind(obj)\n }\n }\n}\n\nexport function _eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (Array.isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function _each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (obj === null || obj === undefined) {\n return\n }\n if (Array.isArray(obj)) {\n return _eachArray(obj, iterator, thisArg)\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const _extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n _eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\n\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\n}\n\nexport const _include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (obj === null) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n _each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\nexport function _includes<T = any>(str: T[] | string, needle: T): boolean {\n return (str as any).indexOf(needle) !== -1\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function _entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\n// Underscore Addons\nexport const _isObject = function (obj: any): obj is Record<string, any> {\n return obj === Object(obj) && !_isArray(obj)\n}\n\nexport const _isEmptyObject = function (obj: any): obj is Record<string, any> {\n if (_isObject(obj)) {\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\n\nexport const _isUndefined = function (obj: any): obj is undefined {\n return obj === void 0\n}\n\nexport const _isString = function (obj: any): obj is string {\n return toString.call(obj) == '[object String]'\n}\n\nexport const _isDate = function (obj: any): obj is Date {\n return toString.call(obj) == '[object Date]'\n}\n\nexport const _isNumber = function (obj: any): obj is number {\n return toString.call(obj) == '[object Number]'\n}\n\nexport const _encodeDates = function (obj: Properties): Properties {\n _each(obj, function (v, k) {\n if (_isDate(v)) {\n obj[k] = _formatDate(v)\n } else if (_isObject(v)) {\n obj[k] = _encodeDates(v) // recurse\n }\n })\n return obj\n}\n\nexport const _timestamp = function (): number {\n Date.now =\n Date.now ||\n function () {\n return +new Date()\n }\n return Date.now()\n}\n\nexport const _formatDate = function (d: Date): string {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n: number) {\n return n < 10 ? '0' + n : n\n }\n return (\n d.getUTCFullYear() +\n '-' +\n pad(d.getUTCMonth() + 1) +\n '-' +\n pad(d.getUTCDate()) +\n 'T' +\n pad(d.getUTCHours()) +\n ':' +\n pad(d.getUTCMinutes()) +\n ':' +\n pad(d.getUTCSeconds())\n )\n}\n\nexport const _safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical('Implementation error. Please turn on debug and contact support@posthog.com.')\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const _safewrap_class = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = _safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const _safewrap_instance_methods = function (obj: Record<string, any>): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = _safewrap(obj[func])\n }\n }\n}\n\nexport const _strip_empty_properties = function (p: Properties): Properties {\n const ret: Properties = {}\n _each(p, function (v, k) {\n if (_isString(v) && v.length > 0) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (_isArray(value)) {\n result = [] as any as T\n _eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n _each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nconst LONG_STRINGS_ALLOW_LIST = ['$performance_raw']\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any, key) => {\n if (key && LONG_STRINGS_ALLOW_LIST.indexOf(key as string) > -1) {\n return value\n }\n if (typeof value === 'string' && maxStringLength !== null) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\nexport function _base64Encode(data: null): null\nexport function _base64Encode(data: undefined): undefined\nexport function _base64Encode(data: string): string\nexport function _base64Encode(data: string | null | undefined): string | null | undefined {\n const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let o1,\n o2,\n o3,\n h1,\n h2,\n h3,\n h4,\n bits,\n i = 0,\n ac = 0,\n enc = ''\n const tmp_arr: string[] = []\n\n if (!data) {\n return data\n }\n\n data = _utf8Encode(data)\n\n do {\n // pack three octets into four hexets\n o1 = data.charCodeAt(i++)\n o2 = data.charCodeAt(i++)\n o3 = data.charCodeAt(i++)\n\n bits = (o1 << 16) | (o2 << 8) | o3\n\n h1 = (bits >> 18) & 0x3f\n h2 = (bits >> 12) & 0x3f\n h3 = (bits >> 6) & 0x3f\n h4 = bits & 0x3f\n\n // use hexets to index into b64, and append result to encoded string\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)\n } while (i < data.length)\n\n enc = tmp_arr.join('')\n\n switch (data.length % 3) {\n case 1:\n enc = enc.slice(0, -2) + '=='\n break\n case 2:\n enc = enc.slice(0, -1) + '='\n break\n }\n\n return enc\n}\n\nexport const _utf8Encode = function (string: string): string {\n string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\n let utftext = '',\n start,\n end\n let stringl = 0,\n n\n\n start = end = 0\n stringl = string.length\n\n for (n = 0; n < stringl; n++) {\n const c1 = string.charCodeAt(n)\n let enc = null\n\n if (c1 < 128) {\n end++\n } else if (c1 > 127 && c1 < 2048) {\n enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128)\n } else {\n enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128)\n }\n if (enc !== null) {\n if (end > start) {\n utftext += string.substring(start, end)\n }\n utftext += enc\n start = end = n + 1\n }\n }\n\n if (end > start) {\n utftext += string.substring(start, string.length)\n }\n\n return utftext\n}\n\nexport const DEFAULT_BLOCKED_UA_STRS = [\n 'ahrefsbot',\n 'applebot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'bot.htm',\n 'bot.php',\n 'crawler',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'gptbot',\n 'hubspot',\n 'linkedinbot',\n 'mj12bot',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'semrushbot',\n 'sitebulb',\n 'twitterbot',\n 'yahoo! slurp',\n 'yandexbot',\n\n // a whole bunch of goog-specific crawlers\n // https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers\n 'adsbot-google',\n 'apis-google',\n 'duplexweb-google',\n 'feedfetcher-google',\n 'google favicon',\n 'google web preview',\n 'google-read-aloud',\n 'googlebot',\n 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n]\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false capturing data\nexport const _isBlockedUA = function (ua: string, customBlockedUserAgents: string[]): boolean {\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents).some((blockedUA) => {\n if (ua.includes) {\n return ua.includes(blockedUA)\n } else {\n // IE 11 :/\n return ua.indexOf(blockedUA) !== -1\n }\n })\n}\n\n/**\n * @param {Object=} formdata\n * @param {string=} arg_separator\n */\nexport const _HTTPBuildQuery = function (formdata: Record<string, any>, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n use_val = encodeURIComponent(val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\nexport const _getQueryParam = function (url: string, param: string): string {\n // Expects a raw URL\n\n const cleanParam = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]')\n const regexS = '[\\\\?&]' + cleanParam + '=([^&#]*)'\n const regex = new RegExp(regexS)\n const results = regex.exec(url)\n if (results === null || (results && typeof results[1] !== 'string' && (results[1] as any).length)) {\n return ''\n } else {\n let result = results[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const _register_event = (function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from PostHog\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n const register_event = function (\n element: Element | Window | Document | Node,\n type: string,\n handler: EventHandler,\n oldSchool?: boolean,\n useCapture?: boolean\n ) {\n if (!element) {\n logger.error('No valid element provided to register_event')\n return\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture)\n } else {\n const ontype = 'on' + type\n const old_handler = (element as any)[ontype] // can be undefined\n ;(element as any)[ontype] = makeHandler(element, handler, old_handler)\n }\n }\n\n function makeHandler(\n element: Element | Window | Document | Node,\n new_handler: EventHandler,\n old_handlers: EventHandler\n ) {\n return function (event: Event): boolean | void {\n event = event || fixEvent(window.event)\n\n // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n if (!event) {\n return undefined\n }\n\n let ret = true\n let old_result: any\n\n if (_isFunction(old_handlers)) {\n old_result = old_handlers(event)\n }\n const new_result = new_handler.call(element, event)\n\n if (false === old_result || false === new_result) {\n ret = false\n }\n\n return ret\n }\n }\n\n function fixEvent(event: Event | undefined): Event | undefined {\n if (event) {\n event.preventDefault = fixEvent.preventDefault\n event.stopPropagation = fixEvent.stopPropagation\n }\n return event\n }\n fixEvent.preventDefault = function () {\n ;(this as any as Event).returnValue = false\n }\n fixEvent.stopPropagation = function () {\n ;(this as any as Event).cancelBubble = true\n }\n\n return register_event\n})()\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n\nexport function loadScript(scriptUrlToLoad: string, callback: (error?: string | Event, event?: Event) => void): void {\n const addScript = () => {\n const scriptTag = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.src = scriptUrlToLoad\n scriptTag.onload = (event) => callback(undefined, event)\n scriptTag.onerror = (error) => callback(error)\n\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n // In exceptional situations this call might load before the DOM is fully ready.\n document.body.appendChild(scriptTag)\n }\n }\n\n if (document.body) {\n addScript()\n } else {\n document.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\nexport const _info = {\n campaignParams: function (customParams?: string[]): Record<string, any> {\n const campaign_keywords = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gclid',\n 'fbclid',\n 'msclkid',\n ].concat(customParams || [])\n\n const params: Record<string, any> = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = _getQueryParam(document.URL, kwkey)\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (): string | null {\n const referrer = document.referrer\n if (!referrer) {\n return null\n } else if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (): Record<string, any> {\n const search = _info.searchEngine(),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record<string, any> = {}\n\n if (search !== null) {\n ret['$search_engine'] = search\n\n const keyword = _getQueryParam(document.referrer, param)\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple')) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n */\n browserVersion: function (userAgent: string, vendor: string, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexs = {\n 'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n 'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n Chrome: /Chrome\\/(\\d+(\\.\\d+)?)/,\n 'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n 'UC Browser': /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n Safari: /Version\\/(\\d+(\\.\\d+)?)/,\n 'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n Opera: /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n Firefox: /Firefox\\/(\\d+(\\.\\d+)?)/,\n 'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n Konqueror: /Konqueror:(\\d+(\\.\\d+)?)/,\n BlackBerry: /BlackBerry (\\d+(\\.\\d+)?)/,\n 'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n 'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n 'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n Mozilla: /rv:(\\d+(\\.\\d+)?)/,\n }\n const regex: RegExp | undefined = versionRegexs[browser as keyof typeof versionRegexs]\n if (regex === undefined) {\n return null\n }\n const matches = userAgent.match(regex)\n if (!matches) {\n return null\n }\n return parseFloat(matches[matches.length - 2])\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n },\n\n os: function (user_agent: string): { os_name: string; os_version: string } {\n if (/Windows/i.test(user_agent)) {\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return { os_name: 'Windows Phone', os_version: '' }\n }\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent)\n if (match && match[1]) {\n const version = match[1]\n return { os_name: 'Windows', os_version: version }\n }\n return { os_name: 'Windows', os_version: '' }\n } else if (/(iPhone|iPad|iPod)/.test(user_agent)) {\n const match = /OS (\\d+)_(\\d+)_?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'iOS', os_version: versionParts.join('.') }\n }\n return { os_name: 'iOS', os_version: '' }\n } else if (/Android/.test(user_agent)) {\n const match = /Android (\\d+)\\.(\\d+)\\.?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Android', os_version: versionParts.join('.') }\n }\n return { os_name: 'Android', os_version: '' }\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return { os_name: 'BlackBerry', os_version: '' }\n } else if (/Mac/i.test(user_agent)) {\n const match = /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Mac OS X', os_version: versionParts.join('.') }\n }\n return { os_name: 'Mac OS X', os_version: '' }\n } else if (/Linux/.test(user_agent)) {\n return { os_name: 'Linux', os_version: '' }\n } else if (/CrOS/.test(user_agent)) {\n return { os_name: 'Chrome OS', os_version: '' }\n } else {\n return { os_name: '', os_version: '' }\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referrer: function (): string {\n return document.referrer || '$direct'\n },\n\n referringDomain: function (): string {\n if (!document.referrer) {\n return '$direct'\n }\n const parser = document.createElement('a') // Unfortunately we cannot use new URL due to IE11\n parser.href = document.referrer\n return parser.host\n },\n\n properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: win?.location.href,\n $host: win?.location.host,\n $pathname: win?.location.pathname,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: win?.screen.height,\n $screen_width: win?.screen.width,\n $viewport_height: win?.innerHeight,\n $viewport_width: win?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n }\n )\n },\n}\n\nexport { win as window, userAgent, logger, document }\n","/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\nimport { AutocaptureConfig } from 'types'\nimport { _each, _includes, _isUndefined, _trim } from './utils'\n\nexport function getClassName(el: Element): string {\n switch (typeof el.className) {\n case 'string':\n return el.className\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n return ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n default:\n // future proof\n return ''\n }\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n _each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += _trim(child.textContent)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter(shouldCaptureValue)\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n }\n })\n }\n\n return _trim(elText)\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined\n): boolean {\n if (!el || isTag(el, 'html') || !isElementNode(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n const url = window.location.href\n const allowlist = autocaptureConfig.url_allowlist\n if (allowlist && !allowlist.some((regex) => url.match(regex))) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.element_allowlist) {\n const allowlist = autocaptureConfig.element_allowlist\n if (allowlist && !allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.css_selector_allowlist) {\n const allowlist = autocaptureConfig.css_selector_allowlist\n if (allowlist && !allowlist.some((selector) => el.matches(selector))) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el] // TODO: remove this var, it's never queried\n let parentNode: Element | boolean = true\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n parentNode = (curEl.parentNode as Element) || false\n if (!parentNode) break\n if (autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return event.type === 'submit'\n case 'input':\n return event.type === 'change' || event.type === 'click'\n case 'select':\n case 'textarea':\n return event.type === 'change' || event.type === 'click'\n default:\n if (parentIsUsefulElement) return event.type === 'click'\n return (\n event.type === 'click' &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassName(curEl).split(' ')\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassName(el).split(' '), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (typeof type === 'string') {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (typeof name === 'string') {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string): boolean {\n if (value === null || _isUndefined(value)) {\n return false\n }\n\n if (typeof value === 'string') {\n value = _trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (typeof attributeName === 'string') {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = `${text} ${getNestedSpanText(target)}`.trim()\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.childNodes && target.childNodes.length) {\n _each(target.childNodes, function (child) {\n if (child && child.tagName?.toLowerCase() === 'span') {\n try {\n const spanText = getSafeText(child)\n text = `${text} ${spanText}`.trim()\n\n if (child.childNodes && child.childNodes.length) {\n text = `${text} ${getNestedSpanText(child)}`.trim()\n }\n } catch (e) {\n console.error(e)\n }\n }\n })\n }\n return text\n}\n","// Naive rage click implementation: If mouse has not moved than RAGE_CLICK_THRESHOLD_PX\n// over RAGE_CLICK_CLICK_COUNT clicks with max RAGE_CLICK_TIMEOUT_MS between clicks, it's\n// counted as a rage click\n\nconst RAGE_CLICK_THRESHOLD_PX = 30\nconst RAGE_CLICK_TIMEOUT_MS = 1000\nconst RAGE_CLICK_CLICK_COUNT = 3\n\nexport default class RageClick {\n clicks: { x: number; y: number; timestamp: number }[]\n enabled: boolean\n\n constructor(enabled: boolean) {\n this.clicks = []\n this.enabled = enabled\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n if (!this.enabled) {\n return false\n }\n\n const lastClick = this.clicks[this.clicks.length - 1]\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < RAGE_CLICK_THRESHOLD_PX &&\n timestamp - lastClick.timestamp < RAGE_CLICK_TIMEOUT_MS\n ) {\n this.clicks.push({ x, y, timestamp })\n\n if (this.clicks.length === RAGE_CLICK_CLICK_COUNT) {\n return true\n }\n } else {\n this.clicks = [{ x, y, timestamp }]\n }\n\n return false\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\nexport const SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE = '$session_recording_recorder_version_server_side' // follows rrweb versioning\nexport const SESSION_ID = '$sesid'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const POSTHOG_QUOTA_LIMITED = '$posthog_quota_limited'\n\n// These are propertties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n USER_STATE,\n POSTHOG_QUOTA_LIMITED,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n]\n","import {\n _bind_instance_methods,\n _each,\n _extend,\n _includes,\n _isFunction,\n _isUndefined,\n _register_event,\n _safewrap_instance_methods,\n logger,\n} from './utils'\nimport {\n getClassName,\n getSafeText,\n isElementNode,\n isSensitiveElement,\n isTag,\n isTextNode,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureValue,\n autocaptureCompatibleElements,\n isAngularStyleAttr,\n isDocumentFragment,\n getDirectAndNestedSpanText,\n} from './autocapture-utils'\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nconst autocapture = {\n _initializedTokens: [] as string[],\n _isDisabledServerSide: null as boolean | null,\n _isAutocaptureEnabled: false as boolean,\n\n _setIsAutocaptureEnabled: function (instance: PostHog): void {\n const disabled_server_side =\n this._isDisabledServerSide === null\n ? !!instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n : this._isDisabledServerSide\n const enabled_client_side = !!instance.get_config('autocapture')\n this._isAutocaptureEnabled = enabled_client_side && !disabled_server_side\n },\n\n _previousElementSibling: function (el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n } else {\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n }\n },\n\n _getAugmentPropertiesFromElement: function (elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n _each(elem.attributes, function (attr: Attr) {\n if (attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n return props\n },\n\n _getPropertiesFromElement: function (elem: Element, maskInputs: boolean, maskText: boolean): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassName(elem)\n if (classes.length > 0)\n props['classes'] = classes.split(' ').filter(function (c) {\n return c !== ''\n })\n\n _each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class'].indexOf(attr.name) === -1) return\n\n if (!maskInputs && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n props['attr__' + attr.name] = limitText(1024, attr.value)\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = this._previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n },\n\n _getDefaultProperties: function (eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n },\n\n _extractCustomPropertyValue: function (customProperty: AutoCaptureCustomProperty): string {\n const propValues: string[] = []\n _each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n let value\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value']\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent']\n }\n\n if (shouldCaptureValue(value)) {\n propValues.push(value)\n }\n })\n return propValues.join(', ')\n },\n\n // TODO: delete custom_properties after changeless typescript refactor\n _getCustomProperties: function (targetElementList: Element[]): Properties {\n const props: Properties = {} // will be deleted\n _each(this._customProperties, (customProperty) => {\n _each(customProperty['event_selectors'], (eventSelector) => {\n const eventElements = document.querySelectorAll(eventSelector)\n _each(eventElements, (eventElement) => {\n if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty)\n }\n })\n })\n })\n return props\n },\n\n _getEventTarget: function (e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n },\n\n _captureEvent: function (e: Event, instance: PostHog, eventName = '$autocapture'): boolean | void {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = this._getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._captureEvent(e, instance, '$rageclick')\n }\n }\n\n if (target && shouldCaptureDomEvent(target, e, this.config)) {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href,\n explicitNoCapture = false\n _each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassName(el).split(' ')\n if (_includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n this._getPropertiesFromElement(\n el,\n instance.get_config('mask_all_element_attributes'),\n instance.get_config('mask_all_text')\n )\n )\n\n const augmentProperties = this._getAugmentPropertiesFromElement(el)\n _extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (!instance.get_config('mask_all_text')) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n if (href) {\n elementsJson[0]['attr__href'] = href\n }\n\n if (explicitNoCapture) {\n return false\n }\n\n const props = _extend(\n this._getDefaultProperties(e.type),\n {\n $elements: elementsJson,\n },\n this._getCustomProperties(targetElementList),\n autocaptureAugmentProperties\n )\n\n instance.capture(eventName, props)\n return true\n }\n },\n\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function (href: string): void {\n window.location.href = href\n },\n\n _addDomEventHandlers: function (instance: PostHog): void {\n const handler = (e: Event) => {\n e = e || window.event\n this._captureEvent(e, instance)\n }\n _register_event(document, 'submit', handler, false, true)\n _register_event(document, 'change', handler, false, true)\n _register_event(document, 'click', handler, false, true)\n },\n\n _customProperties: [] as AutoCaptureCustomProperty[],\n rageclicks: null as RageClick | null,\n config: undefined as AutocaptureConfig | undefined,\n\n init: function (instance: PostHog): void {\n if (typeof instance.__autocapture !== 'boolean') {\n this.config = instance.__autocapture\n }\n\n // precompile the regex\n if (this.config?.url_allowlist) {\n this.config.url_allowlist = this.config.url_allowlist.map((url) => new RegExp(url))\n }\n\n this.rageclicks = new RageClick(instance.get_config('rageclick'))\n },\n\n afterDecideResponse: function (response: DecideResponse, instance: PostHog): void {\n const token = instance.get_config('token')\n if (this._initializedTokens.indexOf(token) > -1) {\n logger.log('autocapture already initialized for token \"' + token + '\"')\n return\n }\n\n if (instance.persistence) {\n instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n })\n }\n // store this in-memory incase persistence is disabled\n this._isDisabledServerSide = !!response['autocapture_opt_out']\n\n this._setIsAutocaptureEnabled(instance)\n\n this._initializedTokens.push(token)\n\n if (\n response &&\n response['config'] &&\n response['config']['enable_collect_everything'] &&\n this._isAutocaptureEnabled\n ) {\n // TODO: delete custom_properties after changeless typescript refactor\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties']\n }\n this._addDomEventHandlers(instance)\n } else {\n instance['__autocapture'] = false\n }\n },\n\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function (\n token: string | null | undefined,\n numBuckets: number,\n numEnabledBuckets: number\n ): boolean {\n if (!token) {\n return true\n }\n numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10\n numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10\n let charCodeSum = 0\n for (let i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i)\n }\n return charCodeSum % numBuckets < numEnabledBuckets\n },\n\n isBrowserSupported: function (): boolean {\n return _isFunction(document.querySelectorAll)\n },\n}\n\n_bind_instance_methods(autocapture)\n_safewrap_instance_methods(autocapture)\n\nexport { autocapture }\n","import { _base64Encode, _entries, _extend, logger } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n console.warn('[PostHog] Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.get_config('token')\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.get_config('advanced_disable_feature_flags') || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.get_config('api_host') + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (Array.isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.unintializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/api/early_access_features/?token=${this.instance.get_config(\n 'token'\n )}`,\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n","import { _extend, logger } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport Config from './config'\nimport { DISTINCT_ID, SESSION_ID } from './constants'\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n is_supported: () => true,\n\n error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n get: function (name) {\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';').filter((x) => x.length)\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch (err) {}\n return null\n },\n\n parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return cookie\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n let cdomain = '',\n expires = '',\n secure = ''\n\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n const matches = document.location.hostname.match(DOMAIN_MATCH_REGEX),\n domain = matches ? matches[0] : ''\n\n cdomain = domain ? '; domain=.' + domain : ''\n }\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch (err) {\n return\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n cookieStore.set(name, '', -1, cross_subdomain)\n } catch (err) {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\n\nexport const localStore: PersistentStore = {\n is_supported: function () {\n if (_localStorage_supported !== null) {\n return _localStorage_supported\n }\n\n let supported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore.set(key, val)\n if (localStore.get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore.remove(key)\n } catch (err) {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n get: function (name) {\n try {\n return window.localStorage.getItem(name)\n } catch (err) {\n localStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(localStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.localStorage.removeItem(name)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [DISTINCT_ID, SESSION_ID]\n\nexport const localPlusCookieStore: PersistentStore = {\n ...localStore,\n parse: function (name) {\n try {\n let extend: Properties = {}\n try {\n // See if there's a cookie stored with data.\n extend = cookieStore.parse(name) || {}\n } catch (err) {}\n const value = _extend(extend, JSON.parse(localStore.get(name) || '{}'))\n localStore.set(name, value)\n return value\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n localStore.set(name, value)\n const cookiePersistedProperties: Record<string, any> = {}\n COOKIE_PERSISTED_PROPERTIES.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore.set(name, cookiePersistedProperties, days, cross_subdomain, is_secure)\n }\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n window.localStorage.removeItem(name)\n cookieStore.remove(name, cross_subdomain)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n is_supported: function () {\n return true\n },\n\n error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n get: function (name) {\n return memoryStorage[name] || null\n },\n\n parse: function (name) {\n return memoryStorage[name] || null\n },\n\n set: function (name, value) {\n memoryStorage[name] = value\n },\n\n remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n is_supported: function () {\n if (sessionStorageSupported !== null) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore.set(key, val)\n if (sessionStore.get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore.remove(key)\n } catch (err) {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n error: function (msg) {\n if (Config.DEBUG) {\n logger.error('sessionStorage error: ', msg)\n }\n },\n\n get: function (name) {\n try {\n return window.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(sessionStore.get(name)) || null\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n },\n}\n","/* eslint camelcase: \"off\" */\n\nimport { _each, _extend, _include, _info, _isObject, _isUndefined, _strip_empty_properties, logger } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n PERSISTENCE_RESERVED_PROPERTIES,\n EVENT_TIMERS_KEY,\n ENABLED_FEATURE_FLAGS,\n POSTHOG_QUOTA_LIMITED,\n USER_STATE,\n} from './constants'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n props: Properties\n storage: PersistentStore\n campaign_params_saved: boolean\n custom_campaign_params: string[]\n name: string\n disabled: boolean | undefined\n secure: boolean | undefined\n expire_days: number | undefined\n default_expiry: number | undefined\n cross_subdomain: boolean | undefined\n user_state: 'anonymous' | 'identified'\n\n constructor(config: PostHogConfig) {\n // clean chars that aren't accepted by the http spec for cookie values\n // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2\n let token = ''\n\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n this.props = {}\n this.campaign_params_saved = false\n this.custom_campaign_params = config['custom_campaign_params'] || []\n\n if (config['persistence_name']) {\n this.name = 'ph_' + config['persistence_name']\n } else {\n this.name = 'ph_' + token + '_posthog'\n }\n\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical('Unknown persistence type ' + config['persistence'] + '; falling back to cookie')\n config['persistence'] = 'cookie'\n }\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore.is_supported()) {\n this.storage = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore.is_supported()) {\n this.storage = localPlusCookieStore\n } else if (storage_type === 'sessionstorage' && sessionStore.is_supported()) {\n this.storage = sessionStore\n } else if (storage_type === 'memory') {\n this.storage = memoryStore\n } else {\n this.storage = cookieStore\n }\n\n this.user_state = 'anonymous'\n\n this.load()\n this.update_config(config)\n this.save()\n }\n\n properties(): Properties {\n const p: Properties = {}\n // Filter out reserved properties\n _each(this.props, function (v, k) {\n if (k === ENABLED_FEATURE_FLAGS && typeof v === 'object') {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n } else if (!_include(PERSISTENCE_RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this.disabled) {\n return\n }\n\n const entry = this.storage.parse(this.name)\n\n if (entry) {\n this.props = _extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this.disabled) {\n return\n }\n this.storage.set(this.name, this.props, this.expire_days, this.cross_subdomain, this.secure)\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this.storage.remove(this.name, false)\n this.storage.remove(this.name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (_isObject(props)) {\n if (typeof default_value === 'undefined') {\n default_value = 'None'\n }\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (_isObject(props)) {\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this.campaign_params_saved) {\n this.register(_info.campaignParams(this.custom_campaign_params))\n this.campaign_params_saved = true\n }\n }\n\n update_search_keyword(): void {\n this.register(_info.searchInfo())\n }\n\n update_referrer_info(): void {\n this.register({\n $referrer: this.props['$referrer'] || _info.referrer(),\n $referring_domain: this.props['$referring_domain'] || _info.referringDomain(),\n })\n }\n\n get_referrer_info(): Properties {\n return _strip_empty_properties({\n $referrer: this['props']['$referrer'],\n $referring_domain: this['props']['$referring_domain'],\n })\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n _each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig): void {\n this.default_expiry = this.expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'])\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n }\n\n set_disabled(disabled: boolean): void {\n this.disabled = disabled\n if (this.disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this.cross_subdomain) {\n this.cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n get_cross_subdomain(): boolean {\n return !!this.cross_subdomain\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this.secure) {\n this.secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!_isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_user_state(): 'anonymous' | 'identified' {\n return this.props[USER_STATE] || 'anonymous'\n }\n\n set_user_state(state: 'anonymous' | 'identified'): void {\n this.props[USER_STATE] = state\n this.save()\n }\n\n get_quota_limits(): Record<string, number> {\n return this.props[POSTHOG_QUOTA_LIMITED] || {}\n }\n\n set_quota_limits(state: Record<string, number>): void {\n this.props[POSTHOG_QUOTA_LIMITED] = state\n this.save()\n }\n}\n","import type {\n KeepIframeSrcFn,\n RecordPlugin,\n SamplingStrategy,\n blockClass,\n eventWithTime,\n hooksParam,\n listenerHandler,\n maskTextClass,\n pluginEvent,\n mutationCallbackParam,\n} from '@rrweb/types'\nimport type { Mirror, MaskInputOptions, MaskInputFn, MaskTextFn, SlimDOMOptions, DataURLOptions } from 'rrweb-snapshot'\n\nexport const replacementImageURI =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNOCAwSDE2TDAgMTZWOEw4IDBaIiBmaWxsPSIjMkQyRDJEIi8+CjxwYXRoIGQ9Ik0xNiA4VjE2SDhMMTYgOFoiIGZpbGw9IiMyRDJEMkQiLz4KPC9zdmc+Cg=='\n\nexport const FULL_SNAPSHOT_EVENT_TYPE = 2\nexport const META_EVENT_TYPE = 4\nexport const INCREMENTAL_SNAPSHOT_EVENT_TYPE = 3\nexport const PLUGIN_EVENT_TYPE = 6\nexport const MUTATION_SOURCE_TYPE = 0\n\nexport const MAX_MESSAGE_SIZE = 5000000 // ~5mb\n\nexport type rrwebRecord = {\n (options: recordOptions<eventWithTime>): listenerHandler\n addCustomEvent: (tag: string, payload: any) => void\n takeFullSnapshot: () => void\n mirror: Mirror\n}\n\nexport declare type recordOptions<T> = {\n emit?: (e: T, isCheckout?: boolean) => void\n checkoutEveryNth?: number\n checkoutEveryNms?: number\n blockClass?: blockClass\n blockSelector?: string\n ignoreClass?: string\n maskTextClass?: maskTextClass\n maskTextSelector?: string\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: MaskInputFn\n maskTextFn?: MaskTextFn\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n ignoreCSSAttributes?: Set<string>\n inlineStylesheet?: boolean\n hooks?: hooksParam\n // packFn?: PackFn\n sampling?: SamplingStrategy\n dataURLOptions?: DataURLOptions\n recordCanvas?: boolean\n recordCrossOriginIframes?: boolean\n recordAfter?: 'DOMContentLoaded' | 'load'\n userTriggeredOnInput?: boolean\n collectFonts?: boolean\n inlineImages?: boolean\n plugins?: RecordPlugin[]\n mousemoveWait?: number\n keepIframeSrcFn?: KeepIframeSrcFn\n // errorHandler?: ErrorHandler\n}\n\n/*\n * Check whether a data payload is nearing 5mb. If it is, it checks the data for\n * data URIs (the likely culprit for large payloads). If it finds data URIs, it either replaces\n * it with a generic image (if it's an image) or removes it.\n * @data {object} the rr-web data object\n * @returns {object} the rr-web data object with data uris filtered out\n */\nexport function ensureMaxMessageSize(data: eventWithTime): { event: eventWithTime; size: number } {\n let stringifiedData = JSON.stringify(data)\n // Note: with compression, this limit may be able to be increased\n // but we're assuming most of the size is from a data uri which\n // is unlikely to be compressed further\n if (stringifiedData.length > MAX_MESSAGE_SIZE) {\n // Regex that matches the pattern for a dataURI with the shape 'data:{mime type};{encoding},{data}'. It:\n // 1) Checks if the pattern starts with 'data:' (potentially, not at the start of the string)\n // 2) Extracts the mime type of the data uri in the first group\n // 3) Determines when the data URI ends.Depending on if it's used in the src tag or css, it can end with a ) or \"\n const dataURIRegex = /data:([\\w/\\-.]+);(\\w+),([^)\"]*)/gim\n const matches = stringifiedData.matchAll(dataURIRegex)\n for (const match of matches) {\n if (match[1].toLocaleLowerCase().slice(0, 6) === 'image/') {\n stringifiedData = stringifiedData.replace(match[0], replacementImageURI)\n } else {\n stringifiedData = stringifiedData.replace(match[0], '')\n }\n }\n }\n return { event: JSON.parse(stringifiedData), size: stringifiedData.length }\n}\n\nexport const CONSOLE_LOG_PLUGIN_NAME = 'rrweb/console@1' // The name of the rr-web plugin that emits console logs\n\n// Console logs can be really large. This function truncates large logs\n// It's a simple function that just truncates long strings.\n// TODO: Ideally this function would have better handling of objects + lists,\n// so they could still be rendered in a pretty way after truncation.\nexport function truncateLargeConsoleLogs(_event: eventWithTime) {\n const event = _event as pluginEvent<{ payload: string[] }>\n\n const MAX_STRING_SIZE = 2000 // Maximum number of characters allowed in a string\n const MAX_STRINGS_PER_LOG = 10 // A log can consist of multiple strings (e.g. consol.log('string1', 'string2'))\n\n if (\n event &&\n typeof event === 'object' &&\n event.type === PLUGIN_EVENT_TYPE &&\n typeof event.data === 'object' &&\n event.data.plugin === CONSOLE_LOG_PLUGIN_NAME\n ) {\n // Note: event.data.payload.payload comes from rr-web, and is an array of strings\n if (event.data.payload.payload.length > MAX_STRINGS_PER_LOG) {\n event.data.payload.payload = event.data.payload.payload.slice(0, MAX_STRINGS_PER_LOG)\n event.data.payload.payload.push('...[truncated]')\n }\n const updatedPayload = []\n for (let i = 0; i < event.data.payload.payload.length; i++) {\n if (\n event.data.payload.payload[i] && // Value can be null\n event.data.payload.payload[i].length > MAX_STRING_SIZE\n ) {\n updatedPayload.push(event.data.payload.payload[i].slice(0, MAX_STRING_SIZE) + '...[truncated]')\n } else {\n updatedPayload.push(event.data.payload.payload[i])\n }\n }\n event.data.payload.payload = updatedPayload\n // Return original type\n return _event\n }\n return _event\n}\n\nexport class MutationRateLimiter {\n private bucketSize = 100\n private refillRate = 10\n private mutationBuckets: Record<string, number> = {}\n private loggedTracker: Record<string, boolean> = {}\n\n constructor(\n private readonly rrweb: rrwebRecord,\n private readonly options: {\n bucketSize?: number\n refillRate?: number\n onBlockedNode?: (id: number, node: Node | null) => void\n } = {}\n ) {\n this.refillRate = this.options.refillRate ?? this.refillRate\n this.bucketSize = this.options.bucketSize ?? this.bucketSize\n setInterval(() => {\n this.refillBuckets()\n }, 1000)\n }\n\n private refillBuckets = () => {\n Object.keys(this.mutationBuckets).forEach((key) => {\n this.mutationBuckets[key] = this.mutationBuckets[key] + this.refillRate\n\n if (this.mutationBuckets[key] >= this.bucketSize) {\n delete this.mutationBuckets[key]\n }\n })\n }\n\n private getNodeOrRelevantParent = (id: number): [number, Node | null] => {\n // For some nodes we know they are part of a larger tree such as an SVG.\n // For those we want to block the entire node, not just the specific attribute\n\n const node = this.rrweb.mirror.getNode(id)\n\n // Check if the node is an Element and then find the closest parent that is an SVG\n if (node?.nodeName !== 'svg' && node instanceof Element) {\n const closestSVG = node.closest('svg')\n\n if (closestSVG) {\n return [this.rrweb.mirror.getId(closestSVG), closestSVG]\n }\n }\n\n return [id, node]\n }\n\n private numberOfChanges = (data: Partial<mutationCallbackParam>) => {\n return (\n (data.removes?.length ?? 0) +\n (data.attributes?.length ?? 0) +\n (data.texts?.length ?? 0) +\n (data.adds?.length ?? 0)\n )\n }\n\n public throttleMutations = (event: eventWithTime) => {\n if (event.type !== INCREMENTAL_SNAPSHOT_EVENT_TYPE || event.data.source !== MUTATION_SOURCE_TYPE) {\n return event\n }\n\n const data = event.data as Partial<mutationCallbackParam>\n const initialMutationCount = this.numberOfChanges(data)\n\n if (data.attributes) {\n // Most problematic mutations come from attrs where the style or minor properties are changed rapidly\n data.attributes = data.attributes.filter((attr) => {\n const [nodeId, node] = this.getNodeOrRelevantParent(attr.id)\n\n if (this.mutationBuckets[nodeId] === 0) {\n return false\n }\n\n this.mutationBuckets[nodeId] = this.mutationBuckets[nodeId] ?? this.bucketSize\n this.mutationBuckets[nodeId] = Math.max(this.mutationBuckets[nodeId] - 1, 0)\n\n if (this.mutationBuckets[nodeId] === 0) {\n if (!this.loggedTracker[nodeId]) {\n this.loggedTracker[nodeId] = true\n this.options.onBlockedNode?.(nodeId, node)\n }\n }\n\n return attr\n })\n }\n\n // Check if every part of the mutation is empty in which case there is nothing to do\n const mutationCount = this.numberOfChanges(data)\n\n if (mutationCount === 0 && initialMutationCount !== mutationCount) {\n // If we have modified the mutation count and the remaining count is 0, then we don't need the event.\n return\n }\n return event\n }\n}\n","import {\n CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE,\n} from '../constants'\nimport {\n ensureMaxMessageSize,\n FULL_SNAPSHOT_EVENT_TYPE,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n META_EVENT_TYPE,\n MutationRateLimiter,\n recordOptions,\n rrwebRecord,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, Properties } from '../types'\nimport type { eventWithTime, listenerHandler } from '@rrweb/types'\nimport Config from '../config'\nimport { logger, loadScript, _timestamp } from '../utils'\n\nconst BASE_ENDPOINT = '/s/'\n\nexport const RECORDING_IDLE_ACTIVITY_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes\nexport const RECORDING_MAX_EVENT_SIZE = 1024 * 1024 * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'recordings'\n\n// NOTE: Importing this type is problematic as we can't safely bundle it to a TS definition so, instead we redefine.\n// import type { record } from 'rrweb2/typings'\n// import type { recordOptions } from 'rrweb/typings/types'\n\n// Copied from rrweb typings to avoid import\nenum IncrementalSource {\n Mutation = 0,\n MouseMove = 1,\n MouseInteraction = 2,\n Scroll = 3,\n ViewportResize = 4,\n Input = 5,\n TouchMove = 6,\n MediaInteraction = 7,\n StyleSheetRule = 8,\n CanvasMutation = 9,\n Font = 10,\n Log = 11,\n Drag = 12,\n StyleDeclaration = 13,\n Selection = 14,\n AdoptedStyleSheet = 15,\n}\n\nconst ACTIVE_SOURCES = [\n IncrementalSource.MouseMove,\n IncrementalSource.MouseInteraction,\n IncrementalSource.Scroll,\n IncrementalSource.ViewportResize,\n IncrementalSource.Input,\n IncrementalSource.TouchMove,\n IncrementalSource.MediaInteraction,\n IncrementalSource.Drag,\n]\n\nexport class SessionRecording {\n private instance: PostHog\n private emit: boolean\n private endpoint: string\n private windowId: string | null\n private sessionId: string | null\n private lastActivityTimestamp: number = Date.now()\n private flushBufferTimer?: any\n private buffer?: {\n size: number\n data: any[]\n sessionId: string | null\n windowId: string | null\n }\n private mutationRateLimiter?: MutationRateLimiter\n\n captureStarted: boolean\n snapshots: any[]\n stopRrweb: listenerHandler | undefined\n receivedDecide: boolean\n rrwebRecord: rrwebRecord | undefined\n recorderVersion?: string\n isIdle = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.captureStarted = false\n this.snapshots = []\n this.emit = false // Controls whether data is sent to the server or not\n this.endpoint = BASE_ENDPOINT\n this.stopRrweb = undefined\n this.windowId = null\n this.sessionId = null\n this.receivedDecide = false\n\n window.addEventListener('beforeunload', () => {\n this._flushBuffer()\n })\n }\n\n private getSessionManager() {\n if (!this.instance.sessionManager) {\n logger.error('Session recording started without valid sessionManager')\n return\n }\n\n return this.instance.sessionManager\n }\n\n startRecordingIfEnabled() {\n if (this.isRecordingEnabled()) {\n this.startCaptureAndTrySendingQueuedSnapshots()\n } else {\n this.stopRecording()\n }\n }\n\n started() {\n return this.captureStarted\n }\n\n stopRecording() {\n if (this.captureStarted && this.stopRrweb) {\n this.stopRrweb()\n this.stopRrweb = undefined\n this.captureStarted = false\n }\n }\n\n isRecordingEnabled() {\n const enabled_server_side = !!this.instance.get_property(SESSION_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = !this.instance.get_config('disable_session_recording')\n return enabled_server_side && enabled_client_side\n }\n\n isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this.instance.get_property(CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = this.instance.get_config('enable_recording_console_log')\n return enabled_client_side ?? enabled_server_side\n }\n\n getRecordingVersion() {\n const recordingVersion_server_side = this.instance.get_property(SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE)\n const recordingVersion_client_side = this.instance.get_config('session_recording')?.recorderVersion\n return recordingVersion_client_side || recordingVersion_server_side || 'v1'\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.receivedDecide = true\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: !!response['sessionRecording'],\n [CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE]: response.sessionRecording?.consoleLogRecordingEnabled,\n [SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE]: response.sessionRecording?.recorderVersion,\n })\n }\n if (response.sessionRecording?.endpoint) {\n this.endpoint = response.sessionRecording?.endpoint\n }\n\n if (response.sessionRecording?.recorderVersion) {\n this.recorderVersion = response.sessionRecording.recorderVersion\n }\n this.startRecordingIfEnabled()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6,\n data: {\n plugin: 'rrweb/console@1',\n payload: {\n level,\n trace: [],\n // Even though it is a string we stringify it as thats what rrweb expects\n payload: [JSON.stringify(message)],\n },\n },\n timestamp: _timestamp(),\n })\n }\n\n private startCaptureAndTrySendingQueuedSnapshots() {\n // Only submit data after we've received a decide response to account for\n // changing endpoints and the feature being disabled on the server side.\n if (this.receivedDecide) {\n this.emit = true\n this.snapshots.forEach((properties) => this._captureSnapshotBuffered(properties))\n }\n this._startCapture()\n }\n\n private _startCapture() {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n if (typeof Object.assign === 'undefined') {\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n return\n }\n\n // We do not switch recorder versions midway through a recording.\n if (this.captureStarted || this.instance.get_config('disable_session_recording')) {\n return\n }\n\n this.captureStarted = true\n // We want to ensure the sessionManager is reset if necessary on load of the recorder\n sessionManager.checkAndGetSessionAndWindowId()\n\n const recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js'\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import\n // recorder.js from cdn since it hasn't been loaded.\n if (this.instance.__loaded_recorder_version !== this.getRecordingVersion()) {\n loadScript(\n this.instance.get_config('api_host') + `/static/${recorderJS}?v=${Config.LIB_VERSION}`,\n (err) => {\n if (err) {\n return logger.error(`Could not load ${recorderJS}`, err)\n }\n\n this._onScriptLoaded()\n }\n )\n } else {\n this._onScriptLoaded()\n }\n }\n\n private _isInteractiveEvent(event: eventWithTime) {\n return event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && ACTIVE_SOURCES.indexOf(event.data?.source) !== -1\n }\n\n private _updateWindowAndSessionIds(event: eventWithTime) {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n\n const isUserInteraction = this._isInteractiveEvent(event)\n\n if (!isUserInteraction && !this.isIdle) {\n // We check if the lastActivityTimestamp is old enough to go idle\n if (event.timestamp - this.lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {\n this.isIdle = true\n }\n }\n\n if (isUserInteraction) {\n this.lastActivityTimestamp = event.timestamp\n if (this.isIdle) {\n // Remove the idle state if set and trigger a full snapshot as we will have ingored previous mutations\n this.isIdle = false\n this._tryTakeFullSnapshot()\n }\n }\n\n if (this.isIdle) {\n return\n }\n\n // We only want to extend the session if it is an interactive event.\n const { windowId, sessionId } = sessionManager.checkAndGetSessionAndWindowId(\n !isUserInteraction,\n event.timestamp\n )\n\n if (\n [FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1 &&\n (this.windowId !== windowId || this.sessionId !== sessionId)\n ) {\n this._tryTakeFullSnapshot()\n }\n this.windowId = windowId\n this.sessionId = sessionId\n }\n\n private _tryTakeFullSnapshot(): boolean {\n if (!this.captureStarted) {\n return false\n }\n try {\n this.rrwebRecord?.takeFullSnapshot()\n return true\n } catch (e) {\n // Sometimes a race can occur where the recorder is not fully started yet, so we can't take a full snapshot.\n logger.error('Error taking full snapshot.', e)\n return false\n }\n }\n\n private _onScriptLoaded() {\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions<eventWithTime> = {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskTextClass: 'ph-mask',\n maskTextSelector: undefined,\n maskTextFn: undefined,\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n recordCrossOriginIframes: false,\n }\n // We switched from loading all of rrweb to just the record part, but\n // keep backwards compatibility if someone hasn't upgraded PostHog\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.rrwebRecord = window.rrweb ? window.rrweb.record : window.rrwebRecord\n\n // only allows user to set our 'allowlisted' options\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n\n if (!this.rrwebRecord) {\n logger.error(\n 'onScriptLoaded was called but rrwebRecord is not available. This indicates something has gone wrong.'\n )\n return\n }\n\n this.mutationRateLimiter =\n this.mutationRateLimiter ??\n new MutationRateLimiter(this.rrwebRecord, {\n onBlockedNode: (id, node) => {\n const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n logger.log(message, {\n node: node,\n })\n\n this.log('[PostHog Recorder] ' + message, 'warn')\n },\n })\n\n this.stopRrweb = this.rrwebRecord({\n emit: (event) => {\n this.onRRwebEmit(event)\n },\n plugins:\n (window as any).rrwebConsoleRecord && this.isConsoleLogCaptureEnabled()\n ? [(window as any).rrwebConsoleRecord.getRecordConsolePlugin()]\n : [],\n ...sessionRecordingOptions,\n })\n\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this.instance._addCaptureHook((eventName) => {\n // If anything could go wrong here it has the potential to block the main loop so we catch all errors.\n try {\n if (eventName === '$pageview') {\n this.rrwebRecord?.addCustomEvent('$pageview', { href: window.location.href })\n }\n } catch (e) {\n logger.error('Could not add $pageview to rrweb session', e)\n }\n })\n\n // We reset the last activity timestamp, resetting the idle timer\n this.lastActivityTimestamp = Date.now()\n this.isIdle = false\n }\n\n onRRwebEmit(rawEvent: eventWithTime) {\n if (!rawEvent || typeof rawEvent !== 'object') {\n return\n }\n\n const throttledEvent = this.mutationRateLimiter\n ? this.mutationRateLimiter.throttleMutations(rawEvent)\n : rawEvent\n\n if (!throttledEvent) {\n return\n }\n\n const { event, size } = ensureMaxMessageSize(truncateLargeConsoleLogs(throttledEvent))\n\n this._updateWindowAndSessionIds(event)\n\n if (this.isIdle) {\n // When in an idle state we keep recording, but don't capture the events\n return\n }\n\n const properties = {\n $snapshot_bytes: size,\n $snapshot_data: event,\n $session_id: this.sessionId,\n $window_id: this.windowId,\n }\n\n if (this.emit) {\n this._captureSnapshotBuffered(properties)\n } else {\n this.snapshots.push(properties)\n }\n }\n\n private _flushBuffer() {\n if (this.flushBufferTimer) {\n clearTimeout(this.flushBufferTimer)\n this.flushBufferTimer = undefined\n }\n\n if (this.buffer && this.buffer.data.length !== 0) {\n this._captureSnapshot({\n $snapshot_bytes: this.buffer.size,\n $snapshot_data: this.buffer.data,\n $session_id: this.buffer.sessionId,\n $window_id: this.buffer.windowId,\n })\n }\n\n this.buffer = undefined\n\n return {\n size: 0,\n data: [],\n sessionId: this.sessionId,\n windowId: this.windowId,\n }\n }\n\n private _captureSnapshotBuffered(properties: Properties) {\n const additionalBytes = 2 + (this.buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n if (\n !this.buffer ||\n this.buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE ||\n this.buffer.sessionId !== this.sessionId\n ) {\n this.buffer = this._flushBuffer()\n }\n\n this.buffer.size += properties.$snapshot_bytes\n this.buffer.data.push(properties.$snapshot_data)\n\n if (!this.flushBufferTimer) {\n this.flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n }\n }\n\n private _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this.instance.capture('$snapshot', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: this.endpoint,\n _noTruncate: true,\n _batchKey: SESSION_RECORDING_BATCH_KEY,\n _metrics: {\n rrweb_full_snapshot: properties.$snapshot_data.type === FULL_SNAPSHOT_EVENT_TYPE,\n },\n })\n }\n}\n","import { isLocalhost, logger } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, NetworkRequest } from '../types'\n\nconst PERFORMANCE_EVENTS_MAPPING: { [key: string]: number } = {\n // BASE_PERFORMANCE_EVENT_COLUMNS\n entryType: 0,\n timeOrigin: 1,\n name: 2,\n\n // RESOURCE_EVENT_COLUMNS\n startTime: 3,\n redirectStart: 4,\n redirectEnd: 5,\n workerStart: 6,\n fetchStart: 7,\n domainLookupStart: 8,\n domainLookupEnd: 9,\n connectStart: 10,\n secureConnectionStart: 11,\n connectEnd: 12,\n requestStart: 13,\n responseStart: 14,\n responseEnd: 15,\n decodedBodySize: 16,\n encodedBodySize: 17,\n initiatorType: 18,\n nextHopProtocol: 19,\n renderBlockingStatus: 20,\n responseStatus: 21,\n transferSize: 22,\n\n // LARGEST_CONTENTFUL_PAINT_EVENT_COLUMNS\n element: 23,\n renderTime: 24,\n loadTime: 25,\n size: 26,\n id: 27,\n url: 28,\n\n // NAVIGATION_EVENT_COLUMNS\n domComplete: 29,\n domContentLoadedEvent: 30,\n domInteractive: 31,\n loadEventEnd: 32,\n loadEventStart: 33,\n redirectCount: 34,\n navigationType: 35,\n unloadEventEnd: 36,\n unloadEventStart: 37,\n\n // Added after v1\n duration: 39,\n timestamp: 40,\n\n // NOTE: CURRENTLY UNSUPPORTED\n // EVENT_TIMING_EVENT_COLUMNS\n // processingStart: null,\n // processingEnd: null,\n\n // MARK_AND_MEASURE_EVENT_COLUMNS\n // detail: null,\n}\n\nconst ENTRY_TYPES_TO_OBSERVE = [\n // 'event', // This is too noisy as it covers all browser events\n 'first-input',\n // 'mark', // Mark is used too liberally. We would need to filter for specific marks\n // 'measure', // Measure is used too liberally. We would need to filter for specific measures\n 'navigation',\n 'paint',\n 'resource',\n]\n\nconst PERFORMANCE_INGESTION_ENDPOINT = '/e/'\n// Don't monitor posthog paths because then events cause performance events which are events and the snake eats its tail 😱\nconst POSTHOG_PATHS_TO_IGNORE = ['/s/', PERFORMANCE_INGESTION_ENDPOINT]\n\nexport class WebPerformanceObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n observer: PerformanceObserver | undefined\n\n // Util to help developers working on this feature manually override\n _forceAllowLocalhost = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n startObservingIfEnabled() {\n if (this.isEnabled()) {\n this.startObserving()\n } else {\n this.stopObserving()\n }\n }\n\n startObserving() {\n if (this.observer) {\n return\n }\n\n if (window?.PerformanceObserver?.supportedEntryTypes === undefined) {\n logger.log(\n 'PostHog Performance observer not started because PerformanceObserver is not supported by this browser.'\n )\n return\n }\n\n if (isLocalhost() && !this._forceAllowLocalhost) {\n logger.log('PostHog Peformance observer not started because we are on localhost.')\n return\n }\n\n try {\n // compat checked above with early return\n // eslint-disable-next-line compat/compat\n this.observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n this._capturePerformanceEvent(entry)\n })\n })\n\n // compat checked above with early return\n // eslint-disable-next-line compat/compat\n const entryTypes = PerformanceObserver.supportedEntryTypes.filter((x) => ENTRY_TYPES_TO_OBSERVE.includes(x))\n\n entryTypes.forEach((entryType) => {\n this.observer?.observe({ type: entryType, buffered: true })\n })\n } catch (e) {\n console.error('PostHog failed to start performance observer', e)\n this.stopObserving()\n }\n }\n\n stopObserving() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = undefined\n }\n }\n\n isObserving() {\n return !!this.observer\n }\n\n isEnabled() {\n return this.instance.get_config('capture_performance') ?? this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.remoteEnabled = response.capturePerformance || false\n if (this.isEnabled()) {\n this.startObserving()\n }\n }\n\n _capturePerformanceEvent(event: PerformanceEntry) {\n // NOTE: We don't want to capture our own request events.\n\n if (event.name.indexOf(this.instance.get_config('api_host')) === 0) {\n const path = event.name.replace(this.instance.get_config('api_host'), '')\n\n if (POSTHOG_PATHS_TO_IGNORE.find((x) => path.indexOf(x) === 0)) {\n return\n }\n }\n\n // NOTE: This is minimal atm but will include more options when we move to the\n // built-in rrweb network recorder\n let networkRequest: NetworkRequest | null | undefined = {\n url: event.name,\n }\n\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n\n if (userSessionRecordingOptions.maskNetworkRequestFn) {\n networkRequest = userSessionRecordingOptions.maskNetworkRequestFn(networkRequest)\n }\n\n if (!networkRequest) {\n return\n }\n\n const eventJson = event.toJSON()\n eventJson.name = networkRequest.url\n const properties: { [key: number]: any } = {}\n // kudos to sentry javascript sdk for excellent background on why to use Date.now() here\n // https://github.com/getsentry/sentry-javascript/blob/e856e40b6e71a73252e788cd42b5260f81c9c88e/packages/utils/src/time.ts#L70\n // can't start observer if performance.now() is not available\n // eslint-disable-next-line compat/compat\n const timeOrigin = Math.floor(Date.now() - performance.now())\n properties[PERFORMANCE_EVENTS_MAPPING['timeOrigin']] = timeOrigin\n // clickhouse can't ingest timestamps that are floats\n // (in this case representing fractions of a millisecond we don't care about anyway)\n properties[PERFORMANCE_EVENTS_MAPPING['timestamp']] = Math.floor(timeOrigin + event.startTime)\n for (const key in PERFORMANCE_EVENTS_MAPPING) {\n if (eventJson[key] !== undefined) {\n properties[PERFORMANCE_EVENTS_MAPPING[key]] = eventJson[key]\n }\n }\n\n this.capturePerformanceEvent(properties)\n\n if (exposesServerTiming(event)) {\n for (const timing of event.serverTiming || []) {\n this.capturePerformanceEvent({\n [PERFORMANCE_EVENTS_MAPPING['timeOrigin']]: timeOrigin,\n [PERFORMANCE_EVENTS_MAPPING['timestamp']]: Math.floor(timeOrigin + event.startTime),\n [PERFORMANCE_EVENTS_MAPPING['name']]: timing.name,\n [PERFORMANCE_EVENTS_MAPPING['duration']]: timing.duration,\n // the spec has a closed list of possible types\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType\n // but, we need to know this was a server timing so that we know to\n // match it to the appropriate navigation or resource timing\n // that matching will have to be on timestamp and $current_url\n [PERFORMANCE_EVENTS_MAPPING['entryType']]: 'serverTiming',\n })\n }\n }\n }\n\n /**\n * :TRICKY: Make sure we batch these requests, and don't truncate the strings.\n */\n private capturePerformanceEvent(properties: { [key: number]: any }) {\n const timestamp = properties[PERFORMANCE_EVENTS_MAPPING['timestamp']]\n\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6, // EventType.Plugin,\n data: {\n plugin: 'posthog/network@1',\n payload: properties,\n },\n timestamp,\n })\n\n // this.instance.capture('$performance_event', properties, {\n // transport: 'XHR',\n // method: 'POST',\n // endpoint: PERFORMANCE_INGESTION_ENDPOINT,\n // _noTruncate: true,\n // _batchKey: 'performanceEvent',\n // })\n }\n}\n\n/**\n * Check if this PerformanceEntry is either a PerformanceResourceTiming or a PerformanceNavigationTiming\n * NB PerformanceNavigationTiming extends PerformanceResourceTiming\n * Here we don't care which interface it implements as both expose `serverTimings`\n */\nconst exposesServerTiming = (event: PerformanceEntry): event is PerformanceResourceTiming =>\n event.entryType === 'navigation' || event.entryType === 'resource'\n","import { autocapture } from './autocapture'\nimport { _base64Encode, loadScript } from './utils'\nimport { PostHog } from './posthog-core'\nimport { Compression, DecideResponse } from './types'\nimport { STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY } from './constants'\n\nexport class Decide {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n // don't need to wait for `decide` to return if flags were provided on initialisation\n this.instance.decideEndpointWasHit = this.instance._hasBootstrappedFeatureFlags()\n }\n\n call(): void {\n /*\n Calls /decide endpoint to fetch options for autocapture, session recording, feature flags & compression.\n */\n const json_data = JSON.stringify({\n token: this.instance.get_config('token'),\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n person_properties: this.instance.get_property(STORED_PERSON_PROPERTIES_KEY),\n group_properties: this.instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n disable_flags:\n this.instance.get_config('advanced_disable_feature_flags') ||\n this.instance.get_config('advanced_disable_feature_flags_on_first_load') ||\n undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/decide/?v=3`,\n { data: encoded_data, verbose: true },\n { method: 'POST' },\n (response) => this.parseDecideResponse(response as DecideResponse)\n )\n }\n\n parseDecideResponse(response: DecideResponse): void {\n this.instance.featureFlags.resetRequestQueue()\n this.instance.featureFlags.setReloadingPaused(false)\n\n if (response?.status === 0) {\n console.error('Failed to fetch feature flags from PostHog.')\n return\n }\n if (!(document && document.body)) {\n console.log('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this.parseDecideResponse(response)\n }, 500)\n return\n }\n\n this.instance.toolbar.afterDecideResponse(response)\n this.instance.sessionRecording?.afterDecideResponse(response)\n autocapture.afterDecideResponse(response, this.instance)\n this.instance.webPerformance?.afterDecideResponse(response)\n this.instance.exceptionAutocapture?.afterDecideResponse(response)\n\n if (!this.instance.get_config('advanced_disable_feature_flags_on_first_load')) {\n this.instance.featureFlags.receivedFeatureFlags(response)\n }\n\n this.instance['compression'] = {}\n if (response['supportedCompression'] && !this.instance.get_config('disable_compression')) {\n const compression: Partial<Record<Compression, boolean>> = {}\n for (const method of response['supportedCompression']) {\n compression[method] = true\n }\n this.instance['compression'] = compression\n }\n\n if (response['siteApps']) {\n if (this.instance.get_config('opt_in_site_apps')) {\n const apiHost = this.instance.get_config('api_host')\n for (const { id, url } of response['siteApps']) {\n const scriptUrl = [\n apiHost,\n apiHost[apiHost.length - 1] === '/' && url[0] === '/' ? url.substring(1) : url,\n ].join('')\n\n ;(window as any)[`__$$ph_site_app_${id}`] = this.instance\n\n loadScript(scriptUrl, (err) => {\n if (err) {\n console.error(`Error while initializing PostHog app with config id ${id}`, err)\n }\n })\n }\n } else if (response['siteApps'].length > 0) {\n console.error('PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.')\n }\n }\n }\n}\n","export const POSTHOG_MANAGED_HOSTS = ['https://app.posthog.com', 'https://eu.posthog.com']\n","import { _getHashParam, _register_event, loadScript, logger } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, ToolbarParams } from '../types'\nimport { POSTHOG_MANAGED_HOSTS } from './cloud'\n\nexport class Toolbar {\n instance: PostHog\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n afterDecideResponse(response: DecideResponse) {\n const toolbarParams: ToolbarParams =\n response['toolbarParams'] ||\n response['editorParams'] ||\n (response['toolbarVersion'] ? { toolbarVersion: response['toolbarVersion'] } : {})\n if (\n response['isAuthenticated'] &&\n toolbarParams['toolbarVersion'] &&\n toolbarParams['toolbarVersion'].indexOf('toolbar') === 0\n ) {\n this.loadToolbar({\n ...toolbarParams,\n })\n }\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch (error) {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window.localStorage\n }\n\n const stateHash = _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n const state = stateHash ? JSON.parse(decodeURIComponent(stateHash)) : null\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n let toolbarParams: ToolbarParams\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n history.replaceState('', document.title, location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialzation\n toolbarParams = JSON.parse(localStorage.getItem('_postHogToolbarParams') || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.get_config('token') === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch (e) {\n return false\n }\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n if ((window as any)['_postHogToolbarLoaded']) {\n return false\n }\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n ;(window as any)['_postHogToolbarLoaded'] = true\n\n // By design array.js, recorder.js, and toolbar.js are served from Django with no or limited caching, not from our CDN\n // Django respects the query params for caching, returning a 304 if appropriate\n const host = this.instance.get_config('api_host')\n const timestampToNearestThirtySeconds = Math.floor(Date.now() / 30000) * 30000\n const toolbarUrl = `${host}${\n host.endsWith('/') ? '' : '/'\n }static/toolbar.js?_ts=${timestampToNearestThirtySeconds}`\n const disableToolbarMetrics =\n !POSTHOG_MANAGED_HOSTS.includes(this.instance.get_config('api_host')) &&\n this.instance.get_config('advanced_disable_toolbar_metrics')\n\n const toolbarParams = {\n token: this.instance.get_config('token'),\n ...params,\n apiURL: host, // defaults to api_host from the instance config if nothing else set\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n\n const { source: _discard, ...paramsToPersist } = toolbarParams // eslint-disable-line\n window.localStorage.setItem('_postHogToolbarParams', JSON.stringify(paramsToPersist))\n\n loadScript(toolbarUrl, (err) => {\n if (err) {\n logger.error('Failed to load toolbar', err)\n return\n }\n ;((window as any)['ph_load_toolbar'] || (window as any)['ph_load_editor'])(toolbarParams, this.instance)\n })\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n _register_event(window, 'turbolinks:load', () => {\n ;(window as any)['_postHogToolbarLoaded'] = false\n this.loadToolbar(toolbarParams)\n })\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n","/**\n * GDPR utils\n *\n * The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection\n * and privacy for all individuals within the European Union. It addresses the export of personal\n * data outside the EU. The GDPR aims primarily to give control back to citizens and residents\n * over their personal data and to simplify the regulatory environment for international business\n * by unifying the regulation within the EU.\n *\n * This set of utilities is intended to enable opt in/out functionality in the PostHog JS SDK.\n * These functions are used internally by the SDK and are not intended to be publicly exposed.\n */\n\nimport { _each, _includes, _isNumber, _isString, window } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore } from './storage'\nimport { GDPROptions, PersistentStore } from './types'\nimport { PostHog } from './posthog-core'\n\n/**\n * A function used to capture a PostHog event (e.g. PostHogLib.capture)\n * @callback captureFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after capturing the event.\n */\n\n/** Public **/\n\nconst GDPR_DEFAULT_PERSISTENCE_PREFIX = '__ph_opt_in_out_'\n\n/**\n * Opt the user in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function optIn(token: string, options: GDPROptions): void {\n _optInOut(true, token, options)\n}\n\n/**\n * Opt the user out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\nexport function optOut(token: string, options: GDPROptions): void {\n _optInOut(false, token, options)\n}\n\n/**\n * Check whether the user has opted in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\nexport function hasOptedIn(token: string, options: GDPROptions): boolean {\n return _getStorageValue(token, options) === '1'\n}\n\n/**\n * Check whether the user has opted out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the user has opted out of the given opt type\n */\nexport function hasOptedOut(token: string, options: Partial<GDPROptions>): boolean {\n if (_hasDoNotTrackFlagOn(options)) {\n return true\n }\n return _getStorageValue(token, options) === '0'\n}\n\n/**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function clearOptInOut(token: string, options: GDPROptions) {\n options = options || {}\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie)\n}\n\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either cookieStore or localStore\n */\nfunction _getStorage(options: GDPROptions): PersistentStore {\n options = options || {}\n if (options.persistenceType === 'localStorage') {\n return localStore\n }\n if (options.persistenceType === 'localStorage+cookie') {\n return localPlusCookieStore\n }\n return cookieStore\n}\n\n/**\n * Get the name of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\nfunction _getStorageKey(token: string, options: GDPROptions) {\n options = options || {}\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token\n}\n\n/**\n * Get the value of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\nfunction _getStorageValue(token: string, options: GDPROptions) {\n return _getStorage(options).get(_getStorageKey(token, options))\n}\n\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the DNT setting is true\n */\nfunction _hasDoNotTrackFlagOn(options: GDPROptions) {\n if (options && options.respectDnt) {\n const win = (options && options.window) || window\n const nav = win['navigator'] || {}\n let hasDntOn = false\n _each(\n [\n nav['doNotTrack'], // standard\n (nav as any)['msDoNotTrack'],\n (win as any)['doNotTrack'],\n ],\n function (dntValue) {\n if (_includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true\n }\n }\n )\n return hasDntOn\n }\n return false\n}\n\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nfunction _optInOut(optValue: boolean, token: string, options: GDPROptions) {\n if (!_isString(token) || !token.length) {\n console.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token')\n return\n }\n\n options = options || {}\n\n _getStorage(options).set(\n _getStorageKey(token, options),\n optValue ? 1 : 0,\n _isNumber(options.cookieExpiration) ? options.cookieExpiration : null,\n options.crossSubdomainCookie,\n options.secureCookie\n )\n\n if (options.capture && optValue) {\n // only capture event if opting in (optValue=true)\n options.capture(options.captureEventName || '$opt_in', options.captureProperties || {}, {\n send_instantly: true,\n })\n }\n}\n\nexport function userOptedOut(posthog: PostHog, silenceErrors: boolean | undefined) {\n let optedOut = false\n\n try {\n const token = posthog.get_config('token')\n const respectDnt = posthog.get_config('respect_dnt')\n const persistenceType = posthog.get_config('opt_out_capturing_persistence_type')\n const persistencePrefix = posthog.get_config('opt_out_capturing_cookie_prefix') || undefined\n const win = posthog.get_config('window' as any) as Window | undefined // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n respectDnt,\n persistenceType,\n persistencePrefix,\n window: win,\n })\n }\n } catch (err) {\n if (!silenceErrors) {\n console.error('Unexpected error when checking capturing opt-out status: ' + err)\n }\n }\n return optedOut\n}\n\n/**\n * Wrap a method with a check for whether the user is opted out of data capturing and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {PostHog} posthog - the posthog instance\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @param silenceErrors\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\nexport function addOptOutCheck<M extends (...args: any[]) => any = (...args: any[]) => any>(\n posthog: PostHog,\n method: M,\n silenceErrors?: boolean\n): M {\n return function (...args) {\n const optedOut = userOptedOut(posthog, silenceErrors)\n\n if (!optedOut) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return method.apply(this, args)\n }\n\n const callback = args[args.length - 1]\n if (typeof callback === 'function') {\n callback(0)\n }\n\n return\n } as M\n}\n","export class RequestQueueScaffold {\n isPolling: boolean // flag to continue to recursively poll or not\n _event_queue: any[]\n _empty_queue_count: number // to track empty polls\n _poller: number | undefined // to become interval for reference to clear later\n _pollInterval: number\n\n constructor(pollInterval = 3000) {\n this.isPolling = true // flag to continue to recursively poll or not\n this._event_queue = []\n this._empty_queue_count = 0 // to track empty polls\n this._poller = undefined // to become interval for reference to clear later\n this._pollInterval = pollInterval\n }\n\n setPollInterval(interval: number): void {\n this._pollInterval = interval\n // Reset interval if running already\n if (this.isPolling) {\n this.poll()\n }\n }\n\n // // eslint-disable-next-line no-unused-vars\n // enqueue(_requestData: Record<string, any>): void {\n // return\n // }\n\n poll(): void {\n return\n }\n\n unload(): void {\n return\n }\n\n getTime(): number {\n return new Date().getTime()\n }\n}\n","import { RequestQueueScaffold } from './base-request-queue'\nimport { _each } from './utils'\nimport { Properties, QueuedRequestData, XHROptions } from './types'\n\nexport class RequestQueue extends RequestQueueScaffold {\n handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void\n\n constructor(handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void, pollInterval = 3000) {\n super(pollInterval)\n this.handlePollRequest = handlePollRequest\n }\n\n enqueue(url: string, data: Properties, options: XHROptions): void {\n this._event_queue.push({ url, data, options })\n\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this._event_queue.length > 0) {\n const requests = this.formatQueue()\n for (const key in requests) {\n const { url, data, options } = requests[key]\n _each(data, (_, dataKey) => {\n data[dataKey]['offset'] = Math.abs(data[dataKey]['timestamp'] - this.getTime())\n delete data[dataKey]['timestamp']\n })\n this.handlePollRequest(url, data, options)\n }\n this._event_queue.length = 0 // flush the _event_queue\n this._empty_queue_count = 0\n } else {\n this._empty_queue_count++\n }\n\n /**\n * _empty_queue_count will increment each time the queue is polled\n * and it is empty. To avoid empty polling (user went idle, stepped away from comp)\n * we can turn it off with the isPolling flag.\n *\n * Polling will be re enabled when the next time PostHogLib.capture is called with\n * an event that should be added to the event queue.\n */\n if (this._empty_queue_count > 4) {\n this.isPolling = false\n this._empty_queue_count = 0\n }\n if (this.isPolling) {\n this.poll()\n }\n }, this._pollInterval) as any as number\n }\n\n unload(): void {\n clearTimeout(this._poller)\n const requests = this._event_queue.length > 0 ? this.formatQueue() : {}\n this._event_queue.length = 0\n const requestValues = Object.values(requests)\n\n // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n const sortedRequests = [\n ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n ]\n sortedRequests.map(({ url, data, options }) => {\n this.handlePollRequest(url, data, { ...options, transport: 'sendBeacon' })\n })\n }\n\n formatQueue(): Record<string, QueuedRequestData> {\n const requests: Record<string, QueuedRequestData> = {}\n _each(this._event_queue, (request) => {\n const { url, data, options } = request\n const key = (options ? options._batchKey : null) || url\n if (requests[key] === undefined) {\n requests[key] = { data: [], url, options }\n }\n\n // :TRICKY: Metrics-only code\n if (\n options &&\n requests[key].options &&\n requests[key].options._metrics &&\n !(requests[key].options._metrics as any)['rrweb_full_snapshot']\n ) {\n ;(requests[key].options._metrics as any)['rrweb_full_snapshot'] =\n options._metrics['rrweb_full_snapshot']\n }\n requests[key].data.push(data)\n })\n return requests\n }\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n var w = new Worker(u);\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\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 // numbers here are at max 18 bits\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];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\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 // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\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});\n// fixed length tree\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;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\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};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\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};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\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};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\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 // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\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 // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\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 // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\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 // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts)\n throw 'unexpected EOF';\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\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 // bits read, code\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 }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\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};\n// starting at p, write the minimum number of bits that can hold v to d\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};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\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};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\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) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\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: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\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: l, r: 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 // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\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 }\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};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\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 }\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};\n// calculate the length of output from tree, code lengths\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};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\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};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[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 }\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 }\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};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\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 / 7000)) + post);\n // writing to this writes to the output buffer\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 // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\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 // prev 2-byte val map curr 2-byte val map\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 (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768\n var imod = i & 32767;\n // previous index with this value\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || 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 // len dist chain\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 // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\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 // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\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 // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\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 }\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 // this is the easiest way to avoid needing to maintain state\n if (!lst)\n pos = wfblk(w, pos, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = 0xFFFFFFFF;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return c ^ 0xFFFFFFFF; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\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 () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n };\n};\n;\n// deflate with opts\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};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n if (!opts.consume)\n dat = new u8(dat);\n w.postMessage([dat, opts], [dat.buffer]);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\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 AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = gzs(this.p);\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (opts === void 0) { opts = {}; }\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}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function 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) { ar[ai++] = v; };\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),\n 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}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function 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,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n var fl = fn.length, l = cmp.length;\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b] = 20, b += 2;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n d[b] = t, b += 2;\n var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n b += 4;\n wbytes(d, b, c);\n wbytes(d, b + 4, l);\n wbytes(d, b + 8, su);\n wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n if (ce != null)\n wbytes(d, b += 10, ce), b += 4;\n d.set(fn, b);\n b += fl;\n if (ce == null)\n d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), m = file.length;\n c.p(file);\n var n = strToU8(fn), s = n.length;\n var t = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = {\n t: t,\n d: d,\n m: m,\n c: c.d(),\n u: fn.length != l,\n n: n,\n p: p\n };\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n if (!--lft)\n cbf();\n }\n };\n if (n.length > 65535)\n cbl('filename too long', null);\n if (!t)\n cbl(null, file);\n else if (m < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var t = p.level == 0 ? 0 : 8;\n var n = strToU8(fn), s = n.length;\n if (n.length > 65535)\n throw 'filename too long';\n var d = t ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push({\n t: t,\n d: d,\n m: file.length,\n c: c.d(),\n u: fn.length != s,\n n: n,\n o: o,\n p: p\n });\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_2 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_2(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n */\n css_selector_allowlist?: string[]\n}\n\nexport type UUIDVersion = 'og' | 'v7'\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport: string\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n test: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n property_blacklist: string[]\n xhr_headers: { [header_name: string]: string }\n on_xhr_error: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_measure_pageview_stats?: boolean\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n /** Modify the network request before it is captured. Returning null stops it being captured */\n maskNetworkRequestFn?: ((url: NetworkRequest) => NetworkRequest | null | undefined) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n endpoint?: string /** defaults to '/e/' */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\nexport interface XHRParams extends QueuedRequestData {\n retryQueue: RetryQueue\n onXHRError: (req: XMLHttpRequest) => void\n timeout?: number\n onResponse?: (req: XMLHttpRequest) => void\n}\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n }\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type NetworkRequest = {\n url: string\n}\n","import { _each, _HTTPBuildQuery, logger } from './utils'\nimport Config from './config'\nimport { PostData, XHROptions, XHRParams } from './types'\n\nexport const addParamsToURL = (\n url: string,\n urlQueryArgs: Record<string, any> | undefined,\n parameterOptions: { ip?: boolean }\n): string => {\n const args = urlQueryArgs || {}\n args['ip'] = parameterOptions['ip'] ? 1 : 0\n args['_'] = new Date().getTime().toString()\n args['ver'] = Config.LIB_VERSION\n\n const halves = url.split('?')\n if (halves.length > 1) {\n const params = halves[1].split('&')\n for (const p of params) {\n const key = p.split('=')[0]\n if (args[key]) {\n delete args[key]\n }\n }\n }\n\n const argSeparator = url.indexOf('?') > -1 ? '&' : '?'\n return url + argSeparator + _HTTPBuildQuery(args)\n}\n\nexport const encodePostData = (data: PostData | Uint8Array, options: Partial<XHROptions>): string | BlobPart | null => {\n if (options.blob && data.buffer) {\n return new Blob([data.buffer], { type: 'text/plain' })\n }\n\n if (options.sendBeacon || options.blob) {\n const body = encodePostData(data, { method: 'POST' }) as BlobPart\n return new Blob([body], { type: 'application/x-www-form-urlencoded' })\n }\n\n if (options.method !== 'POST') {\n return null\n }\n\n let body_data\n const isUint8Array = (d: unknown): d is Uint8Array => Object.prototype.toString.call(d) === '[object Uint8Array]'\n if (Array.isArray(data) || isUint8Array(data)) {\n // TODO: eh? passing an Array here?\n body_data = 'data=' + encodeURIComponent(data as any)\n } else {\n body_data = 'data=' + encodeURIComponent(data.data as string)\n }\n\n if ('compression' in data && data.compression) {\n body_data += '&compression=' + data.compression\n }\n\n return body_data\n}\n\nexport const xhr = ({\n url,\n data,\n headers,\n options,\n callback,\n retriesPerformedSoFar,\n retryQueue,\n onXHRError,\n timeout = 10000,\n onResponse,\n}: XHRParams) => {\n const req = new XMLHttpRequest()\n req.open(options.method || 'GET', url, true)\n\n const body = encodePostData(data, options)\n\n _each(headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (options.method === 'POST' && !options.blob) {\n req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')\n }\n\n req.timeout = timeout\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n onResponse?.(req)\n if (req.status === 200) {\n if (callback) {\n let response\n try {\n response = JSON.parse(req.responseText)\n } catch (e) {\n logger.error(e)\n return\n }\n callback(response)\n }\n } else {\n if (typeof onXHRError === 'function') {\n onXHRError(req)\n }\n\n // don't retry errors between 400 and 500 inclusive\n if (req.status < 400 || req.status > 500) {\n retryQueue.enqueue({\n url,\n data,\n options,\n headers,\n retriesPerformedSoFar: (retriesPerformedSoFar || 0) + 1,\n callback,\n })\n }\n\n callback?.({ status: 0 })\n }\n }\n }\n req.send(body)\n}\n","import { RequestQueueScaffold } from './base-request-queue'\nimport { encodePostData, xhr } from './send-request'\nimport { QueuedRequestData, RetryQueueElement } from './types'\nimport Config from './config'\nimport { RateLimiter } from './rate-limiter'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\nexport class RetryQueue extends RequestQueueScaffold {\n queue: RetryQueueElement[]\n isPolling: boolean\n areWeOnline: boolean\n onXHRError: (failedRequest: XMLHttpRequest) => void\n rateLimiter: RateLimiter\n\n constructor(onXHRError: (failedRequest: XMLHttpRequest) => void, rateLimiter: RateLimiter) {\n super()\n this.isPolling = false\n this.queue = []\n this.areWeOnline = true\n this.onXHRError = onXHRError\n this.rateLimiter = rateLimiter\n\n if (typeof window !== 'undefined' && 'onLine' in window.navigator) {\n this.areWeOnline = window.navigator.onLine\n window.addEventListener('online', () => {\n this._handleWeAreNowOnline()\n })\n window.addEventListener('offline', () => {\n this.areWeOnline = false\n })\n }\n }\n\n enqueue(requestData: QueuedRequestData): void {\n const retriesPerformedSoFar = requestData.retriesPerformedSoFar || 0\n if (retriesPerformedSoFar >= 10) {\n return\n }\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = new Date(Date.now() + msToNextRetry)\n\n this.queue.push({ retryAt, requestData })\n console.warn(`Enqueued failed request for retry in ${msToNextRetry}`)\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n this._poller && clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this.areWeOnline && this.queue.length > 0) {\n this.flush()\n }\n this.poll()\n }, this._pollInterval) as any as number\n }\n\n flush(): void {\n // using Date.now to make tests easier, as recommended here https://codewithhugo.com/mocking-the-current-date-in-jest-tests/\n const now = new Date(Date.now())\n const toFlush = this.queue.filter(({ retryAt }) => retryAt < now)\n if (toFlush.length > 0) {\n this.queue = this.queue.filter(({ retryAt }) => retryAt >= now)\n for (const { requestData } of toFlush) {\n this._executeXhrRequest(requestData)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n for (const { requestData } of this.queue) {\n const { url, data, options } = requestData\n\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n if (Config.DEBUG) {\n console.warn('[PostHog RetryQueue] is quota limited. Dropping request.')\n }\n continue\n }\n\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n if (Config.DEBUG) {\n console.error(e)\n }\n }\n }\n this.queue = []\n }\n\n _executeXhrRequest({ url, data, options, headers, callback, retriesPerformedSoFar }: QueuedRequestData): void {\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n return\n }\n\n xhr({\n url,\n data: data || {},\n options: options || {},\n headers: headers || {},\n retriesPerformedSoFar: retriesPerformedSoFar || 0,\n callback,\n retryQueue: this,\n onXHRError: this.onXHRError,\n onResponse: this.rateLimiter.checkForLimiting,\n })\n }\n\n _handleWeAreNowOnline(): void {\n this.areWeOnline = true\n this.flush()\n }\n}\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return typeof value === 'number' && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private timestamp = 0\n private counter = 0\n private readonly random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (value !== undefined) {\n return value\n } else {\n // reset state and resume\n this.timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (valueAfterReset === undefined) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this.timestamp) {\n this.timestamp = ts\n this.resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this.timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this.counter++\n if (this.counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this.timestamp++\n this.resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this.timestamp,\n Math.trunc(this.counter / 2 ** 30),\n this.counter & (2 ** 30 - 1),\n this.random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private resetCounter(): void {\n this.counter = this.random.nextUint32() * 0x400 + (this.random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly buffer = new Uint32Array(8)\n private cursor = Infinity\n nextUint32(): number {\n if (this.cursor >= this.buffer.length) {\n getRandomValues(this.buffer)\n this.cursor = 0\n }\n return this.buffer[this.cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n","import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuidv7 } from './uuidv7'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 mins\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 mins\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private _window_id_storage_key: string\n private _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n private _sessionActivityTimestamp: number | null\n private _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(config: Partial<PostHogConfig>, persistence: PostHogPersistence) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (typeof desiredTimeout !== 'number') {\n console.warn('[PostHog] session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.'\n )\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.'\n )\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n this._listenToReloadWindow()\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (this._sessionIdChangedHandlers === undefined) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (Array.isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`. In addition\n * to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n startTimestamp && startTimestamp > 0 && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n if (\n !sessionId ||\n (!readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs) ||\n sessionPastMaximumLength\n ) {\n sessionId = uuidv7()\n windowId = uuidv7()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = uuidv7()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) => handler(sessionId, windowId))\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n }\n }\n}\n","/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n * Sentry.init({\n * dsn: 'https://example',\n * integrations: [\n * new posthog.SentryIntegration(posthog)\n * ]\n * })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n */\n\nimport { PostHog } from '../posthog-core'\nimport { ErrorProperties } from './exceptions/error-conversion'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n// Event as _SentryEvent,\n// EventProcessor as _SentryEventProcessor,\n// Hub as _SentryHub,\n// Integration as _SentryIntegration,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n name: string\n setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\ninterface SentryExceptionProperties {\n $sentry_event_id: any\n $sentry_exception: any\n $sentry_exception_message: any\n $sentry_exception_type: any\n $sentry_tags: any\n $sentry_url?: string\n}\n\nexport class SentryIntegration implements _SentryIntegration {\n name: string\n\n setupOnce: (\n addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n getCurrentHub: () => _SentryHub\n ) => void\n\n constructor(_posthog: PostHog, organization?: string, projectId?: number, prefix?: string) {\n // setupOnce gets called by Sentry when it intializes the plugin\n this.name = 'posthog-js'\n this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n addGlobalEventProcessor((event: _SentryEvent) => {\n if (event.level !== 'error' || !_posthog.__loaded) return event\n if (!event.tags) event.tags = {}\n\n const host = _posthog.config.ui_host || _posthog.config.api_host\n event.tags['PostHog Person URL'] = host + '/person/' + _posthog.get_distinct_id()\n if (_posthog.sessionRecordingStarted()) {\n event.tags['PostHog Recording URL'] = _posthog.get_session_replay_url({ withTimestamp: true })\n }\n\n const exceptions = event.exception?.values || []\n\n const data: SentryExceptionProperties & ErrorProperties = {\n // PostHog Exception Properties,\n $exception_message: exceptions[0]?.value,\n $exception_type: exceptions[0]?.type,\n $exception_personURL: host + '/person/' + _posthog.get_distinct_id(),\n // Sentry Exception Properties\n $sentry_event_id: event.event_id,\n $sentry_exception: event.exception,\n $sentry_exception_message: exceptions[0]?.value,\n $sentry_exception_type: exceptions[0]?.type,\n $sentry_tags: event.tags,\n }\n\n if (organization && projectId)\n data['$sentry_url'] =\n (prefix || 'https://sentry.io/organizations/') +\n organization +\n '/issues/?project=' +\n projectId +\n '&query=' +\n event.event_id\n _posthog.capture('$exception', data)\n return event\n })\n }\n }\n}\n","/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\n\n// Loosely based on https://github.com/segmentio/analytics-next/blob/master/packages/core/src/plugins/index.ts\ninterface SegmentPluginContext {\n event: {\n event: string\n userId?: string\n anonymousId?: string\n properties: any\n }\n}\n\ninterface SegmentPlugin {\n name: string\n version: string\n type: 'enrichment'\n isLoaded: () => boolean\n load: (ctx: SegmentPluginContext, instance: any, config?: any) => Promise<unknown>\n unload?: (ctx: SegmentPluginContext, instance: any) => Promise<unknown> | unknown\n ready?: () => Promise<unknown>\n track?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n identify?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n page?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n group?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n alias?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n screen?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n}\n\nexport const createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (!Promise || !Promise.resolve) {\n console.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentPluginContext, eventName: string) => {\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n posthog.register({\n distinct_id: ctx.event.userId,\n })\n posthog.reloadFeatureFlags()\n }\n\n const additionalProperties = posthog._calculate_event_properties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n","import { window } from './utils'\n\ninterface PageViewData {\n pathname: string\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\ninterface ScrollProperties {\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\ninterface PageViewEventProperties extends ScrollProperties {\n $prev_pageview_pathname?: string\n}\n\nexport class PageViewManager {\n _pageViewData: PageViewData | undefined\n _hasSeenPageView = false\n\n _createPageViewData(): PageViewData {\n return {\n pathname: window.location.pathname,\n }\n }\n\n doPageView(): PageViewEventProperties {\n let prevPageViewData: PageViewData | undefined\n // if there were events created before the first PageView, we would have created a\n // pageViewData for them. If this happened, we don't want to create a new pageViewData\n if (!this._hasSeenPageView) {\n this._hasSeenPageView = true\n prevPageViewData = undefined\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n } else {\n prevPageViewData = this._pageViewData\n this._pageViewData = this._createPageViewData()\n }\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n doPageLeave(): PageViewEventProperties {\n const prevPageViewData = this._pageViewData\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n _calculatePrevPageScrollProperties(prevPageViewData: PageViewData | undefined): ScrollProperties {\n if (\n !prevPageViewData ||\n prevPageViewData.maxScrollHeight == null ||\n prevPageViewData.lastScrollY == null ||\n prevPageViewData.maxScrollY == null ||\n prevPageViewData.maxContentHeight == null ||\n prevPageViewData.lastContentY == null ||\n prevPageViewData.maxContentY == null\n ) {\n return {}\n }\n\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } = prevPageViewData\n\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(lastScrollY / maxScrollHeight, 0, 1)\n const maxScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(maxScrollY / maxScrollHeight, 0, 1)\n const lastContentPercentage = maxContentHeight <= 1 ? 1 : clamp(lastContentY / maxContentHeight, 0, 1)\n const maxContentPercentage = maxContentHeight <= 1 ? 1 : clamp(maxContentY / maxContentHeight, 0, 1)\n\n return {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n }\n }\n\n _updateScrollData = () => {\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n const pageViewData = this._pageViewData\n\n const scrollY = this._scrollY()\n const scrollHeight = this._scrollHeight()\n const contentY = this._contentY()\n const contentHeight = this._contentHeight()\n\n pageViewData.lastScrollY = scrollY\n pageViewData.maxScrollY = Math.max(scrollY, pageViewData.maxScrollY ?? 0)\n pageViewData.maxScrollHeight = Math.max(scrollHeight, pageViewData.maxScrollHeight ?? 0)\n\n pageViewData.lastContentY = contentY\n pageViewData.maxContentY = Math.max(contentY, pageViewData.maxContentY ?? 0)\n pageViewData.maxContentHeight = Math.max(contentHeight, pageViewData.maxContentHeight ?? 0)\n }\n\n startMeasuringScrollPosition() {\n window.addEventListener('scroll', this._updateScrollData)\n window.addEventListener('scrollend', this._updateScrollData)\n window.addEventListener('resize', this._updateScrollData)\n }\n\n stopMeasuringScrollPosition() {\n window.removeEventListener('scroll', this._updateScrollData)\n window.removeEventListener('scrollend', this._updateScrollData)\n window.removeEventListener('resize', this._updateScrollData)\n }\n\n _scrollHeight(): number {\n return Math.max(0, window.document.documentElement.scrollHeight - window.document.documentElement.clientHeight)\n }\n\n _scrollY(): number {\n return window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0\n }\n\n _contentHeight(): number {\n return window.document.documentElement.scrollHeight || 0\n }\n\n _contentY(): number {\n const clientHeight = window.document.documentElement.clientHeight || 0\n return this._scrollY() + clientHeight\n }\n}\n\nfunction clamp(x: number, min: number, max: number) {\n return Math.max(min, Math.min(x, max))\n}\n","export function isEvent(candidate: unknown): candidate is Event {\n return typeof Event !== 'undefined' && isInstanceOf(candidate, Event)\n}\n\nexport function isPlainObject(candidate: unknown): candidate is Record<string, unknown> {\n return isBuiltin(candidate, 'Object')\n}\n\nexport function isInstanceOf(candidate: unknown, base: any): boolean {\n try {\n return candidate instanceof base\n } catch (_e) {\n return false\n }\n}\n\nexport function isPrimitive(\n candidate: unknown\n): candidate is number | string | boolean | bigint | symbol | null | undefined {\n return candidate === null || (typeof candidate !== 'object' && typeof candidate !== 'function')\n}\n\nexport function isError(candidate: unknown): candidate is Error {\n switch (Object.prototype.toString.call(candidate)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true\n default:\n return isInstanceOf(candidate, Error)\n }\n}\n\nexport function isErrorEvent(event: string | Error | Event): event is ErrorEvent {\n return isBuiltin(event, 'ErrorEvent')\n}\n\nexport function isErrorWithStack(candidate: unknown): candidate is Error {\n return 'stack' in (candidate as Error)\n}\n\nexport function isBuiltin(candidate: unknown, className: string): boolean {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`\n}\n\nexport function isDOMException(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMException')\n}\n\nexport function isDOMError(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMError')\n}\n","// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (lineno !== undefined) {\n frame.lineno = lineno\n }\n\n if (colno !== undefined) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n","import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\n\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\n\nexport type ErrorEventArgs = [\n event: string | Event,\n source?: string | undefined,\n lineno?: number | undefined,\n colno?: number | undefined,\n error?: Error | undefined\n]\n\nexport interface ErrorProperties {\n $exception_type: string\n $exception_message: string\n $exception_source?: string\n $exception_lineno?: number\n $exception_colno?: number\n $exception_DOMException_code?: string\n $exception_is_synthetic?: boolean\n $exception_stack_trace_raw?: string\n $exception_handled?: boolean\n $exception_personURL?: string\n}\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n }\n\n return 0\n}\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const popSize = getPopSize(ex)\n\n try {\n return defaultStackParser(stacktrace, popSize)\n } catch (e) {\n // no-empty\n }\n\n return []\n}\n\nfunction errorPropertiesFromError(error: Error): ErrorProperties {\n const frames = parseStackFrames(error)\n\n return {\n $exception_type: error.name,\n $exception_message: error.message,\n $exception_stack_trace_raw: JSON.stringify(frames),\n }\n}\n\nfunction errorPropertiesFromString(candidate: string): ErrorProperties {\n return {\n $exception_type: 'Error',\n $exception_message: candidate,\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>): ErrorProperties {\n return {\n $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',\n $exception_message: `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`,\n }\n}\n\nexport function errorToProperties([event, source, lineno, colno, error]: ErrorEventArgs): ErrorProperties {\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n\n if (error === undefined && typeof event === 'string') {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n errorProperties = {\n $exception_type: name,\n $exception_message: message,\n }\n }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n errorProperties = errorPropertiesFromString(message)\n errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties.$exception_message = errorProperties.$exception_message || message\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n errorProperties = errorPropertiesFromError((candidate as ErrorEvent).error as Error)\n } else if (isError(candidate)) {\n errorProperties = errorPropertiesFromError(candidate)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n errorProperties = errorPropertiesFromObject(objectException)\n errorProperties.$exception_is_synthetic = true\n } else {\n // If none of previous checks were valid, then it must be a string\n errorProperties.$exception_type = errorProperties.$exception_type || 'Error'\n errorProperties.$exception_message = errorProperties.$exception_message || candidate\n errorProperties.$exception_is_synthetic = true\n }\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: errorProperties.$exception_type || 'UnknownErrorType',\n $exception_message: errorProperties.$exception_message || '',\n ...(source\n ? {\n $exception_source: source, // TODO get this from URL if not present\n }\n : {}),\n ...(lineno ? { $exception_lineno: lineno } : {}),\n ...(colno ? { $exception_colno: colno } : {}),\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n // dig the object of the rejection out of known event types\n let error: unknown = ev\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in ev) {\n error = ev.reason\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in ev && 'reason' in (ev as any).detail) {\n error = (ev as any).detail.reason\n }\n } catch (_oO) {\n // no-empty\n }\n\n // exception type and message are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message'> & {\n $exception_type?: string\n $exception_message?: string\n } = {}\n if (isPrimitive(error)) {\n errorProperties = {\n $exception_message: `Non-Error promise rejection captured with value: ${String(error)}`,\n }\n } else {\n errorProperties = errorToProperties([error as string | Event])\n }\n errorProperties.$exception_handled = false\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: (errorProperties.$exception_type = 'UnhandledRejection'),\n $exception_message: (errorProperties.$exception_message =\n errorProperties.$exception_message || (ev as any).reason || String(error)),\n }\n}\n","import { window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n private debugLog(...args: any[]) {\n if (this.instance.get_config('debug')) {\n console.log('PostHog.js [PostHog.ExceptionObserver]', ...args)\n }\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n console.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (this.originalOnErrorHandler !== undefined) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (this.originalOnUnhandledRejectionHandler !== undefined) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n Array.isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n this.debugLog('Remote config for exception autocapture is enabled, starting', autocaptureExceptionsResponse)\n } else {\n this.debugLog(\n 'Remote config for exception autocapture is disabled, not starting',\n autocaptureExceptionsResponse\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n this.debugLog('Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.get_config('ui_host') || this.instance.get_config('api_host')\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n","import { PostHog } from './posthog-core'\nimport { SURVEYS } from './constants'\n\n/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\nexport interface SurveyAppearance {\n background_color?: string\n button_color?: string\n text_color?: string\n}\n\nexport enum SurveyType {\n Popover = 'Popover',\n Button = 'Button',\n Email = 'Email',\n FullScreen = 'Fullscreen',\n}\n\nexport interface SurveyQuestion {\n type: SurveyQuestionType\n question: string\n required?: boolean\n link?: boolean\n choices?: string[]\n}\n\nexport enum SurveyQuestionType {\n Open = 'open',\n MultipleChoiceSingle = 'multiple_single',\n MultipleChoiceMulti = 'multiple_multi',\n NPS = 'nps',\n Rating = 'rating',\n Link = 'link',\n}\n\nexport interface SurveyResponse {\n surveys: Survey[]\n}\n\nexport type SurveyCallback = (surveys: Survey[]) => void\n\nexport interface Survey {\n // Sync this with the backend's SurveySerializer!\n name: string\n description: string\n type: SurveyType\n linked_flag_key?: string | null\n targeting_flag_key?: string | null\n questions: SurveyQuestion[]\n appearance?: SurveyAppearance | null\n conditions?: { url?: string; selector?: string } | null\n start_date?: string | null\n end_date?: string | null\n}\n\nexport class PostHogSurveys {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n const existingSurveys = this.instance.get_property(SURVEYS)\n if (!existingSurveys || forceReload) {\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/api/surveys/?token=${this.instance.get_config('token')}`,\n {},\n { method: 'GET' },\n (response) => {\n const surveys = response.surveys\n this.instance.persistence?.register({ [SURVEYS]: surveys })\n return callback(surveys)\n }\n )\n } else {\n return callback(existingSurveys)\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n this.getSurveys((surveys) => {\n const activeSurveys = surveys.filter((survey) => {\n return !!(survey.start_date && !survey.end_date)\n })\n const conditionMatchedSurveys = activeSurveys.filter((survey) => {\n if (!survey.conditions) {\n return true\n }\n const urlCheck = survey.conditions?.url\n ? window.location.href.indexOf(survey.conditions.url) > -1\n : true\n const selectorCheck = survey.conditions?.selector\n ? document.querySelector(survey.conditions.selector)\n : true\n return urlCheck && selectorCheck\n })\n const targetingMatchedSurveys = conditionMatchedSurveys.filter((survey) => {\n if (!survey.linked_flag_key && !survey.targeting_flag_key) {\n return true\n }\n const linkedFlagCheck = survey.linked_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n return linkedFlagCheck && targetingFlagCheck\n })\n\n return callback(targetingMatchedSurveys)\n }, forceReload)\n }\n}\n","import Config from './config'\nimport {\n _copyAndTruncateStrings,\n _each,\n _eachArray,\n _extend,\n _info,\n _isArray,\n _isBlockedUA,\n _isObject,\n _isUndefined,\n _register_event,\n _safewrap_class,\n document,\n logger,\n userAgent,\n window,\n} from './utils'\nimport { autocapture } from './autocapture'\nimport { PostHogFeatureFlags } from './posthog-featureflags'\nimport { PostHogPersistence } from './posthog-persistence'\nimport { ALIAS_ID_KEY, FLAG_CALL_REPORTED, PEOPLE_DISTINCT_ID_KEY } from './constants'\nimport { SessionRecording } from './extensions/sessionrecording'\nimport { WebPerformanceObserver } from './extensions/web-performance'\nimport { Decide } from './decide'\nimport { Toolbar } from './extensions/toolbar'\nimport { clearOptInOut, hasOptedIn, hasOptedOut, optIn, optOut, userOptedOut } from './gdpr-utils'\nimport { cookieStore, localStore } from './storage'\nimport { RequestQueue } from './request-queue'\nimport { compressData, decideCompression } from './compression'\nimport { addParamsToURL, encodePostData, xhr } from './send-request'\nimport { RetryQueue } from './retry-queue'\nimport { SessionIdManager } from './sessionid'\nimport {\n AutocaptureConfig,\n CaptureOptions,\n CaptureResult,\n Compression,\n EarlyAccessFeatureCallback,\n GDPROptions,\n isFeatureEnabledOptions,\n JSC,\n JsonType,\n OptInOutCapturingOptions,\n PostHogConfig,\n Properties,\n Property,\n RequestCallback,\n SessionIdChangedCallback,\n SnippetArrayItem,\n ToolbarParams,\n XHROptions,\n} from './types'\nimport { SentryIntegration } from './extensions/sentry-integration'\nimport { createSegmentIntegration } from './extensions/segment-integration'\nimport { PageViewManager } from './page-view'\nimport { ExceptionObserver } from './extensions/exceptions/exception-autocapture'\nimport { PostHogSurveys, SurveyCallback } from './posthog-surveys'\nimport { RateLimiter } from './rate-limiter'\nimport { uuidv7 } from './uuidv7'\n\n/*\nSIMPLE STYLE GUIDE:\n\nthis.x === public function\nthis._x === internal - only use within this file\nthis.__x === private - only use within the class\n\nGlobals should be all caps\n*/\n\nenum InitType {\n INIT_MODULE = 0,\n INIT_SNIPPET = 1,\n}\n\nlet init_type: InitType\n\n// TODO: the type of this is very loose. Sometimes it's also PostHogLib itself\nlet posthog_master: Record<string, PostHog> & {\n init: (token: string, config: Partial<PostHogConfig>, name: string) => void\n}\n\n// some globals for comparisons\nconst __NOOP = () => {}\nconst __NOOPTIONS = {}\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\nconst USE_XHR = window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !USE_XHR && userAgent.indexOf('MSIE') === -1 && userAgent.indexOf('Mozilla') === -1\n\nconst defaultConfig = (): PostHogConfig => ({\n api_host: 'https://app.posthog.com',\n api_method: 'POST',\n api_transport: 'XHR',\n ui_host: null,\n token: '',\n autocapture: true,\n rageclick: true,\n cross_subdomain_cookie: document?.location?.hostname?.indexOf('herokuapp.com') === -1,\n persistence: 'cookie',\n persistence_name: '',\n cookie_name: '',\n loaded: __NOOP,\n store_google: true,\n custom_campaign_params: [],\n custom_blocked_useragents: [],\n save_referrer: true,\n test: false,\n verbose: false,\n capture_pageview: true,\n capture_pageleave: true, // We'll only capture pageleave events if capture_pageview is also true\n debug: false,\n cookie_expiration: 365,\n upgrade: false,\n disable_session_recording: false,\n disable_persistence: false,\n disable_cookie: false,\n enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n secure_cookie: window?.location?.protocol === 'https:',\n ip: true,\n opt_out_capturing_by_default: false,\n opt_out_persistence_by_default: false,\n opt_out_capturing_persistence_type: 'localStorage',\n opt_out_capturing_cookie_prefix: null,\n opt_in_site_apps: false,\n property_blacklist: [],\n respect_dnt: false,\n sanitize_properties: null,\n xhr_headers: {}, // { header: value, header2: value }\n inapp_protocol: '//',\n inapp_link_new_window: false,\n request_batching: true,\n properties_string_max_length: 65535,\n session_recording: {},\n mask_all_element_attributes: false,\n mask_all_text: false,\n advanced_disable_decide: false,\n advanced_disable_feature_flags: false,\n advanced_disable_feature_flags_on_first_load: false,\n advanced_disable_toolbar_metrics: false,\n on_xhr_error: (req) => {\n const error = 'Bad HTTP status: ' + req.status + ' ' + req.statusText\n console.error(error)\n },\n get_device_id: (uuid) => uuid,\n // Used for internal testing\n _onCapture: __NOOP,\n capture_performance: undefined,\n name: 'posthog',\n callback_fn: 'posthog._jsc',\n bootstrap: {},\n disable_compression: false,\n session_idle_timeout_seconds: 30 * 60, // 30 minutes\n})\n\n/**\n * create_phlib(token:string, config:object, name:string)\n *\n * This function is used by the init method of PostHogLib objects\n * as well as the main initializer at the end of the JSLib (that\n * initializes document.posthog as well as any additional instances\n * declared before this file has loaded).\n */\nconst create_phlib = function (\n token: string,\n config?: Partial<PostHogConfig>,\n name?: string,\n createComplete?: (instance: PostHog) => void\n): PostHog {\n let instance: PostHog\n const target =\n name === PRIMARY_INSTANCE_NAME || !posthog_master ? posthog_master : name ? posthog_master[name] : undefined\n const callbacksHandled = {\n initComplete: false,\n syncCode: false,\n }\n const handleCallback = (callbackName: keyof typeof callbacksHandled) => (instance: PostHog) => {\n if (!callbacksHandled[callbackName]) {\n callbacksHandled[callbackName] = true\n if (callbacksHandled.initComplete && callbacksHandled.syncCode) {\n createComplete?.(instance)\n }\n }\n }\n\n if (target && init_type === InitType.INIT_MODULE) {\n instance = target as any\n } else {\n if (target && !_isArray(target)) {\n console.error('You have already initialized ' + name)\n // TODO: throw something instead?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return\n }\n instance = new PostHog()\n }\n\n instance._init(token, config, name, handleCallback('initComplete'))\n instance.toolbar.maybeLoadToolbar()\n\n instance.sessionRecording = new SessionRecording(instance)\n instance.sessionRecording.startRecordingIfEnabled()\n\n instance.webPerformance = new WebPerformanceObserver(instance)\n instance.webPerformance.startObservingIfEnabled()\n\n if (instance.get_config('__preview_measure_pageview_stats')) {\n instance.pageViewManager.startMeasuringScrollPosition()\n }\n\n instance.exceptionAutocapture = new ExceptionObserver(instance)\n\n instance.__autocapture = instance.get_config('autocapture')\n autocapture._setIsAutocaptureEnabled(instance)\n if (autocapture._isAutocaptureEnabled) {\n instance.__autocapture = instance.get_config('autocapture')\n const num_buckets = 100\n const num_enabled_buckets = 100\n if (!autocapture.enabledForProject(instance.get_config('token'), num_buckets, num_enabled_buckets)) {\n instance.__autocapture = false\n logger.log('Not in active bucket: disabling Automatic Event Collection.')\n } else if (!autocapture.isBrowserSupported()) {\n instance.__autocapture = false\n logger.log('Disabling Automatic Event Collection because this browser is not supported')\n } else {\n autocapture.init(instance)\n }\n }\n\n // if any instance on the page has debug = true, we set the\n // global debug to be true\n Config.DEBUG = Config.DEBUG || instance.get_config('debug')\n\n // if target is not defined, we called init after the lib already\n // loaded, so there won't be an array of things to execute\n if (typeof target !== 'undefined' && _isArray(target)) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance.people, (target as any).people)\n instance._execute_array(target)\n }\n\n handleCallback('syncCode')(instance)\n return instance\n}\n\n/**\n * PostHog Library Object\n * @constructor\n */\nexport class PostHog {\n __loaded: boolean\n __loaded_recorder_version: 'v1' | 'v2' | undefined // flag that keeps track of which version of recorder is loaded\n config: PostHogConfig\n\n rateLimiter: RateLimiter\n pageViewManager: PageViewManager\n featureFlags: PostHogFeatureFlags\n surveys: PostHogSurveys\n toolbar: Toolbar\n\n // These are instance-specific state created after initialisation\n persistence?: PostHogPersistence\n sessionPersistence?: PostHogPersistence\n sessionManager?: SessionIdManager\n\n _requestQueue?: RequestQueue\n _retryQueue?: RetryQueue\n sessionRecording?: SessionRecording\n webPerformance?: WebPerformanceObserver\n exceptionAutocapture?: ExceptionObserver\n\n _triggered_notifs: any\n compression: Partial<Record<Compression, boolean>>\n _jsc: JSC\n __captureHooks: ((eventName: string) => void)[]\n __request_queue: [url: string, data: Record<string, any>, options: XHROptions, callback?: RequestCallback][]\n __autocapture: boolean | AutocaptureConfig | undefined\n decideEndpointWasHit: boolean\n\n SentryIntegration: typeof SentryIntegration\n segmentIntegration: () => any\n\n /** DEPRECATED: We keep this to support existing usage but now one should just call .setPersonProperties */\n people: {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n }\n\n constructor() {\n this.config = defaultConfig()\n this.compression = {}\n this.decideEndpointWasHit = false\n this.SentryIntegration = SentryIntegration\n this.segmentIntegration = () => createSegmentIntegration(this)\n this.__captureHooks = []\n this.__request_queue = []\n this.__loaded = false\n this.__loaded_recorder_version = undefined\n this.__autocapture = undefined\n this._jsc = function () {} as JSC\n\n this.featureFlags = new PostHogFeatureFlags(this)\n this.toolbar = new Toolbar(this)\n this.pageViewManager = new PageViewManager()\n this.surveys = new PostHogSurveys(this)\n this.rateLimiter = new RateLimiter()\n\n // NOTE: See the property definition for deprecation notice\n this.people = {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = typeof prop === 'string' ? { [prop]: to } : prop\n this.setPersonProperties(setProps)\n callback?.({})\n },\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = typeof prop === 'string' ? { [prop]: to } : prop\n this.setPersonProperties(undefined, setProps)\n callback?.({})\n },\n }\n }\n\n // Initialization methods\n\n /**\n * This function initializes a new instance of the PostHog capturing object.\n * All new instances are added to the main posthog object as sub properties (such as\n * posthog.library_name) and also returned by this function. To define a\n * second instance on the page, you would call:\n *\n * posthog.init('new token', { your: 'config' }, 'library_name');\n *\n * and use it like so:\n *\n * posthog.library_name.capture(...);\n *\n * @param {String} token Your PostHog API token\n * @param {Object} [config] A dictionary of config options to override. <a href=\"https://github.com/posthog/posthog-js/blob/6e0e873/src/posthog-core.js#L57-L91\">See a list of default config options</a>.\n * @param {String} [name] The name for the new posthog instance that you want created\n */\n init(token: string, config?: Partial<PostHogConfig>, name?: string): PostHog | void {\n if (_isUndefined(name)) {\n console.error('You must name your new library: init(token, config, name)')\n return\n }\n if (name === PRIMARY_INSTANCE_NAME) {\n console.error('You must initialize the main posthog object right after you include the PostHog js snippet')\n return\n }\n\n const instance: PostHog = create_phlib(token, config, name, (instance: PostHog) => {\n posthog_master[name] = instance\n instance._loaded()\n })\n posthog_master[name] = instance\n\n return instance\n }\n\n // posthog._init(token:string, config:object, name:string)\n //\n // This function sets up the current instance of the posthog\n // library. The difference between this method and the init(...)\n // method is this one initializes the actual instance, whereas the\n // init(...) method sets up a new library and calls _init on it.\n //\n // Note that there are operations that can be asynchronous, so we\n // accept a callback that is called when all the asynchronous work\n // is done. Note that we do not use promises because we want to be\n // IE11 compatible. We could use polyfills, which would make the\n // code a bit cleaner, but will add some overhead.\n //\n _init(\n token: string,\n config: Partial<PostHogConfig> = {},\n name?: string,\n initComplete?: (instance: PostHog) => void\n ): void {\n this.__loaded = true\n this.config = {} as PostHogConfig // will be set right below\n this._triggered_notifs = []\n\n // To avoid using Promises and their helper functions, we instead keep\n // track of which callbacks have been called, and then call initComplete\n // when all of them have been called. To add additional async code, add\n // to `callbacksHandled` and pass updateInitComplete as a callback to\n // the async code.\n const callbacksHandled = { segmentRegister: false, syncCode: false }\n const updateInitComplete = (callbackName: keyof typeof callbacksHandled) => () => {\n // Update the register of callbacks that have been called, and if\n // they have all been called, then we are ready to call\n // initComplete.\n if (!callbacksHandled[callbackName]) {\n callbacksHandled[callbackName] = true\n if (callbacksHandled.segmentRegister && callbacksHandled.syncCode) {\n initComplete?.(this)\n }\n }\n }\n\n this.set_config(\n _extend({}, defaultConfig(), config, {\n name: name,\n token: token,\n callback_fn: (name === PRIMARY_INSTANCE_NAME ? name : PRIMARY_INSTANCE_NAME + '.' + name) + '._jsc',\n })\n )\n\n this._jsc = function () {} as JSC\n\n // Check if recorder.js is already loaded\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (window?.rrweb?.record || window?.rrwebRecord) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.__loaded_recorder_version = window?.rrweb?.version\n }\n\n this.persistence = new PostHogPersistence(this.config)\n\n this._requestQueue = new RequestQueue(this._handle_queued_event.bind(this))\n this._retryQueue = new RetryQueue(this.get_config('on_xhr_error'), this.rateLimiter)\n this.__captureHooks = []\n this.__request_queue = []\n\n this.sessionManager = new SessionIdManager(this.config, this.persistence)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage'\n ? this.persistence\n : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' })\n\n this._gdpr_init()\n\n if (config.segment) {\n // Use segments anonymousId instead\n this.config.get_device_id = () => config.segment.user().anonymousId()\n\n // If a segment user ID exists, set it as the distinct_id\n if (config.segment.user().id()) {\n this.register({\n distinct_id: config.segment.user().id(),\n })\n this.persistence.set_user_state('identified')\n }\n\n config.segment.register(this.segmentIntegration()).then(updateInitComplete('segmentRegister'))\n } else {\n updateInitComplete('segmentRegister')()\n }\n\n if (config.bootstrap?.distinctID !== undefined) {\n const uuid = this.get_config('get_device_id')(uuidv7())\n const deviceID = config.bootstrap?.isIdentifiedID ? uuid : config.bootstrap.distinctID\n this.persistence.set_user_state(config.bootstrap?.isIdentifiedID ? 'identified' : 'anonymous')\n this.register({\n distinct_id: config.bootstrap.distinctID,\n $device_id: deviceID,\n })\n }\n\n if (this._hasBootstrappedFeatureFlags()) {\n const activeFlags = Object.keys(config.bootstrap?.featureFlags || {})\n .filter((flag) => !!config.bootstrap?.featureFlags?.[flag])\n .reduce(\n (res: Record<string, string | boolean>, key) => (\n (res[key] = config.bootstrap?.featureFlags?.[key] || false), res\n ),\n {}\n )\n const featureFlagPayloads = Object.keys(config.bootstrap?.featureFlagPayloads || {})\n .filter((key) => activeFlags[key])\n .reduce((res: Record<string, JsonType>, key) => {\n if (config.bootstrap?.featureFlagPayloads?.[key]) {\n res[key] = config.bootstrap?.featureFlagPayloads?.[key]\n }\n return res\n }, {})\n\n this.featureFlags.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n }\n\n if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persitence\n const uuid = this.get_config('get_device_id')(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: uuid,\n },\n ''\n )\n // distinct id == $device_id is a proxy for anonymous user\n this.persistence.set_user_state('anonymous')\n }\n // Set up event handler for pageleave\n // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n window.addEventListener &&\n window.addEventListener('onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this))\n\n // Make sure that we also call the initComplete callback at the end of\n // the synchronous code as well.\n updateInitComplete('syncCode')()\n }\n\n // Private methods\n\n _loaded(): void {\n // Pause `reloadFeatureFlags` calls in config.loaded callback.\n // These feature flags are loaded in the decide call made right\n // afterwards\n const disableDecide = this.get_config('advanced_disable_decide')\n if (!disableDecide) {\n this.featureFlags.setReloadingPaused(true)\n }\n\n try {\n this.get_config('loaded')(this)\n } catch (err) {\n console.error('`loaded` function failed', err)\n }\n\n this._start_queue_if_opted_in()\n\n // this happens after so a user can call identify in\n // the loaded callback\n if (this.get_config('capture_pageview')) {\n this.capture('$pageview', { title: document.title }, { send_instantly: true })\n }\n\n // Call decide to get what features are enabled and other settings.\n // As a reminder, if the /decide endpoint is disabled, feature flags, toolbar, session recording, autocapture,\n // and compression will not be available.\n if (!disableDecide) {\n new Decide(this).call()\n }\n }\n\n _start_queue_if_opted_in(): void {\n if (!this.has_opted_out_capturing()) {\n if (this.get_config('request_batching')) {\n this._requestQueue?.poll()\n }\n }\n }\n\n _dom_loaded(): void {\n if (!this.has_opted_out_capturing()) {\n _eachArray(this.__request_queue, (item) => {\n this._send_request(...item)\n })\n }\n\n this.__request_queue = []\n\n this._start_queue_if_opted_in()\n }\n\n /**\n * _prepare_callback() should be called by callers of _send_request for use\n * as the callback argument.\n *\n * If there is no callback, this returns null.\n * If we are going to make XHR/XDR requests, this returns a function.\n * If we are going to use script tags, this returns a string to use as the\n * callback GET param.\n */\n // TODO: get rid of the \"| string\"\n _prepare_callback(callback?: RequestCallback, data?: Properties): RequestCallback | null | string {\n if (_isUndefined(callback)) {\n return null\n }\n\n if (USE_XHR) {\n return function (response) {\n callback(response, data)\n }\n } else {\n // if the user gives us a callback, we store as a random\n // property on this instances jsc function and update our\n // callback string to reflect that.\n const jsc = this._jsc\n const randomized_cb = '' + Math.floor(Math.random() * 100000000)\n const callback_string = this.get_config('callback_fn') + '[' + randomized_cb + ']'\n jsc[randomized_cb] = function (response: any) {\n delete jsc[randomized_cb]\n callback(response, data)\n }\n return callback_string\n }\n }\n\n _handle_unload(): void {\n if (!this.get_config('request_batching')) {\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave', null, { transport: 'sendBeacon' })\n }\n return\n }\n\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave')\n }\n\n this._requestQueue?.unload()\n this._retryQueue?.unload()\n }\n\n _handle_queued_event(url: string, data: Record<string, any>, options?: XHROptions): void {\n const jsonData = JSON.stringify(data)\n this.__compress_and_send_json_request(url, jsonData, options || __NOOPTIONS, __NOOP)\n }\n\n __compress_and_send_json_request(\n url: string,\n jsonData: string,\n options: XHROptions,\n callback?: RequestCallback\n ): void {\n const [data, _options] = compressData(decideCompression(this.compression), jsonData, options)\n this._send_request(url, data, _options, callback)\n }\n\n _send_request(url: string, data: Record<string, any>, options: CaptureOptions, callback?: RequestCallback): void {\n if (!this.__loaded || !this._retryQueue) {\n return\n }\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n return\n }\n\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push([url, data, options, callback])\n return\n }\n\n const DEFAULT_OPTIONS = {\n method: this.get_config('api_method'),\n transport: this.get_config('api_transport'),\n verbose: this.get_config('verbose'),\n }\n\n options = _extend(DEFAULT_OPTIONS, options || {})\n if (!USE_XHR) {\n options.method = 'GET'\n }\n\n const useSendBeacon = 'sendBeacon' in window.navigator && options.transport === 'sendBeacon'\n url = addParamsToURL(url, options.urlQueryArgs || {}, {\n ip: this.get_config('ip'),\n })\n\n if (useSendBeacon) {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n try {\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n } else if (USE_XHR) {\n try {\n xhr({\n url: url,\n data: data,\n headers: this.get_config('xhr_headers'),\n options: options,\n callback,\n retriesPerformedSoFar: 0,\n retryQueue: this._retryQueue,\n onXHRError: this.get_config('on_xhr_error'),\n onResponse: this.rateLimiter.checkForLimiting,\n })\n } catch (e) {\n console.error(e)\n }\n } else {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.async = true\n script.defer = true\n script.src = url\n const s = document.getElementsByTagName('script')[0]\n s.parentNode?.insertBefore(script, s)\n }\n }\n\n /**\n * _execute_array() deals with processing any posthog function\n * calls that were called before the PostHog library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the posthog function calls && user defined\n * functions BEFORE we fire off posthog capturing calls. This is so\n * identify/register/set_config calls can properly modify early\n * capturing calls.\n *\n * @param {Array} array\n */\n _execute_array(array: SnippetArrayItem[]): void {\n let fn_name\n const alias_calls: SnippetArrayItem[] = []\n const other_calls: SnippetArrayItem[] = []\n const capturing_calls: SnippetArrayItem[] = []\n _eachArray(array, (item) => {\n if (item) {\n fn_name = item[0]\n if (_isArray(fn_name)) {\n capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n } else if (typeof item === 'function') {\n ;(item as any).call(this)\n } else if (_isArray(item) && fn_name === 'alias') {\n alias_calls.push(item)\n } else if (\n _isArray(item) &&\n fn_name.indexOf('capture') !== -1 &&\n typeof (this as any)[fn_name] === 'function'\n ) {\n capturing_calls.push(item)\n } else {\n other_calls.push(item)\n }\n }\n })\n\n const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n _eachArray(\n calls,\n function (item) {\n if (_isArray(item[0])) {\n // chained call\n let caller = thisArg\n _each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1))\n })\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[item[0]].apply(this, item.slice(1))\n }\n },\n thisArg\n )\n }\n\n execute(alias_calls, this)\n execute(other_calls, this)\n execute(capturing_calls, this)\n }\n\n _hasBootstrappedFeatureFlags(): boolean {\n return (\n (this.config.bootstrap?.featureFlags && Object.keys(this.config.bootstrap?.featureFlags).length > 0) ||\n false\n )\n }\n\n /**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * ### Usage:\n * posthog.push(['register', { a: 'b' }]);\n *\n * @param {Array} item A [function_name, args...] array to be executed\n */\n push(item: SnippetArrayItem): void {\n this._execute_array([item])\n }\n\n /*\n * PostHog supports exception autocapture, however, this function\n * is used to manually capture an exception\n * and can be used to add more context to that exception\n *\n * Properties passed as the second option will be merged with the properties\n * of the exception event.\n * Where there is a key in both generated exception and passed properties,\n * the generated exception property takes precedence.\n */\n captureException(exception: Error, properties?: Properties): void {\n this.exceptionAutocapture?.captureException(\n [exception.name, undefined, undefined, undefined, exception],\n properties\n )\n }\n\n /**\n * Capture an event. This is the most important and\n * frequently used PostHog function.\n *\n * ### Usage:\n *\n * // capture an event named 'Registered'\n * posthog.capture('Registered', {'Gender': 'Male', 'Age': 21});\n *\n * // capture an event using navigator.sendBeacon\n * posthog.capture('Left page', {'duration_seconds': 35}, {transport: 'sendBeacon'});\n *\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Object} [options] Optional configuration for this capture request.\n * @param {String} [options.transport] Transport method for network request ('XHR' or 'sendBeacon').\n * @param {Date} [options.timestamp] Timestamp is a Date object. If not set, it'll automatically be set to the current time.\n */\n capture(\n event_name: string,\n properties?: Properties | null,\n options: CaptureOptions = __NOOPTIONS\n ): CaptureResult | void {\n // While developing, a developer might purposefully _not_ call init(),\n // in this case, we would like capture to be a noop.\n if (!this.__loaded || !this.sessionPersistence || !this._requestQueue) {\n return logger.unintializedWarning('posthog.capture')\n }\n\n if (userOptedOut(this, false)) {\n return\n }\n\n options = options || __NOOPTIONS\n const transport = options['transport'] // external API, don't minify 'transport' prop\n if (transport) {\n options.transport = transport // 'transport' prop name can be minified internally\n }\n\n // typing doesn't prevent interesting data\n if (_isUndefined(event_name) || typeof event_name !== 'string') {\n console.error('No event name provided to posthog.capture')\n return\n }\n\n if (_isBlockedUA(userAgent, this.get_config('custom_blocked_useragents'))) {\n return\n }\n\n // update persistence\n this.sessionPersistence.update_search_keyword()\n\n if (this.get_config('store_google')) {\n this.sessionPersistence.update_campaign_params()\n }\n if (this.get_config('save_referrer')) {\n this.sessionPersistence.update_referrer_info()\n }\n\n let data: CaptureResult = {\n uuid: uuidv7(),\n event: event_name,\n properties: this._calculate_event_properties(event_name, properties || {}),\n }\n\n if (event_name === '$identify') {\n data['$set'] = options['$set']\n data['$set_once'] = options['$set_once']\n }\n\n data = _copyAndTruncateStrings(\n data,\n options._noTruncate ? null : this.get_config('properties_string_max_length')\n )\n data.timestamp = options.timestamp || new Date()\n\n if (this.get_config('debug')) {\n logger.log('PostHog.js send', data)\n }\n const jsonData = JSON.stringify(data)\n\n const url = this.get_config('api_host') + (options.endpoint || '/e/')\n\n const has_unique_traits = options !== __NOOPTIONS\n\n if (\n this.get_config('request_batching') &&\n (!has_unique_traits || options._batchKey) &&\n !options.send_instantly\n ) {\n this._requestQueue.enqueue(url, data, options)\n } else {\n this.__compress_and_send_json_request(url, jsonData, options)\n }\n\n this._invokeCaptureHooks(event_name, data)\n\n return data\n }\n\n _addCaptureHook(callback: (eventName: string) => void): void {\n this.__captureHooks.push(callback)\n }\n\n _invokeCaptureHooks(eventName: string, eventData: CaptureResult): void {\n this.config._onCapture(eventName, eventData)\n _each(this.__captureHooks, (callback) => callback(eventName))\n }\n\n _calculate_event_properties(event_name: string, event_properties: Properties): Properties {\n if (!this.persistence || !this.sessionPersistence) {\n return event_properties\n }\n\n // set defaults\n const start_timestamp = this.persistence.remove_event_timer(event_name)\n let properties = { ...event_properties }\n properties['token'] = this.get_config('token')\n\n if (event_name === '$snapshot') {\n const persistenceProps = { ...this.persistence.properties(), ...this.sessionPersistence.properties() }\n properties['distinct_id'] = persistenceProps.distinct_id\n return properties\n }\n\n const infoProperties = _info.properties()\n\n if (this.sessionManager) {\n const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId()\n properties['$session_id'] = sessionId\n properties['$window_id'] = windowId\n }\n\n if (this.get_config('__preview_measure_pageview_stats')) {\n let performanceProperties: Record<string, any> = {}\n if (event_name === '$pageview') {\n performanceProperties = this.pageViewManager.doPageView()\n } else if (event_name === '$pageleave') {\n performanceProperties = this.pageViewManager.doPageLeave()\n }\n properties = _extend(properties, performanceProperties)\n }\n\n if (event_name === '$pageview') {\n properties['title'] = document.title\n }\n\n if (event_name === '$performance_event') {\n const persistenceProps = this.persistence.properties()\n // Early exit for $performance_event as we only need session and $current_url\n properties['distinct_id'] = persistenceProps.distinct_id\n properties['$current_url'] = infoProperties.$current_url\n return properties\n }\n\n // set $duration if time_event was previously called for this event\n if (typeof start_timestamp !== 'undefined') {\n const duration_in_ms = new Date().getTime() - start_timestamp\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n }\n\n // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n\n // update properties with pageview info and super-properties\n properties = _extend(\n {},\n _info.properties(),\n this.persistence.properties(),\n this.sessionPersistence.properties(),\n properties\n )\n\n const property_blacklist = this.get_config('property_blacklist')\n if (_isArray(property_blacklist)) {\n _each(property_blacklist, function (blacklisted_prop) {\n delete properties[blacklisted_prop]\n })\n } else {\n console.error('Invalid value for property_blacklist config: ' + property_blacklist)\n }\n\n const sanitize_properties = this.get_config('sanitize_properties')\n if (sanitize_properties) {\n properties = sanitize_properties(properties, event_name)\n }\n\n return properties\n }\n\n /**\n * Register a set of super properties, which are included with all\n * events. This will overwrite previous super property values, except\n * for session properties (see `register_for_session(properties)`).\n *\n * ### Usage:\n *\n * // register 'Gender' as a super property\n * posthog.register({'Gender': 'Female'});\n *\n * // register several super properties when a user signs up\n * posthog.register({\n * 'Email': 'jdoe@example.com',\n * 'Account Type': 'Free'\n * });\n *\n * // Display the properties\n * console.log(posthog.persistence.properties())\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n register(properties: Properties, days?: number): void {\n this.persistence?.register(properties, days)\n }\n\n /**\n * Register a set of super properties only once. These will not\n * overwrite previous super property values, unlike register().\n *\n * ### Usage:\n *\n * // register a super property for the first time only\n * posthog.register_once({\n * 'First Login Date': new Date().toISOString()\n * });\n *\n * // Display the properties\n * console.log(posthog.persistence.properties())\n *\n * ### Notes:\n *\n * If default_value is specified, current super properties\n * with that value will be overwritten.\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n register_once(properties: Properties, default_value?: Property, days?: number): void {\n this.persistence?.register_once(properties, default_value, days)\n }\n\n /**\n * Register a set of super properties, which are included with all events, but only\n * for THIS SESSION. These will overwrite all other super property values.\n *\n * Unlike regular super properties, which last in LocalStorage for a long time,\n * session super properties get cleared after a session ends.\n *\n * ### Usage:\n *\n * // register on all events this session\n * posthog.register_for_session({'referer': customGetReferer()});\n *\n * // register several session super properties when a user signs up\n * posthog.register_for_session({\n * 'selectedPlan': 'pro',\n * 'completedSteps': 4,\n * });\n *\n * // Display the properties\n * console.log(posthog.sessionPersistence.properties())\n *\n * @param {Object} properties An associative array of properties to store about the user\n */\n register_for_session(properties: Properties): void {\n this.sessionPersistence?.register(properties)\n }\n\n /**\n * Delete a super property stored with the current user.\n *\n * @param {String} property The name of the super property to remove\n */\n unregister(property: string): void {\n this.persistence?.unregister(property)\n }\n\n /**\n * Delete a session super property stored with the current user.\n *\n * @param {String} property The name of the session super property to remove\n */\n unregister_for_session(property: string): void {\n this.sessionPersistence?.unregister(property)\n }\n\n _register_single(prop: string, value: Property) {\n this.register({ [prop]: value })\n }\n\n /*\n * Get feature flag value for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options?: { send_event?: boolean }): boolean | string | undefined {\n return this.featureFlags.getFeatureFlag(key, options)\n }\n\n /*\n * Get feature flag payload value matching key for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') {\n * const someValue = posthog.getFeatureFlagPayload('beta-feature')\n * // do something\n * }\n *\n * @param {Object|String} prop Key of the feature flag.\n */\n getFeatureFlagPayload(key: string): JsonType {\n const payload = this.featureFlags.getFeatureFlagPayload(key)\n try {\n return JSON.parse(payload as any)\n } catch {\n return payload\n }\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options?: isFeatureEnabledOptions): boolean | undefined {\n return this.featureFlags.isFeatureEnabled(key, options)\n }\n\n reloadFeatureFlags(): void {\n this.featureFlags.reloadFeatureFlags()\n }\n\n /** Opt the user in or out of an early access feature. */\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n this.featureFlags.updateEarlyAccessFeatureEnrollment(key, isEnrolled)\n }\n\n /** Get the list of early access features. To check enrollment status, use `isFeatureEnabled`. */\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n return this.featureFlags.getEarlyAccessFeatures(callback, force_reload)\n }\n\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: (flags: string[], variants: Record<string, string | boolean>) => void): () => void {\n return this.featureFlags.onFeatureFlags(callback)\n }\n\n /*\n * Register an event listener that runs whenever the session id or window id change.\n * If there is already a session id, the listener is called immediately in addition to being called on future changes.\n *\n * Can be used, for example, to sync the PostHog session id with a backend session.\n *\n * ### Usage:\n *\n * posthog.onSessionId(function(sessionId, windowId) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once a session id is present or when it or the window id are updated.\n * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by useEffect when the component unmounts.\n */\n onSessionId(callback: SessionIdChangedCallback): () => void {\n return this.sessionManager?.onSessionId(callback) ?? (() => {})\n }\n\n /** Get list of all surveys. */\n getSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getSurveys(callback, forceReload)\n }\n\n /** Get surveys that should be enabled for the current user. */\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys.getActiveMatchingSurveys(callback, forceReload)\n }\n\n /**\n * Identify a user with a unique ID instead of a PostHog\n * randomly generated distinct_id. If the method is never called,\n * then unique visitors will be identified by a UUID that is generated\n * the first time they visit the site.\n *\n * If user properties are passed, they are also sent to posthog.\n *\n * ### Usage:\n *\n * posthog.identify('[user unique id]')\n * posthog.identify('[user unique id]', { email: 'john@example.com' })\n * posthog.identify('[user unique id]', {}, { referral_code: '12345' })\n *\n * ### Notes:\n *\n * You can call this function to overwrite a previously set\n * unique ID for the current user.\n *\n * If the user has been identified ($user_state in persistence is set to 'identified'),\n * then capture of $identify is skipped to avoid merging users. For example,\n * if your system allows an admin user to impersonate another user.\n *\n * Then a single browser instance can have:\n *\n * `identify('a') -> capture(1) -> identify('b') -> capture(2)`\n *\n * and capture 1 and capture 2 will have the correct distinct_id.\n * but users a and b will NOT be merged in posthog.\n *\n * However, if reset is called then:\n *\n * `identify('a') -> capture(1) -> reset() -> capture(2) -> identify('b') -> capture(3)`\n *\n * users a and b are not merged.\n * Capture 1 is associated with user a.\n * A new distinct id is generated for capture 2.\n * which is merged with user b.\n * So, capture 2 and 3 are associated with user b.\n *\n * If you want to merge two identified users, you can call posthog.alias\n *\n * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!this.__loaded || !this.persistence) {\n return logger.unintializedWarning('posthog.identify')\n }\n //if the new_distinct_id has not been set ignore the identify event\n if (!new_distinct_id) {\n console.error('Unique user id has not been set in posthog.identify')\n return\n }\n\n const previous_distinct_id = this.get_distinct_id()\n this.register({ $user_id: new_distinct_id })\n\n if (!this.get_property('$device_id')) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n const device_id = previous_distinct_id\n this.register_once(\n {\n $had_persisted_distinct_id: true,\n $device_id: device_id,\n },\n ''\n )\n }\n\n // if the previous distinct id had an alias stored, then we clear it\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY)\n this.register({ distinct_id: new_distinct_id })\n }\n\n const isKnownAnonymous = this.persistence.get_user_state() === 'anonymous'\n\n // send an $identify event any time the distinct_id is changing and the old ID is an anoymous ID\n // - logic on the server will determine whether or not to do anything with it.\n if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n this.persistence.set_user_state('identified')\n\n // Update current user properties\n this.setPersonPropertiesForFlags(userPropertiesToSet || {}, false)\n\n this.capture(\n '$identify',\n {\n distinct_id: new_distinct_id,\n $anon_distinct_id: previous_distinct_id,\n },\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n )\n // let the reload feature flag request know to send this previous distinct id\n // for flag consistency\n this.featureFlags.setAnonymousDistinctId(previous_distinct_id)\n } else if (userPropertiesToSet || userPropertiesToSetOnce) {\n // If the distinct_id is not changing, but we have user properties to set, we can go for a $set event\n this.setPersonProperties(userPropertiesToSet, userPropertiesToSetOnce)\n }\n\n // Reload active feature flags if the user identity changes.\n // Note we don't reload this on property changes as these get processed async\n if (new_distinct_id !== previous_distinct_id) {\n this.reloadFeatureFlags()\n // also clear any stored flag calls\n this.unregister(FLAG_CALL_REPORTED)\n }\n }\n\n /**\n * Sets properties for the Person associated with the current distinct_id.\n *\n *\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n setPersonProperties(userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!userPropertiesToSet && !userPropertiesToSetOnce) {\n return\n }\n\n // Update current user properties\n this.setPersonPropertiesForFlags(userPropertiesToSet || {})\n\n this.capture('$set', { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} })\n }\n\n /**\n * Alpha feature: don't use unless you know what you're doing!\n *\n * Sets group analytics information for subsequent events and reloads feature flags.\n *\n * @param {String} groupType Group type (example: 'organization')\n * @param {String} groupKey Group key (example: 'org::5')\n * @param {Object} groupPropertiesToSet Optional properties to set for group\n */\n group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n if (!groupType || !groupKey) {\n console.error('posthog.group requires a group type and group key')\n return\n }\n\n const existingGroups = this.getGroups()\n\n // if group key changes, remove stored group properties\n if (existingGroups[groupType] !== groupKey) {\n this.resetGroupPropertiesForFlags(groupType)\n }\n\n this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n if (groupPropertiesToSet) {\n this.capture('$groupidentify', {\n $group_type: groupType,\n $group_key: groupKey,\n $group_set: groupPropertiesToSet,\n })\n this.setGroupPropertiesForFlags({ [groupType]: groupPropertiesToSet })\n }\n\n // If groups change and no properties change, reload feature flags.\n // The property change reload case is handled in setGroupPropertiesForFlags.\n if (existingGroups[groupType] !== groupKey && !groupPropertiesToSet) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Resets only the group properties of the user currently logged in.\n */\n resetGroups(): void {\n this.register({ $groups: {} })\n this.resetGroupPropertiesForFlags()\n\n // If groups changed, reload feature flags.\n this.reloadFeatureFlags()\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n this.featureFlags.setPersonPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n resetPersonPropertiesForFlags(): void {\n this.featureFlags.resetPersonPropertiesForFlags()\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n this.featureFlags.setGroupPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n this.featureFlags.resetGroupPropertiesForFlags(group_type)\n }\n\n /**\n * Clears super properties and generates a new random distinct_id for this instance.\n * Useful for clearing data when a user logs out.\n */\n reset(reset_device_id?: boolean): void {\n if (!this.__loaded) {\n return logger.unintializedWarning('posthog.reset')\n }\n const device_id = this.get_property('$device_id')\n this.persistence?.clear()\n this.sessionPersistence?.clear()\n this.persistence?.set_user_state('anonymous')\n this.sessionManager?.resetSessionId()\n const uuid = this.get_config('get_device_id')(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: reset_device_id ? uuid : device_id,\n },\n ''\n )\n }\n\n /**\n * Returns the current distinct id of the user. This is either the id automatically\n * generated by the library or the id that has been passed by a call to identify().\n *\n * ### Notes:\n *\n * get_distinct_id() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // set distinct_id after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * distinct_id = posthog.get_distinct_id();\n * }\n * });\n */\n get_distinct_id(): string {\n return this.get_property('distinct_id')\n }\n\n getGroups(): Record<string, any> {\n return this.get_property('$groups') || {}\n }\n\n /**\n * Returns the current session_id.\n *\n * NOTE: This should only be used for informative purposes.\n * Any actual internal use case for the session_id should be handled by the sessionManager.\n */\n\n get_session_id(): string {\n return this.sessionManager?.checkAndGetSessionAndWindowId(true).sessionId ?? ''\n }\n\n /**\n * Returns the Replay url for the current session.\n *\n * @param options Options for the url\n * @param options.withTimestamp Whether to include the timestamp in the url (defaults to false)\n * @param options.timestampLookBack How many seconds to look back for the timestamp (defaults to 10)\n */\n get_session_replay_url(options?: { withTimestamp?: boolean; timestampLookBack?: number }): string {\n if (!this.sessionManager) {\n return ''\n }\n const host = this.config.ui_host || this.config.api_host\n const { sessionId, sessionStartTimestamp } = this.sessionManager.checkAndGetSessionAndWindowId(true)\n let url = host + '/replay/' + sessionId\n if (options?.withTimestamp && sessionStartTimestamp) {\n const LOOK_BACK = options.timestampLookBack ?? 10\n if (!sessionStartTimestamp) {\n return url\n }\n const recordingStartTime = Math.max(\n Math.floor((new Date().getTime() - sessionStartTimestamp) / 1000) - LOOK_BACK,\n 0\n )\n url += `?t=${recordingStartTime}`\n }\n\n return url\n }\n\n /**\n * Create an alias, which PostHog will use to link two distinct_ids going forward (not retroactively).\n * Multiple aliases can map to the same original ID, but not vice-versa. Aliases can also be chained - the\n * following is a valid scenario:\n *\n * posthog.alias('new_id', 'existing_id');\n * ...\n * posthog.alias('newer_id', 'new_id');\n *\n * If the original ID is not passed in, we will use the current distinct_id - probably the auto-generated GUID.\n *\n * ### Notes:\n *\n * The best practice is to call alias() when a unique ID is first created for a user\n * (e.g., when a user first registers for an account and provides an email address).\n * alias() should never be called more than once for a given user, except to\n * chain a newer ID to a previously new ID, as described above.\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n */\n alias(alias: string, original?: string): CaptureResult | void | number {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n logger.critical('Attempting to create alias for existing People user - aborting.')\n return -2\n }\n\n if (_isUndefined(original)) {\n original = this.get_distinct_id()\n }\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias)\n return this.capture('$create_alias', { alias: alias, distinct_id: original })\n } else {\n console.error('alias matches current distinct_id - skipping api call.')\n this.identify(alias)\n return -1\n }\n }\n\n /**\n * Update the configuration of a posthog library instance.\n *\n * The default config is:\n *\n * {\n * // PostHog API host\n * api_host: 'https://app.posthog.com',\n *\n * // HTTP method for capturing requests\n * api_method: 'POST'\n *\n * // PostHog web app host, currently only used by the Sentry integration.\n * // This will only be different from api_host when using a reverse-proxied API host – in that case\n * // the original web app host needs to be passed here so that links to the web app are still convenient.\n * ui_host: 'https://app.posthog.com',\n *\n * // Automatically capture clicks, form submissions and change events\n * autocapture: true\n *\n * // Capture rage clicks\n * rageclick: true\n *\n * // transport for sending requests ('XHR' or 'sendBeacon')\n * // NB: sendBeacon should only be used for scenarios such as\n * // page unload where a \"best-effort\" attempt to send is\n * // acceptable; the sendBeacon API does not support callbacks\n * // or any way to know the result of the request. PostHog\n * // capturing via sendBeacon will not support any event-\n * // batching or retry mechanisms.\n * api_transport: 'XHR'\n *\n * // super properties cookie expiration (in days)\n * cookie_expiration: 365\n *\n * // super properties span subdomains\n * cross_subdomain_cookie: true\n *\n * // debug mode\n * debug: false\n *\n * // if this is true, the posthog cookie or localStorage entry\n * // will be deleted, and no user persistence will take place\n * disable_persistence: false\n *\n * // if this is true, PostHog will automatically determine\n * // City, Region and Country data using the IP address of\n * //the client\n * ip: true\n *\n * // opt users out of capturing by this PostHog instance by default\n * opt_out_capturing_by_default: false\n *\n * // opt users out of browser data storage by this PostHog instance by default\n * opt_out_persistence_by_default: false\n *\n * // persistence mechanism used by opt-in/opt-out methods - cookie\n * // or localStorage - falls back to cookie if localStorage is unavailable\n * opt_out_capturing_persistence_type: 'localStorage'\n *\n * // customize the name of cookie/localStorage set by opt-in/opt-out methods\n * opt_out_capturing_cookie_prefix: null\n *\n * // type of persistent store for super properties (cookie/\n * // localStorage) if set to 'localStorage', any existing\n * // posthog cookie value with the same persistence_name\n * // will be transferred to localStorage and deleted\n * persistence: 'cookie'\n *\n * // name for super properties persistent store\n * persistence_name: ''\n *\n * // names of properties/superproperties which should never\n * // be sent with capture() calls\n * property_blacklist: []\n *\n * // if this is true, posthog cookies will be marked as\n * // secure, meaning they will only be transmitted over https\n * secure_cookie: false\n *\n * // should we capture a page view on page load\n * capture_pageview: true\n *\n * // if you set upgrade to be true, the library will check for\n * // a cookie from our old js library and import super\n * // properties from it, then the old cookie is deleted\n * // The upgrade config option only works in the initialization,\n * // so make sure you set it when you create the library.\n * upgrade: false\n *\n * // if this is true, session recording is always disabled.\n * disable_session_recording: false,\n *\n * // extra HTTP request headers to set for each API request, in\n * // the format {'Header-Name': value}\n * xhr_headers: {}\n *\n * // protocol for fetching in-app message resources, e.g.\n * // 'https://' or 'http://'; defaults to '//' (which defers to the\n * // current page's protocol)\n * inapp_protocol: '//'\n *\n * // whether to open in-app message link in new tab/window\n * inapp_link_new_window: false\n *\n * // a set of rrweb config options that PostHog users can configure\n * // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n * session_recording: {\n * blockClass: 'ph-no-capture',\n * blockSelector: null,\n * ignoreClass: 'ph-ignore-input',\n * maskAllInputs: true,\n * maskInputOptions: {},\n * maskInputFn: null,\n * slimDOMOptions: {},\n * collectFonts: false\n * }\n *\n * // prevent autocapture from capturing any attribute names on elements\n * mask_all_element_attributes: false\n *\n * // prevent autocapture from capturing textContent on all elements\n * mask_all_text: false\n *\n * // Anonymous users get a random UUID as their device by default.\n * // This option allows overriding that option.\n * get_device_id: (uuid) => uuid\n * }\n *\n *\n * @param {Object} config A dictionary of new configuration values to update\n */\n\n set_config(config: Partial<PostHogConfig>): void {\n const oldConfig = { ...this.config }\n if (_isObject(config)) {\n _extend(this.config, config)\n\n if (!this.get_config('persistence_name')) {\n this.config.persistence_name = this.config.cookie_name\n }\n if (!this.get_config('disable_persistence')) {\n this.config.disable_persistence = this.config.disable_cookie\n }\n\n this.persistence?.update_config(this.config)\n this.sessionPersistence?.update_config(this.config)\n\n if (localStore.is_supported() && localStore.get('ph_debug') === 'true') {\n this.config.debug = true\n }\n if (this.get_config('debug')) {\n Config.DEBUG = true\n }\n\n if (this.sessionRecording && typeof config.disable_session_recording !== 'undefined') {\n if (oldConfig.disable_session_recording !== config.disable_session_recording) {\n if (config.disable_session_recording) {\n this.sessionRecording.stopRecording()\n } else {\n this.sessionRecording.startRecordingIfEnabled()\n }\n }\n }\n }\n }\n\n /**\n * turns session recording on, and updates the config option\n * disable_session_recording to false\n */\n startSessionRecording(): void {\n this.set_config({ disable_session_recording: false })\n }\n\n /**\n * turns session recording off, and updates the config option\n * disable_session_recording to true\n */\n stopSessionRecording(): void {\n this.set_config({ disable_session_recording: true })\n }\n\n /**\n * returns a boolean indicating whether session recording\n * is currently running\n */\n sessionRecordingStarted(): boolean {\n return !!this.sessionRecording?.started()\n }\n\n /**\n * returns a boolean indicating whether the toolbar loaded\n * @param toolbarParams\n */\n\n loadToolbar(params: ToolbarParams): boolean {\n return this.toolbar.loadToolbar(params)\n }\n\n /**\n * returns the current config object for the library.\n */\n get_config<K extends keyof PostHogConfig>(prop_name: K): PostHogConfig[K] {\n return this.config?.[prop_name]\n }\n\n /**\n * Returns the value of the super property named property_name. If no such\n * property is set, get_property() will return the undefined value.\n *\n * ### Notes:\n *\n * get_property() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for '$user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.get_property('$user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the super property you want to retrieve\n */\n get_property(property_name: string): Property | undefined {\n return this.persistence?.['props'][property_name]\n }\n\n /**\n * Returns the value of the session super property named property_name. If no such\n * property is set, getSessionProperty() will return the undefined value.\n *\n * ### Notes:\n *\n * This is based on browser-level `sessionStorage`, NOT the PostHog session.\n * getSessionProperty() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for 'user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.getSessionProperty('user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the session super property you want to retrieve\n */\n getSessionProperty(property_name: string): Property | undefined {\n return this.sessionPersistence?.['props'][property_name]\n }\n\n toString(): string {\n let name = this.get_config('name') ?? PRIMARY_INSTANCE_NAME\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name\n }\n return name\n }\n\n // perform some housekeeping around GDPR opt-in/out state\n _gdpr_init(): void {\n const is_localStorage_requested = this.get_config('opt_out_capturing_persistence_type') === 'localStorage'\n\n // try to convert opt-in/out cookies to localStorage if possible\n if (is_localStorage_requested && localStore.is_supported()) {\n if (!this.has_opted_in_capturing() && this.has_opted_in_capturing({ persistence_type: 'cookie' })) {\n this.opt_in_capturing({ enable_persistence: false })\n }\n if (!this.has_opted_out_capturing() && this.has_opted_out_capturing({ persistence_type: 'cookie' })) {\n this.opt_out_capturing({ clear_persistence: false })\n }\n this.clear_opt_in_out_capturing({\n persistence_type: 'cookie',\n enable_persistence: false,\n })\n }\n\n // check whether the user has already opted out - if so, clear & disable persistence\n if (this.has_opted_out_capturing()) {\n this._gdpr_update_persistence({ clear_persistence: true })\n\n // check whether we should opt out by default\n // note: we don't clear persistence here by default since opt-out default state is often\n // used as an initial state while GDPR information is being collected\n } else if (\n !this.has_opted_in_capturing() &&\n (this.get_config('opt_out_capturing_by_default') || cookieStore.get('ph_optout'))\n ) {\n cookieStore.remove('ph_optout')\n this.opt_out_capturing({\n clear_persistence: this.get_config('opt_out_persistence_by_default'),\n })\n }\n }\n\n /**\n * Enable or disable persistence based on options\n * only enable/disable if persistence is not already in this state\n * @param {boolean} [options.clear_persistence] If true, will delete all data stored by the sdk in persistence and disable it\n * @param {boolean} [options.enable_persistence] If true, will re-enable sdk persistence\n */\n _gdpr_update_persistence(options: Partial<OptInOutCapturingOptions>): void {\n let disabled\n if (options && options['clear_persistence']) {\n disabled = true\n } else if (options && options['enable_persistence']) {\n disabled = false\n } else {\n return\n }\n\n if (!this.get_config('disable_persistence') && this.persistence?.disabled !== disabled) {\n this.persistence?.set_disabled(disabled)\n }\n if (!this.get_config('disable_persistence') && this.sessionPersistence?.disabled !== disabled) {\n this.sessionPersistence?.set_disabled(disabled)\n }\n }\n\n // call a base gdpr function after constructing the appropriate token and options args\n _gdpr_call_func<R = any>(\n func: (token: string, options: GDPROptions) => R,\n options?: Partial<OptInOutCapturingOptions>\n ): R {\n options = _extend(\n {\n capture: this.capture.bind(this),\n persistence_type: this.get_config('opt_out_capturing_persistence_type'),\n cookie_prefix: this.get_config('opt_out_capturing_cookie_prefix'),\n cookie_expiration: this.get_config('cookie_expiration'),\n cross_subdomain_cookie: this.get_config('cross_subdomain_cookie'),\n secure_cookie: this.get_config('secure_cookie'),\n },\n options || {}\n )\n\n // check if localStorage can be used for recording opt out status, fall back to cookie if not\n if (!localStore.is_supported() && options['persistence_type'] === 'localStorage') {\n options['persistence_type'] = 'cookie'\n }\n\n return func(this.get_config('token'), {\n capture: options['capture'],\n captureEventName: options['capture_event_name'],\n captureProperties: options['capture_properties'],\n persistenceType: options['persistence_type'],\n persistencePrefix: options['cookie_prefix'],\n cookieExpiration: options['cookie_expiration'],\n crossSubdomainCookie: options['cross_subdomain_cookie'],\n secureCookie: options['secure_cookie'],\n })\n }\n\n /**\n * Opt the user in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user in\n * posthog.opt_in_capturing();\n *\n * // opt user in with specific event name, properties, cookie configuration\n * posthog.opt_in_capturing({\n * capture_event_name: 'User opted in',\n * capture_event_properties: {\n * 'Email': 'jdoe@example.com'\n * },\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {function} [options.capture] Function used for capturing a PostHog event to record the opt-in action (default is this PostHog instance's capture method)\n * @param {string} [options.capture_event_name=$opt_in] Event name to be used for capturing the opt-in action\n * @param {Object} [options.capture_properties] Set of properties to be captured along with the opt-in action\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_in_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n options = _extend(\n {\n enable_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optIn, options)\n this._gdpr_update_persistence(options)\n }\n\n /**\n * Opt the user out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user out\n * posthog.opt_out_capturing();\n *\n * // opt user out with different cookie configuration from PostHog instance\n * posthog.opt_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.clear_persistence=true] If true, will delete all data stored by the sdk in persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_out_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n const _options = _extend(\n {\n clear_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n /**\n * Check whether the user has opted in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_in = posthog.has_opted_in_capturing();\n * // use has_opted_in value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-in status\n */\n has_opted_in_capturing(options?: Partial<OptInOutCapturingOptions>): boolean {\n return this._gdpr_call_func(hasOptedIn, options)\n }\n\n /**\n * Check whether the user has opted out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_out = posthog.has_opted_out_capturing();\n * // use has_opted_out value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-out status\n */\n has_opted_out_capturing(options?: Partial<OptInOutCapturingOptions>): boolean {\n return this._gdpr_call_func(hasOptedOut, options)\n }\n\n /**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // clear user's opt-in/out status\n * posthog.clear_opt_in_out_capturing();\n *\n * // clear user's opt-in/out status with specific cookie configuration - should match\n * // configuration used when opt_in_capturing/opt_out_capturing methods were called.\n * posthog.clear_opt_in_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n clear_opt_in_out_capturing(options?: Partial<OptInOutCapturingOptions>): void {\n const _options: Partial<OptInOutCapturingOptions> = _extend(\n {\n enable_persistence: true,\n },\n options ?? {}\n )\n this._gdpr_call_func(clearOptInOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n debug(debug?: boolean): void {\n if (debug === false) {\n window.console.log(\"You've disabled debug mode.\")\n localStorage && localStorage.removeItem('ph_debug')\n this.set_config({ debug: false })\n } else {\n window.console.log(\n \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n )\n localStorage && localStorage.setItem('ph_debug', 'true')\n this.set_config({ debug: true })\n }\n }\n}\n\n_safewrap_class(PostHog, ['identify'])\n\nconst instances: Record<string, PostHog> = {}\nconst extend_mp = function () {\n // add all the sub posthog instances\n _each(instances, function (instance, name) {\n if (name !== PRIMARY_INSTANCE_NAME) {\n posthog_master[name] = instance\n }\n })\n}\n\nconst override_ph_init_func = function () {\n // we override the snippets init function to handle the case where a\n // user initializes the posthog library after the script loads & runs\n posthog_master['init'] = function (token?: string, config?: Partial<PostHogConfig>, name?: string) {\n if (name) {\n // initialize a sub library\n if (!posthog_master[name]) {\n posthog_master[name] = instances[name] = create_phlib(\n token || '',\n config || {},\n name,\n (instance: PostHog) => {\n posthog_master[name] = instances[name] = instance\n instance._loaded()\n }\n )\n }\n return posthog_master[name]\n } else {\n let instance: PostHog = posthog_master as any as PostHog\n\n if (instances[PRIMARY_INSTANCE_NAME]) {\n // main posthog lib already initialized\n instance = instances[PRIMARY_INSTANCE_NAME]\n } else if (token) {\n // intialize the main posthog lib\n instance = create_phlib(token, config || {}, PRIMARY_INSTANCE_NAME, (instance: PostHog) => {\n instances[PRIMARY_INSTANCE_NAME] = instance\n instance._loaded()\n })\n instances[PRIMARY_INSTANCE_NAME] = instance\n }\n\n ;(posthog_master as any) = instance\n if (init_type === InitType.INIT_SNIPPET) {\n ;(window as any)[PRIMARY_INSTANCE_NAME] = posthog_master\n }\n extend_mp()\n return instance\n }\n }\n}\n\nconst add_dom_loaded_handler = function () {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if ((dom_loaded_handler as any).done) {\n return\n }\n ;(dom_loaded_handler as any).done = true\n\n ENQUEUE_REQUESTS = false\n\n _each(instances, function (inst: PostHog) {\n inst._dom_loaded()\n })\n }\n\n if (document.addEventListener) {\n if (document.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler()\n } else {\n document.addEventListener('DOMContentLoaded', dom_loaded_handler, false)\n }\n }\n\n // fallback handler, always will work\n _register_event(window, 'load', dom_loaded_handler, true)\n}\n\nexport function init_from_snippet(): void {\n init_type = InitType.INIT_SNIPPET\n if (_isUndefined((window as any).posthog)) {\n ;(window as any).posthog = []\n }\n posthog_master = (window as any).posthog\n\n if (posthog_master['__loaded'] || (posthog_master['config'] && posthog_master['persistence'])) {\n // lib has already been loaded at least once; we don't want to override the global object this time so bomb early\n console.error('PostHog library has already been downloaded at least once.')\n return\n }\n\n // Load instances of the PostHog Library\n _each(posthog_master['_i'], function (item: [token: string, config: Partial<PostHogConfig>, name: string]) {\n if (item && _isArray(item)) {\n instances[item[2]] = create_phlib(...item)\n }\n })\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n\n // Fire loaded events after updating the window's posthog object\n _each(instances, function (instance) {\n instance._loaded()\n })\n\n add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n init_type = InitType.INIT_MODULE\n ;(posthog_master as any) = new PostHog()\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n add_dom_loaded_handler()\n\n return posthog_master as any\n}\n","import { logger } from './utils'\n\nconst oneMinuteInMilliseconds = 60 * 1000\n\ninterface CaptureResponse {\n quota_limited?: string[]\n}\n\nexport class RateLimiter {\n limits: Record<string, number> = {}\n\n public isRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.limits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n public checkForLimiting = (xmlHttpRequest: XMLHttpRequest): void => {\n try {\n const response: CaptureResponse = JSON.parse(xmlHttpRequest.responseText)\n const quotaLimitedProducts = response.quota_limited || []\n quotaLimitedProducts.forEach((batchKey) => {\n logger.log(`[PostHog RateLimiter] ${batchKey || 'events'} is quota limited.`)\n this.limits[batchKey] = new Date().getTime() + oneMinuteInMilliseconds\n })\n } catch (e) {\n logger.error(e)\n return\n }\n }\n}\n","import { gzipSync, strToU8 } from 'fflate'\nimport { _base64Encode } from './utils'\nimport { Compression, CompressionData, XHROptions } from './types'\n\nexport function decideCompression(compressionSupport: Partial<Record<Compression, boolean>>): Compression {\n if (compressionSupport[Compression.GZipJS]) {\n return Compression.GZipJS\n } else {\n return Compression.Base64\n }\n}\n\nexport function compressData(\n compression: Compression,\n jsonData: string,\n options: XHROptions\n): [CompressionData | Uint8Array, XHROptions] {\n if (compression === Compression.GZipJS) {\n // :TRICKY: This returns an UInt8Array. We don't encode this to a string - returning a blob will do this for us.\n return [\n gzipSync(strToU8(jsonData), { mtime: 0 }),\n { ...options, blob: true, urlQueryArgs: { compression: Compression.GZipJS } },\n ]\n } else {\n return [{ data: _base64Encode(jsonData) }, options]\n }\n}\n"],"names":["NodeType","__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","push","error","__spreadArray","to","from","pack","l","Array","slice","concat","isShadowRoot","_a","host","Boolean","shadowRoot","maskInputValue","maskInputOptions","tagName","type","maskInputFn","text","toLowerCase","repeat","ORIGINAL_ATTRIBUTE_NAME","canvasService","canvasCtx","_id","tagNameRegex","RegExp","IGNORED_NODE","getCssRulesString","rules","cssRules","map","getCssRuleString","join","rule","cssStringified","cssText","isCSSImportRule","styleSheet","URL_IN_CSS_REF","RELATIVE_PATH","DATA_URI","absoluteToStylesheet","href","replace","origin","quote1","path1","quote2","path2","path3","url","filePath","maybeQuote","test","indexOf","split","stack","parts","pop","_i","parts_1","part","EventType","IncrementalSource","MouseInteractions","CanvasContext","MediaInteractions","ReplayerEvents","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","absoluteToDoc","doc","attributeValue","trim","a","createElement","getHref","document","transformAttribute","name","pos","collectCharacters","regEx","chars","match","exec","substring","output","descriptorsStr","inParens","c","charAt","getAbsoluteSrcsetString","needMaskingText","node","maskTextClass","maskTextSelector","nodeType","ELEMENT_NODE","classList","contains","eIndex","className","matches","parentNode","TEXT_NODE","serializeNode","options","rootId","sheet","el","blockClass","blockSelector","inlineStylesheet","_b","maskTextFn","_c","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","__sn","docId","id","undefined","DOCUMENT_NODE","compatMode","Document","childNodes","DOCUMENT_TYPE_NODE","DocumentType","publicId","systemId","needBlock","element","_isBlockedElement","HTMLFormElement","processedTagName","getValidTagName","attributes_1","_d","attributes","_e","name_1","stylesheet","styleSheets","find","rel","_cssText","innerText","textContent","checked","selected","__context","canvas","ctx","getContext","x","width","y","height","getImageData","originalGetImageData","Uint32Array","Math","min","data","buffer","some","pixel","is2DCanvasBlank","rr_dataURL","toDataURL","quality","canvasDataURL","blankCanvas","image_1","oldValue_1","crossOrigin","recordInlineImage","naturalWidth","naturalHeight","drawImage","err","console","warn","currentSrc","complete","onload","rr_mediaState","paused","rr_mediaCurrentTime","currentTime","scrollLeft","rr_scrollLeft","scrollTop","rr_scrollTop","_f","getBoundingClientRect","class","rr_width","rr_height","src","contentDocument","rr_src","Element","isSVG","ownerSVGElement","parentTagName","isStyle","isScript","nextSibling","previousSibling","Text","CDATA_SECTION_NODE","CDATA","COMMENT_NODE","Comment","lowerIfExists","maybeAttr","serializeNodeWithId","skipChild","slimDOMOptions","onSerialize","onIframeLoad","_g","iframeLoadTimeout","_h","_j","preserveWhiteSpace","_serializedNode","sn","comment","script","as","endsWith","headFavicon","headMetaDescKeywords","headMetaSocial","property","headMetaRobots","headMetaHttpEquiv","headMetaAuthorship","headMetaVerification","slimDOMExcluded","serializedNode","recordChild","isShadowHost","headWhitespace","bypassOptions","_k","serializedChildNode","isElement","_l","_m","isShadow","iframeEl","listener","win","contentWindow","readyState","fired","blankUrl","location","addEventListener","setTimeout","timer_1","clearTimeout","onceIframeLoaded","iframeDoc","serializedIframeNode","on","fn","target","capture","passive","removeEventListener","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","getId","getNode","removeNodeFromMap","has","reset","throttle","func","wait","timeout","previous","arg","now","Date","leading","remaining","context","args","trailing","hookSetter","key","d","isRevoked","window","original","getOwnPropertyDescriptor","defineProperty","set","_this","patch","source","replacement","original_1","wrapped","defineProperties","__rrweb_original__","enumerable","getWindowHeight","innerHeight","documentElement","clientHeight","body","getWindowWidth","innerWidth","clientWidth","isBlocked","needBlock_1","closest","forEach","isIgnored","isAncestorRemoved","mirror","isTouchEvent","event","changedTouches","isIframeINode","hasShadowRoot","isNodeInLinkedList","Proxy","Reflect","get","prop","receiver","DoubleLinkedList","head","position","Error","current","index","addNode","__ln","removeNode","moveKey","parentId","isINode","MutationBuffer","frozen","locked","texts","removes","mapRemoves","movedMap","addedSet","Set","movedSet","droppedSet","processMutations","mutations","processMutation","emit","e_1","e_2","adds","addList","getNextId","ns","nextId","pushAdd","shadowHost","getRootNode","rootShadowHost","notInDoc","currentN","iframeManager","addIframe","shadowDomManager","addShadowRoot","iframe","childSn","attachIframe","observeAttachShadow","shift","isParentRemoved","e_1_1","return","isAncestorInSet","add","e_2_1","candidate","_node","payload","filter","attribute","mutationCb","e_3","e_4","oldValue","getAttribute","attributeName","item","old","setAttribute","style","styleObj","pname","newValue","getPropertyValue","newPriority","getPropertyPriority","e_3_1","e_4_1","addedNodes","genAdds","removedNodes","nodeId","deepDelete","targetId","delete","childN","init","freeze","canvasManager","unfreeze","isFrozen","lock","unlock","addsSet","MutationBuffer$1","mutationBuffers","isCSSGroupingRuleSupported","CSSGroupingRule","isCSSMediaRuleSupported","CSSMediaRule","isCSSSupportsRuleSupported","CSSSupportsRule","isCSSConditionRuleSupported","CSSConditionRule","getEventTarget","path","composedPath","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","MutationObserver","__rrMutationObserver","angularZoneSymbol","Zone","__symbol__","observer","bind","observe","attributeOldValue","characterData","characterDataOldValue","childList","subtree","initMouseInteractionObserver","mouseInteractionCb","sampling","mouseInteraction","disableMap","handlers","keys","Number","isNaN","eventKey","eventName","handler","clientX","clientY","getHandler","h","initScrollObserver","scrollCb","evt","scrollEl","scrollingElement","scroll","wrapEventWithUserTriggeredFlag","v","enable","userTriggered","INPUT_TAGS","lastInputValueMap","WeakMap","getNestedCSSRulePositions","childRule","parentRule","unshift","parentStyleSheet","recurse","initObservers","hooks","currentWindow","defaultView","mousemoveCb","viewportResizeCb","inputCb","mediaInteractionCb","styleSheetRuleCb","styleDeclarationCb","canvasMutationCb","fontCb","mutation","mousemove","viewportResize","input","mediaInteaction","styleSheetRule","styleDeclaration","canvasMutation","font","mergeHooks","mutationObserver","mousemoveHandler","timeBaseline","threshold","callbackThreshold","mousemoveCallback","positions","wrappedCb","totalOffset","timeOffset","updatePosition","DragEvent","Drag","MouseEvent","MouseMove","TouchMove","initMoveObserver","mouseInteractionHandler","scrollHandler","viewportResizeHandler","lastH","lastW","initViewportResizeObserver","inputHandler","ignoreClass","userTriggeredOnInput","eventHandler","isTrusted","parentElement","isChecked","cbWithDedup","querySelectorAll","lastInputValue","propertyDescriptor","HTMLInputElement","hookProperties","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","initInputObserver","mediaInteractionHandler","volume","muted","media","initMediaInteractionObserver","styleSheetObserver","insertRule","CSSStyleSheet","ownerNode","deleteRule","supportedNestedCSSRuleTypes","unmodifiedFunctions","entries","typeKey","initStyleSheetObserver","styleDeclarationObserver","setProperty","CSSStyleDeclaration","priority","removeProperty","remove","initStyleDeclarationObserver","fontObserver","collectFonts","fontMap","originalFontFace","FontFace","family","descriptors","fontFace","fontSource","JSON","stringify","Uint8Array","restoreHandler","fonts","initFontObserver","pluginHandlers","plugins","plugin","callback","b","disconnect","IframeManager","iframes","addLoadListener","cb","loadListener","isAttachIframe","ShadowDomManager","restorePatches","manager","HTMLElement","ownerDocument","iframeElement","manager_1","restorePatch","lookup","charCodeAt","encode","arraybuffer","bytes","len","base64","webGLVarMap","Map","saveWebGLVar","isInstanceOfWebGLObject","_typeof","list","ctor","contextMap","variableListFor","constructor","serializeArg","Float32Array","Float64Array","Int32Array","Uint16Array","Int16Array","Int8Array","Uint8ClampedArray","rr_type","values","ArrayBuffer","DataView","byteOffset","byteLength","HTMLImageElement","ImageData","serializeArgs","supportedWebGLConstructorNames","patchGLPrototype","props","getOwnPropertyNames","_loop_1","result","recordArgs","hookHandler","setter","props_1","props_1_1","wrappedEmit","takeFullSnapshot","CanvasManager","pendingCanvasMutations","rafStamps","latestId","invokeId","initCanvasMutationObserver","clear","resetObservers","startRAFTimestamping","startPendingCanvasMutationFlusher","canvasContextReset","HTMLCanvasElement","contextType","initCanvasContextObserver","canvas2DReset","props2D","CanvasRenderingContext2D","imgd","pix","props2D_1","props2D_1_1","initCanvas2DMutationObserver","canvasWebGL1and2Reset","WebGLRenderingContext","WebGL","WebGL2RenderingContext","WebGL2","initCanvasWebGLMutationObserver","requestAnimationFrame","flushPendingCanvasMutations","setLatestRAFTimestamp","timestamp","flushPendingCanvasMutationFor","valuesWithType","rest","getOwnPropertySymbols","propertyIsEnumerable","__rest","commands","wrapEvent","child","record","checkoutEveryNms","checkoutEveryNth","maskAllInputs","_maskInputOptions","_slimDOMOptions","packFn","mousemoveWait","lastFullSnapshotEvent","color","date","email","month","number","range","search","tel","time","week","textarea","select","password","NodeList","DOMTokenList","Node","polyfill","incrementalSnapshotCount","isCheckout","FullSnapshot","IncrementalSnapshot","Mutation","buf","eventProcessor","exceedCount","exceedTime","wrappedMutationEmit","wrappedScrollEmit","Scroll","wrappedCanvasMutationEmit","CanvasMutation","Meta","slimDOM","idNodeMap","snapshot","initialOffset","left","pageXOffset","top","pageYOffset","handlers_1","DomContentLoaded","observe_1","MouseInteraction","ViewportResize","Input","MediaInteraction","StyleSheetRule","StyleDeclaration","Font","Plugin","init_1","Load","addCustomEvent","tag","Custom","freezePage","StackFrame","obj","fileName","functionName","lineNumber","columnNumber","toString","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","ErrorStackParser","parse","stacktrace","parseOpera","parseV8OrIE","parseFFOrSafari","extractLocation","urlLike","line","sanitizedLine","tokens","locationParts","functionNameRegex","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","parseFloat","pathToSelector","outerHTML","localName","parent_1","domSiblings","children","sibling","isObject","isObjTooDeep","limit","keys_1","keys_1_1","stringifyOptions","numOfKeysLimit","depthOfLimit","thisPos","splice","Infinity","_obj","shouldIgnore","str","stringLengthLimit","Event","eventResult","eventValue","isArray","nodeName","defaultLogOptions","level","lengthThreshold","logger","initLogObserver","logOptions","loggerType","logCount","cancelHandlers","includes","errorHandler_1","trace","stackFrame","levelType","_logger","win$1","rrweb","rrwebRecord","version","rrwebVersion","rrwebConsoleRecord","getRecordConsolePlugin","Config","DEBUG","LIB_VERSION","ArrayProto","ObjProto","navigator","userAgent","localDomains","nativeForEach","nativeIndexOf","nativeIsArray","breaker","log","_isUndefined","_len","_key","_eachArray","_len2","_args","_key2","critical","_len3","_key3","unintializedWarning","methodName","_trim","thisArg","_each","_extend","_len4","_key5","_isArray","_isFunction","f","_includes","needle","_isObject","_isString","_isNumber","_timestamp","_safewrap","_len5","_key7","_strip_empty_properties","ret","k","LONG_STRINGS_ALLOW_LIST","_copyAndTruncateStrings","object","maxStringLength","customizer","COPY_IN_PROGRESS_SET","internalDeepCircularCopy","it","val","_base64Encode","h1","h2","h3","h4","bits","b64","ac","enc","tmp_arr","_utf8Encode","string","start","end","stringl","utftext","c1","String","fromCharCode","DEFAULT_BLOCKED_UA_STRS","_isBlockedUA","ua","customBlockedUserAgents","blockedUA","_getQueryParam","param","cleanParam","results","decodeURIComponent","_getHashParam","hash","_register_event","fixEvent","preventDefault","stopPropagation","returnValue","cancelBubble","oldSchool","useCapture","ontype","old_handler","new_handler","old_handlers","old_result","new_result","makeHandler","loadScript","scriptUrlToLoad","addScript","scriptTag","onerror","_scripts$0$parentNode","scripts","insertBefore","appendChild","_info","campaignParams","customParams","campaign_keywords","params","kwkey","kw","URL","searchEngine","referrer","searchInfo","keyword","browser","user_agent","vendor","opera","browserVersion","regex","Chrome","Safari","Opera","Firefox","Konqueror","BlackBerry","Mozilla","browserLanguage","language","userLanguage","os","os_name","os_version","device","deviceType","referringDomain","parser","properties","_info$os","$os","$os_version","$browser","$device","$device_type","$current_url","$host","$pathname","pathname","$browser_version","$browser_language","$screen_height","screen","$screen_width","$viewport_height","$viewport_width","$lib","$lib_version","$insert_id","random","$time","people_properties","_info$os2","getClassName","baseVal","getSafeText","elText","shouldCaptureElement","isSensitiveElement","isTextNode","shouldCaptureValue","isElementNode","isTag","isDocumentFragment","autocaptureCompatibleElements","curEl","classes","getDirectAndNestedSpanText","getNestedSpanText","_child$tagName","spanText","RageClick","enabled","_classCallCheck","clicks","lastClick","abs","PEOPLE_DISTINCT_ID_KEY","ALIAS_ID_KEY","EVENT_TIMERS_KEY","AUTOCAPTURE_DISABLED_SERVER_SIDE","SESSION_RECORDING_ENABLED_SERVER_SIDE","CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE","SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE","SESSION_ID","ENABLED_FEATURE_FLAGS","PERSISTENCE_EARLY_ACCESS_FEATURES","STORED_PERSON_PROPERTIES_KEY","STORED_GROUP_PROPERTIES_KEY","SURVEYS","FLAG_CALL_REPORTED","USER_STATE","POSTHOG_QUOTA_LIMITED","PERSISTENCE_RESERVED_PROPERTIES","limitText","autocapture","_initializedTokens","_isDisabledServerSide","_isAutocaptureEnabled","_setIsAutocaptureEnabled","instance","_instance$persistence","disabled_server_side","persistence","enabled_client_side","get_config","_previousElementSibling","previousElementSibling","_el","_getAugmentPropertiesFromElement","elem","attr","propertyKey","propertyValue","_getPropertiesFromElement","maskInputs","maskText","tag_name","nthChild","nthOfType","currentElem","_getDefaultProperties","eventType","$event_type","$ce_version","_extractCustomPropertyValue","customProperty","propValues","matchedElem","_getCustomProperties","targetElementList","_customProperties","eventSelector","eventElement","_getEventTarget","srcElement","_e$target","_captureEvent","_this$rageclicks","_this2","rageclicks","isRageClick","getTime","autocaptureConfig","url_allowlist","allowlist","dom_event_allowlist","element_allowlist","elementType","css_selector_allowlist","selector","parentIsUsefulElement","compStyles","getComputedStyle","shouldCaptureDomEvent","config","elementsJson","autocaptureAugmentProperties","explicitNoCapture","shouldCaptureEl","augmentProperties","$elements","_navigate","_addDomEventHandlers","_this3","_this$config","__autocapture","afterDecideResponse","response","token","register","enabledForProject","numBuckets","numEnabledBuckets","charCodeSum","isBrowserSupported","_bind_instance_methods","_safewrap_instance_methods","PERSISTENCE_ACTIVE_FEATURE_FLAGS","PERSISTENCE_OVERRIDE_FEATURE_FLAGS","PERSISTENCE_FEATURE_FLAG_PAYLOADS","filterActiveFeatureFlags","featureFlags","_step","activeFeatureFlags","_iterator","_createForOfIteratorHelper","ownProps","resArray","_entries","_step$value","_slicedToArray","PostHogFeatureFlags","_override_warning","featureFlagEventHandlers","reloadFeatureFlagsQueued","reloadFeatureFlagsInAction","_createClass","getFlagVariants","enabledFlags","get_property","overriddenFlags","finalFlags","overriddenKeys","_startReloadTimer","anon_distinct_id","$anon_distinct_id","isPaused","_reloadFeatureFlagsRequest","setReloadingPaused","personProperties","groupProperties","encoded_data","distinct_id","get_distinct_id","groups","getGroups","person_properties","group_properties","disable_flags","_send_request","method","_prepare_callback","receivedFeatureFlags","decideEndpointWasHit","getFlags","_this$instance$persis","flagValue","flagReportValue","flagCallReported","send_event","$feature_flag","$feature_flag_response","getFlagPayloads","getFeatureFlag","currentFlags","currentFlagPayloads","flags","flagPayloads","_persistence$register","$enabled_feature_flags","_persistence$register2","newFeatureFlags","newFeatureFlagPayloads","errorsWhileComputingFlags","parseFeatureFlagDecideResponse","_fireFeatureFlagsCallbacks","__loaded","unregister","flagsObj","addFeatureFlagsHandler","_this$_prepareFeature","_prepareFeatureFlagsForCallbacks","flagVariants","removeFeatureFlagsHandler","isEnrolled","_this$instance$persis5","_this$instance$persis6","enrollmentPersonProp","_defineProperty","$feature_enrollment","$set","setPersonPropertiesForFlags","newFlags","_this4","force_reload","existing_early_access_features","_this4$instance$persi","earlyAccessFeatures","flag","variantKey","reduce","res","_this$_prepareFeature2","reloadFeatureFlags","existingProperties","groupType","_objectSpread","group_type","DOMAIN_MATCH_REGEX","cookieStore","is_supported","msg","nameEQ","ca","cookie","days","cross_subdomain","is_secure","cdomain","expires","secure","hostname","domain","setTime","toUTCString","new_cookie_val","encodeURIComponent","_localStorage_supported","localStore","supported","localStorage","getItem","setItem","removeItem","COOKIE_PERSISTED_PROPERTIES","localPlusCookieStore","extend","cookiePersistedProperties","memoryStorage","memoryStore","sessionStorageSupported","sessionStore","sessionStorage","CASE_INSENSITIVE_PERSISTENCE_TYPES","PostHogPersistence","campaign_params_saved","custom_campaign_params","storage_type","storage","user_state","load","update_config","save","found","disabled","entry","expire_days","default_value","default_expiry","hasChanges","$referrer","$referring_domain","set_disabled","set_cross_subdomain","set_secure","event_name","timers","state","replacementImageURI","FULL_SNAPSHOT_EVENT_TYPE","META_EVENT_TYPE","INCREMENTAL_SNAPSHOT_EVENT_TYPE","PLUGIN_EVENT_TYPE","MUTATION_SOURCE_TYPE","MAX_MESSAGE_SIZE","CONSOLE_LOG_PLUGIN_NAME","MutationRateLimiter","_this$options$refillR","_this$options$bucketS","mutationBuckets","refillRate","bucketSize","closestSVG","_data$removes$length","_data$removes","_data$attributes$leng","_data$attributes","_data$texts$length","_data$texts","_data$adds$length","_data$adds","initialMutationCount","numberOfChanges","_this$mutationBuckets","_this$options$onBlock","_this$options","_this$getNodeOrReleva2","getNodeOrRelevantParent","max","loggedTracker","onBlockedNode","mutationCount","setInterval","refillBuckets","BASE_ENDPOINT","ACTIVE_SOURCES","SessionRecording","captureStarted","snapshots","endpoint","stopRrweb","windowId","sessionId","receivedDecide","_flushBuffer","sessionManager","isRecordingEnabled","startCaptureAndTrySendingQueuedSnapshots","stopRecording","enabled_server_side","_this$instance$get_co","recordingVersion_server_side","recorderVersion","_response$sessionReco3","_response$sessionReco5","_response$sessionReco","_response$sessionReco2","_response$sessionReco4","sessionRecording","consoleLogRecordingEnabled","startRecordingIfEnabled","_this$instance$sessio","onRRwebEmit","_captureSnapshotBuffered","_startCapture","getSessionManager","checkAndGetSessionAndWindowId","recorderJS","getRecordingVersion","__loaded_recorder_version","_onScriptLoaded","_event$data","isUserInteraction","_isInteractiveEvent","isIdle","lastActivityTimestamp","_tryTakeFullSnapshot","_this$rrwebRecord","_this$mutationRateLim","sessionRecordingOptions","recordCrossOriginIframes","userSessionRecordingOptions","_Object$entries","_Object$entries$_i","mutationRateLimiter","isConsoleLogCaptureEnabled","_addCaptureHook","_this4$rrwebRecord","rawEvent","throttledEvent","throttleMutations","_ensureMaxMessageSize","stringifiedData","matchAll","toLocaleLowerCase","size","ensureMaxMessageSize","_event","updatedPayload","truncateLargeConsoleLogs","_updateWindowAndSessionIds","$snapshot_bytes","$snapshot_data","$session_id","$window_id","flushBufferTimer","_captureSnapshot","_this$buffer","_this5","additionalBytes","transport","_noTruncate","_batchKey","_metrics","rrweb_full_snapshot","PERFORMANCE_EVENTS_MAPPING","entryType","timeOrigin","startTime","redirectStart","redirectEnd","workerStart","fetchStart","domainLookupStart","domainLookupEnd","connectStart","secureConnectionStart","connectEnd","requestStart","responseStart","responseEnd","decodedBodySize","encodedBodySize","initiatorType","nextHopProtocol","renderBlockingStatus","responseStatus","transferSize","renderTime","loadTime","domComplete","domContentLoadedEvent","domInteractive","loadEventEnd","loadEventStart","redirectCount","navigationType","unloadEventEnd","unloadEventStart","duration","ENTRY_TYPES_TO_OBSERVE","POSTHOG_PATHS_TO_IGNORE","WebPerformanceObserver","isEnabled","startObserving","stopObserving","_window","_window$PerformanceOb","supportedEntryTypes","PerformanceObserver","_forceAllowLocalhost","getEntries","_capturePerformanceEvent","entryTypes","_this$observer","buffered","_ref","remoteEnabled","capturePerformance","networkRequest","maskNetworkRequestFn","eventJson","toJSON","floor","performance","capturePerformanceEvent","exposesServerTiming","serverTiming","_this$capturePerforma","timing","Decide","_hasBootstrappedFeatureFlags","verbose","parseDecideResponse","_this$instance$webPer","_this$instance$except","resetRequestQueue","status","toolbar","webPerformance","exceptionAutocapture","compression","_step2","apiHost","_loop","_step2$value","scriptUrl","_iterator2","POSTHOG_MANAGED_HOSTS","Toolbar","toolbarParams","toolbarVersion","loadToolbar","history","stateHash","replaceState","title","userIntent","timestampToNearestThirtySeconds","toolbarUrl","disableToolbarMetrics","apiURL","instrument","paramsToPersist","_objectWithoutProperties","_excluded","maybeLoadToolbar","GDPR_DEFAULT_PERSISTENCE_PREFIX","optIn","_optInOut","optOut","hasOptedIn","_getStorageValue","hasOptedOut","respectDnt","nav","hasDntOn","dntValue","_hasDoNotTrackFlagOn","clearOptInOut","_getStorage","_getStorageKey","crossSubdomainCookie","persistenceType","persistencePrefix","optValue","cookieExpiration","secureCookie","captureEventName","captureProperties","send_instantly","RequestQueueScaffold","pollInterval","isPolling","_event_queue","_empty_queue_count","_poller","_pollInterval","interval","poll","RequestQueue","_RequestQueueScaffold","_inherits","_super","_createSuper","handlePollRequest","requests","formatQueue","_","dataKey","requestValues","request","u8","u16","u32","fleb","fdeb","clim","freb","eb","j","fl","revfl","revfd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","flm","Compression","fdm","shft","slc","subarray","wbits","wbits16","hTree","t2","sort","i0","i1","i2","maxSym","tr","mbt","ln","dt","lft","cst","i2_1","i2_2","i2_3","lc","cl","cli","cln","cls","w","clen","cf","wfblk","out","dat","wblk","final","syms","lf","df","li","bs","bl","dlt","mlb","ddt","mdb","lclt","nlc","lcdt","ndc","lcfreq","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","clct","dst","deo","et","crct","crc","cr","dopt","opt","pre","post","st","lvl","plvl","lst","msk_1","prev","bs1_1","ceil","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","ml","nl","mmd","md","ti","lin","din","dflt","mem","wbytes","gzh","filename","mtime","gzhl","gzipSync","opts","strToU8","latin1","TextEncoder","ai","addParamsToURL","urlQueryArgs","parameterOptions","halves","argSeparator","formdata","use_val","use_key","arg_separator","tph_arr","_HTTPBuildQuery","encodePostData","blob","Blob","sendBeacon","body_data","xhr","headers","retriesPerformedSoFar","retryQueue","onXHRError","_ref$timeout","onResponse","req","XMLHttpRequest","open","headerValue","headerName","setRequestHeader","withCredentials","onreadystatechange","responseText","enqueue","send","thirtyMinutes","RetryQueue","rateLimiter","queue","areWeOnline","onLine","_handleWeAreNowOnline","requestData","msToNextRetry","rawBackoffTime","pow","minBackoff","cappedBackoffTime","jitter","pickNextRetryDelay","retryAt","flush","toFlush","_ref2","_executeXhrRequest","isRateLimited","_ref3","checkForLimiting","trunc","isInteger","isFinite","DIGITS","UUID","other","compareTo","diff","sign","unixTsMs","randA","randBHi","randBLo","RangeError","V7Generator","DefaultRandom","generateOrAbort","valueAfterReset","ts","resetCounter","counter","fromFieldsV7","nextUint32","getRandomValues","UUIDV7_DENY_WEAK_RNG","crypto","defaultGenerator","cursor","uuidv7","uuidv7obj","generate","MAX_SESSION_IDLE_TIMEOUT","MIN_SESSION_IDLE_TIMEOUT","SESSION_LENGTH_LIMIT","SessionIdManager","_windowId","_sessionId","_sessionStartTimestamp","_sessionActivityTimestamp","persistenceName","desiredTimeout","_sessionTimeoutMs","_window_id_storage_key","_primary_window_exists_storage_key","_canUseSessionStorage","lastWindowId","primaryWindowExists","_listenToReloadWindow","_sessionIdChangedHandlers","sessionActivityTimestamp","sessionStartTimestamp","_setSessionId","readOnly","_this$_getSessionId2","_getSessionId","lastTimestamp","startTimestamp","_getWindowId","sessionPastMaximumLength","valuesChanged","newTimestamp","_setWindowId","SentryIntegration","_posthog","organization","projectId","prefix","setupOnce","addGlobalEventProcessor","_event$exception","_exceptions$","_exceptions$2","_exceptions$3","_exceptions$4","tags","ui_host","api_host","sessionRecordingStarted","get_session_replay_url","withTimestamp","exceptions","exception","$exception_message","$exception_type","$exception_personURL","$sentry_event_id","event_id","$sentry_exception","$sentry_exception_message","$sentry_exception_type","$sentry_tags","createSegmentIntegration","posthog","Promise","resolve","enrichEvent","userId","anonymousId","additionalProperties","_calculate_event_properties","isLoaded","track","page","identify","PageViewManager","_pageViewData$maxScro","_pageViewData$maxScro2","_pageViewData$maxCont","_pageViewData$maxCont2","_pageViewData","_createPageViewData","pageViewData","scrollY","_scrollY","scrollHeight","_scrollHeight","contentY","_contentY","contentHeight","_contentHeight","lastScrollY","maxScrollY","maxScrollHeight","lastContentY","maxContentY","maxContentHeight","_prevPageViewData","prevPageViewData","_hasSeenPageView","_updateScrollData","$prev_pageview_pathname","_calculatePrevPageScrollProperties","$prev_pageview_last_scroll","$prev_pageview_last_scroll_percentage","clamp","$prev_pageview_max_scroll","$prev_pageview_max_scroll_percentage","$prev_pageview_last_content","$prev_pageview_last_content_percentage","$prev_pageview_max_content","$prev_pageview_max_content_percentage","isEvent","isInstanceOf","base","isPrimitive","isBuiltin","isDOMError","WEBPACK_ERROR_REGEXP","STACKTRACE_FRAME_LIMIT","UNKNOWN_FUNCTION","createFrame","lineno","colno","frame","function","in_app","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","winjsRegex","defaultStackParser","parsers","sortedParsers","skipFirst","frames","cleanedLine","localStack","reverse","subMatch","_extractSafariExtensi2","extractSafariExtensionDetails","_extractSafariExtensi4","isSafariExtension","isSafariWebExtension","ERROR_TYPES_PATTERN","reactMinifiedRegexp","parseStackFrames","ex","popSize","framesToPop","getPopSize","errorPropertiesFromError","$exception_stack_trace_raw","extractExceptionKeysForMessage","maxLength","serialized","errorToProperties","errorProperties","isDOMException","domException","isErrorWithStack","errorPropertiesFromString","code","isErrorEvent","isError","isPlainObject","errorPropertiesFromObject","$exception_is_synthetic","$exception_source","$exception_lineno","$exception_colno","SurveyType","SurveyQuestionType","ExceptionObserver","_console","_window$onerror","__POSTHOG_INSTRUMENTED__","originalOnErrorHandler","captureException","originalOnUnhandledRejectionHandler","onunhandledrejection","ev","reason","detail","_oO","$exception_handled","unhandledRejectionToProperties","sendExceptionEvent","stopCapturing","_window$onerror2","_window$onunhandledre","_window$onerror3","_this$remoteEnabled","autocaptureExceptionsResponse","autocaptureExceptions","errors_to_ignore","dropRules","errorsToIgnore","startCapturing","debugLog","propertiesToSend","posthogHost","InitType","init_type","posthog_master","PostHogSurveys","forceReload","existingSurveys","surveys","getSurveys","targetingMatchedSurveys","survey","start_date","end_date","_survey$conditions","_survey$conditions2","conditions","urlCheck","selectorCheck","querySelector","linked_flag_key","targeting_flag_key","linkedFlagCheck","isFeatureEnabled","targetingFlagCheck","oneMinuteInMilliseconds","RateLimiter","xmlHttpRequest","quota_limited","batchKey","limits","retryAfter","__NOOP","__NOOPTIONS","PRIMARY_INSTANCE_NAME","USE_XHR","ENQUEUE_REQUESTS","defaultConfig","_document$location","_document$location$ho","_window$location","api_method","api_transport","rageclick","cross_subdomain_cookie","persistence_name","cookie_name","loaded","store_google","custom_blocked_useragents","save_referrer","capture_pageview","capture_pageleave","debug","cookie_expiration","upgrade","disable_session_recording","disable_persistence","disable_cookie","enable_recording_console_log","secure_cookie","protocol","ip","opt_out_capturing_by_default","opt_out_persistence_by_default","opt_out_capturing_persistence_type","opt_out_capturing_cookie_prefix","opt_in_site_apps","property_blacklist","respect_dnt","sanitize_properties","xhr_headers","inapp_protocol","inapp_link_new_window","request_batching","properties_string_max_length","session_recording","mask_all_element_attributes","mask_all_text","advanced_disable_decide","advanced_disable_feature_flags","advanced_disable_feature_flags_on_first_load","advanced_disable_toolbar_metrics","on_xhr_error","statusText","get_device_id","uuid","_onCapture","capture_performance","callback_fn","bootstrap","disable_compression","session_idle_timeout_seconds","create_phlib","createComplete","callbacksHandled","initComplete","syncCode","handleCallback","callbackName","INIT_MODULE","PostHog","_init","startObservingIfEnabled","pageViewManager","startMeasuringScrollPosition","_execute_array","people","segmentIntegration","__captureHooks","__request_queue","_jsc","setProps","setPersonProperties","set_once","_loaded","_window$rrweb","_config$bootstrap","_triggered_notifs","_window$rrweb2","segmentRegister","updateInitComplete","set_config","_requestQueue","_handle_queued_event","_retryQueue","sessionPersistence","_gdpr_init","segment","user","set_user_state","then","distinctID","_config$bootstrap2","_config$bootstrap3","deviceID","isIdentifiedID","$device_id","_config$bootstrap4","_config$bootstrap7","activeFlags","_config$bootstrap5","_config$bootstrap5$fe","_config$bootstrap6","_config$bootstrap6$fe","featureFlagPayloads","_config$bootstrap8","_config$bootstrap8$fe","_config$bootstrap9","_config$bootstrap9$fe","register_once","self","_handle_unload","disableDecide","_start_queue_if_opted_in","_this$_requestQueue","has_opted_out_capturing","_toConsumableArray","jsc","randomized_cb","callback_string","_this$_requestQueue2","_this$_retryQueue","unload","jsonData","__compress_and_send_json_request","compressData","GZipJS","Base64","_compressData2","_compressData","_options","DEFAULT_OPTIONS","useSendBeacon","_s$parentNode","async","defer","getElementsByTagName","array","fn_name","alias_calls","other_calls","capturing_calls","execute","calls","caller","_this$config$bootstra","_this$config$bootstra2","_this$exceptionAutoca","silenceErrors","optedOut","userOptedOut","update_search_keyword","update_campaign_params","update_referrer_info","has_unique_traits","_invokeCaptureHooks","eventData","event_properties","start_timestamp","remove_event_timer","persistenceProps","infoProperties","_this$sessionManager$","performanceProperties","doPageView","doPageLeave","duration_in_ms","toFixed","blacklisted_prop","_this$persistence","_this$persistence2","_this$sessionPersiste","_this$persistence3","_this$sessionPersiste2","getFeatureFlagPayload","_unused","updateEarlyAccessFeatureEnrollment","getEarlyAccessFeatures","onFeatureFlags","_this$sessionManager$2","_this$sessionManager","onSessionId","getActiveMatchingSurveys","new_distinct_id","userPropertiesToSet","userPropertiesToSetOnce","previous_distinct_id","$user_id","device_id","$had_persisted_distinct_id","isKnownAnonymous","get_user_state","$set_once","setAnonymousDistinctId","groupKey","groupPropertiesToSet","existingGroups","resetGroupPropertiesForFlags","$groups","$group_type","$group_key","$group_set","setGroupPropertiesForFlags","resetPersonPropertiesForFlags","reset_device_id","_this$persistence4","_this$sessionPersiste3","_this$persistence5","_this$sessionManager2","resetSessionId","_this$sessionManager$3","_this$sessionManager3","_this$sessionManager$4","_options$timestampLoo","LOOK_BACK","timestampLookBack","recordingStartTime","alias","_register_single","_this$persistence6","_this$sessionPersiste4","oldConfig","_this$sessionRecordin","started","prop_name","property_name","_this$persistence7","_this$sessionPersiste5","_this$get_config","has_opted_in_capturing","persistence_type","opt_in_capturing","enable_persistence","opt_out_capturing","clear_persistence","clear_opt_in_out_capturing","_gdpr_update_persistence","_this$persistence8","_this$sessionPersiste6","_this$persistence9","_this$sessionPersiste7","cookie_prefix","_gdpr_call_func","klass","functions","_safewrap_class","instances","override_ph_init_func","INIT_SNIPPET","add_dom_loaded_handler","dom_loaded_handler","inst","_dom_loaded"],"mappings":"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"}