@pack/hydrogen 3.3.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +265 -27
- package/dist/index.js +2161 -3643
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/cookie/index.js","../../../node_modules/ua-parser-js/src/ua-parser.js","../../../node_modules/ms/index.js","../../../node_modules/debug/src/common.js","../../../node_modules/debug/src/browser.js","../../../node_modules/curriable/src/utils.ts","../../../node_modules/curriable/src/index.ts","../../../node_modules/hash-it/es/constants.js","../../../node_modules/hash-it/es/utils.js","../../../node_modules/hash-it/es/index.js","../../../node_modules/json-rules-engine/dist/fact.js","../../../node_modules/json-rules-engine/dist/debug.js","../../../node_modules/lodash.isobjectlike/index.js","../../../node_modules/json-rules-engine/dist/condition.js","../../../node_modules/clone/clone.js","../../../node_modules/json-rules-engine/dist/rule-result.js","../../../node_modules/events/events.js","../../../node_modules/json-rules-engine/dist/rule.js","../../../node_modules/json-rules-engine/dist/operator.js","../../../node_modules/json-rules-engine/dist/errors.js","../../../node_modules/fast-bind/bind-loop.js","../../../node_modules/curry2/index.js","../../../node_modules/brackets2dots/index.js","../../../node_modules/dotsplit.js/index.js","../../../node_modules/selectn/index.js","../../../node_modules/json-rules-engine/dist/almanac.js","../../../node_modules/json-rules-engine/dist/engine-facts.js","../../../node_modules/json-rules-engine/dist/engine-default-operators.js","../../../node_modules/json-rules-engine/dist/engine.js","../../../node_modules/json-rules-engine/dist/json-rules-engine.js","../../../node_modules/json-rules-engine/dist/index.js","../src/handle-request.ts","../../packlytics/dist/utils/get-packlytics-id.js","../../../node_modules/intl-parse-accept-language/src/index.ts","../../packlytics/dist/utils/get-headers.js","../../packlytics/dist/utils/get-client-locales.js","../../packlytics/dist/utils/sanatize-payload.js","../../packlytics/dist/utils/send-event.js","../../packlytics/dist/utils/page-hit.js","../../packlytics/dist/utils/get-client-device.js","../../packlytics/dist/packlytics.js","../../packlytics/dist/utils/get-client-location.js","../src/constants.ts","../src/session/cookies-utils.tsx","../src/audiences/visitor-recency.ts","../src/session/usePackCookies.ts","../src/session/session.ts","../src/session/test-session.ts","../src/create-pack-client.ts","../src/tests/test.ts","../src/tests/local-test-resolver.ts","../src/tests/impression.ts","../src/audiences/identity-bundle.ts","../src/audiences/safe-regex.ts","../src/audiences/conditions/cookie.ts","../src/audiences/conditions/builtin.ts","../src/audiences/condition-registry.ts","../src/audiences/audience-resolver.ts","../src/preview/preview-mode.tsx","../src/tests/pack-test-route.ts","../../../node_modules/js-cookie/dist/js.cookie.mjs","../src/tests/pack-test-context.ts","../src/tests/pack-test-provider.tsx","../src/tests/hooks.ts"],"sourcesContent":["/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar __toString = Object.prototype.toString\nvar __hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n * which has been replaced by the token definition in RFC 7230 appendix B.\n *\n * cookie-name = token\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n */\n\nvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n/**\n * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n *\n * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n * ; US-ASCII characters excluding CTLs,\n * ; whitespace DQUOTE, comma, semicolon,\n * ; and backslash\n */\n\nvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n/**\n * RegExp to match domain-value in RFC 6265 sec 4.1.1\n *\n * domain-value = <subdomain>\n * ; defined in [RFC1034], Section 3.5, as\n * ; enhanced by [RFC1123], Section 2.1\n * <subdomain> = <label> | <subdomain> \".\" <label>\n * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n * Labels must be 63 characters or less.\n * 'let-dig' not 'letter' in the first char, per RFC1123\n * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n * <let-dig-hyp> = <let-dig> | \"-\"\n * <let-dig> = <letter> | <digit>\n * <letter> = any one of the 52 alphabetic characters A through Z in\n * upper case and a through z in lower case\n * <digit> = any one of the ten digits 0 through 9\n *\n * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n *\n * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n * character is not permitted, but a trailing %x2E (\".\"), if present, will\n * cause the user agent to ignore the attribute.)\n */\n\nvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n/**\n * RegExp to match path-value in RFC 6265 sec 4.1.1\n *\n * path-value = <any CHAR except CTLs or \";\">\n * CHAR = %x01-7F\n * ; defined in RFC 5234 appendix B.1\n */\n\nvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [opt]\n * @return {object}\n * @public\n */\n\nfunction parse(str, opt) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {};\n var len = str.length;\n // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n if (len < 2) return obj;\n\n var dec = (opt && opt.decode) || decode;\n var index = 0;\n var eqIdx = 0;\n var endIdx = 0;\n\n do {\n eqIdx = str.indexOf('=', index);\n if (eqIdx === -1) break; // No more cookie pairs.\n\n endIdx = str.indexOf(';', index);\n\n if (endIdx === -1) {\n endIdx = len;\n } else if (eqIdx > endIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(';', eqIdx - 1) + 1;\n continue;\n }\n\n var keyStartIdx = startIndex(str, index, eqIdx);\n var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n var key = str.slice(keyStartIdx, keyEndIdx);\n\n // only assign once\n if (!__hasOwnProperty.call(obj, key)) {\n var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n valStartIdx++;\n valEndIdx--;\n }\n\n var val = str.slice(valStartIdx, valEndIdx);\n obj[key] = tryDecode(val, dec);\n }\n\n index = endIdx + 1\n } while (index < len);\n\n return obj;\n}\n\nfunction startIndex(str, index, max) {\n do {\n var code = str.charCodeAt(index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n } while (++index < max);\n return max;\n}\n\nfunction endIndex(str, index, min) {\n while (index > min) {\n var code = str.charCodeAt(--index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n }\n return min;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize a name value pair into a cookie string suitable for\n * http headers. An optional options object specifies cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [opt]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, opt) {\n var enc = (opt && opt.encode) || encodeURIComponent;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!cookieNameRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (!cookieValueRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n if (!opt) return str;\n\n if (null != opt.maxAge) {\n var maxAge = Math.floor(opt.maxAge);\n\n if (!isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + maxAge;\n }\n\n if (opt.domain) {\n if (!domainValueRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!pathValueRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n var expires = opt.expires\n\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + expires.toUTCString()\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.partitioned) {\n str += '; Partitioned'\n }\n\n if (opt.priority) {\n var priority = typeof opt.priority === 'string'\n ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case 'low':\n str += '; Priority=Low'\n break\n case 'medium':\n str += '; Priority=Medium'\n break\n case 'high':\n str += '; Priority=High'\n break\n default:\n throw new TypeError('option priority is invalid')\n }\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * URL-decode string value. Optimized to skip native call when no %.\n *\n * @param {string} str\n * @returns {string}\n */\n\nfunction decode (str) {\n return str.indexOf('%') !== -1\n ? decodeURIComponent(str)\n : str\n}\n\n/**\n * Determine if value is a Date.\n *\n * @param {*} val\n * @private\n */\n\nfunction isDate (val) {\n return __toString.call(val) === '[object Date]';\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.37\n Copyright © 2012-2021 Faisal Salman <f@faisalman.com>\n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.37',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 500;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook',\n CHROMIUM_OS = 'Chromium OS',\n MAC_OS = 'Mac OS';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant|iemobile|slim)\\s?(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(heytap|ovi)browser\\/([\\d\\.]+)/i, // Heytap/Ovi\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 ' + BROWSER]], [\n /(oculus|sailfish|huawei|vivo)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, 'Sogou Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, 'Sogou Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/2345 Browser\n ], [NAME, VERSION], [\n /(lbbrowser)/i, // LieBao Browser\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /(Klarna)\\/([\\w\\.]+)/i, // Klarna Shopping Browser for iOS & Android\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(chromium|instagram|snapchat)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram/Snapchat\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w(\\.|\\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i, // Links\n /panasonic;(viera)/i // Panasonic Viera\n ], [NAME, VERSION], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /master.|lts./, \"\"]]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)(?:\\/|;)/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /oid[^\\)]+; (2\\d{4}(283|rpbf)[cgl])( bui|\\))/i, // Redmi Pad\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mitv-\\w{5}) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2| pro)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n /\\b(libweb)/i\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i // Windows Phone\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /windows nt 6\\.2; (arm)/i, // Windows RT\n /windows[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i,\n /(?:win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv\\/|iphone.+ios[\\/ ])([\\d\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, CHROMIUM_OS], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;\n var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);\n var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n var _isSelfNav = _navigator && _navigator.userAgent == _ua;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser[MAJOR] = majorize(_browser[VERSION]);\n // Brave-specific detection\n if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {\n _browser[NAME] = 'Brave';\n }\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {\n _device[TYPE] = MOBILE;\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {\n _device[MODEL] = 'iPad';\n _device[TYPE] = TABLET;\n }\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {\n _os[NAME] = _uach.platform \n .replace(/chrome os/i, CHROMIUM_OS)\n .replace(/macos/i, MAC_OS); // backward compatibility\n }\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","/**\n * @constant __ placeholder used when parameters are skipped\n */\nexport const __: Placeholder =\n typeof Symbol === 'function' ? Symbol('curriable placeholder') : 0xedd1;\n\n/**\n * @function recursiveCurry\n *\n * @description\n * recursively curry over the arguments until all have been resolved\n *\n * @param fn the function to curry\n * @param arity the length of the function to curry until\n * @param args the existing arguments\n * @returns the result of the function call\n */\nexport function getCurried<Fn extends Handler>(fn: Fn, arity: number): Curry<Fn> {\n function _curried(args: any[]) {\n return function () {\n const length: number = args.length;\n\n const newArgs: IArguments = arguments;\n const { length: newArgsLength } = newArgs;\n\n const combined: any[] = [];\n\n let newArgsIndex = 0;\n let remaining = arity;\n let value: any;\n\n if (length) {\n let index = -1;\n\n while (++index < length) {\n combined[index] = value =\n args[index] === __ && newArgsIndex < newArgsLength\n ? newArgs[newArgsIndex++]\n : args[index];\n\n if (value !== __) {\n --remaining;\n }\n }\n }\n\n if (newArgsIndex < newArgsLength) {\n while (newArgsIndex < newArgsLength) {\n combined[combined.length] = value = newArgs[newArgsIndex];\n\n if (value !== __ && newArgsIndex < arity) {\n --remaining;\n }\n\n ++newArgsIndex;\n }\n }\n\n return remaining > 0 ? _curried(combined) : fn.apply(this, combined);\n };\n }\n\n return _curried([]);\n}\n","// utils\nimport { __, getCurried } from './utils';\n\nexport { __ };\n\n/**\n * @function curry\n *\n * @description\n * get the method passed as a curriable method based on its parameters\n *\n * @param fn the method to make curriable\n * @param arityOverride the hard-coded arity of the curried method\n * @returns the fn passed as a curried function\n */\nexport function curry<Fn extends Handler>(fn: Fn): Curried<Fn>;\nexport function curry<Fn extends Handler>(fn: Fn, arityOverride: number): Handler;\nexport function curry<Fn extends Handler>(fn: Fn, arityOverride?: number) {\n const arity = typeof arityOverride === 'number' ? arityOverride : fn.length;\n const curried = getCurried(fn, arity) as Curried<Fn>;\n\n curried.arity = arity;\n curried.fn = fn;\n\n return curried;\n}\n\ncurry.__ = __;\n\n/**\n * @function isPlaceholder\n *\n * @description\n * is the value passed a placeholder\n *\n * @param value the value to test\n * @returns whether the value is a placeholder\n */\nexport function isPlaceholder(value: any): value is Placeholder {\n return value === __;\n}\n\ncurry.isPlaceholder = isPlaceholder;\n\n/**\n * @function uncurry\n *\n * @description\n * return a function that is the non-curried version of the fn passed\n *\n * @param curried the curried function to uncurry\n * @returns the original fn\n */\nexport function uncurry<Fn extends Handler>(curried: Curried<Fn>): Fn {\n return curried.fn;\n}\n\ncurry.uncurry = uncurry;\n\nexport default curry;\n","var _SELF_TAGS, _TOSTRING_TAGS, _TYPEDARRAY_TAGS, _UNPARSEABLE_TAGS;\n\n/**\n * @constant {boolean} HAS_BUFFER_FROM_SUPPORT\n */\nexport var HAS_BUFFER_FROM_SUPPORT = typeof Buffer !== 'undefined' && typeof Buffer.from === 'function';\n/**\n * @constant {boolean} HAS_UINT16ARRAY_SUPPORT\n */\n\nexport var HAS_UINT16ARRAY_SUPPORT = typeof Uint16Array === 'function';\n/**\n * @constant {RegExp} HTML_ELEMENT_REGEXP\n */\n\nexport var HTML_ELEMENT_REGEXP = /\\[object (HTML(.*)Element)\\]/;\n/**\n * @constant {RegExp} SVG_ELEMENT_REGEXP\n */\n\nexport var SVG_ELEMENT_REGEXP = /\\[object (SVG(.*)Element)\\]/;\n/**\n * @constant {Array<string>} OBJECT_CLASSES\n */\n\nvar OBJECT_CLASSES = ['Arguments', 'Array', 'ArrayBuffer', 'Boolean', 'DataView', 'Date', 'DocumentFragment', 'Error', 'Event', 'Float32Array', 'Float64Array', 'Function', 'Generator', 'GeneratorFunction', 'HTMLElement', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Null', 'Number', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'Undefined', 'WeakMap', 'WeakSet', 'Window'];\n/**\n * @constant {Object} OBJECT_CLASS_MAP\n */\n\nexport var OBJECT_CLASS_MAP = OBJECT_CLASSES.reduce(function (objectClasses, type) {\n objectClasses[\"[object \" + type + \"]\"] = type;\n return objectClasses;\n}, {});\n/**\n * @constant {Object} OBJECT_CLASS_TYPE_MAP\n */\n\nexport var OBJECT_CLASS_TYPE_MAP = Object.keys(OBJECT_CLASS_MAP).reduce(function (objectClassTypes, objectClass) {\n objectClassTypes[OBJECT_CLASS_MAP[objectClass].toUpperCase()] = objectClass;\n return objectClassTypes;\n}, {});\nexport var ITERABLE_TAGS = {\n '[object Map]': true,\n '[object Set]': true\n};\nexport var PRIMITIVE_TAGS = {\n boolean: true,\n function: true,\n number: true,\n string: true,\n undefined: true\n};\nexport var SELF_TAGS = (_SELF_TAGS = {}, _SELF_TAGS[OBJECT_CLASS_TYPE_MAP.ARGUMENTS] = true, _SELF_TAGS[OBJECT_CLASS_TYPE_MAP.ARRAY] = true, _SELF_TAGS);\nexport var TOSTRING_TAGS = (_TOSTRING_TAGS = {}, _TOSTRING_TAGS[OBJECT_CLASS_TYPE_MAP.REGEXP] = true, _TOSTRING_TAGS[OBJECT_CLASS_TYPE_MAP.SYMBOL] = true, _TOSTRING_TAGS);\nexport var TYPEDARRAY_TAGS = (_TYPEDARRAY_TAGS = {}, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.FLOAT32ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.FLOAT64ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.INT8ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.INT16ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.INT32ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.UINT8ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.UINT8CLAMPEDARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.UINT16ARRAY] = true, _TYPEDARRAY_TAGS[OBJECT_CLASS_TYPE_MAP.UINT32ARRAY] = true, _TYPEDARRAY_TAGS);\nexport var UNPARSEABLE_TAGS = (_UNPARSEABLE_TAGS = {}, _UNPARSEABLE_TAGS[OBJECT_CLASS_TYPE_MAP.GENERATOR] = true, _UNPARSEABLE_TAGS[OBJECT_CLASS_TYPE_MAP.PROMISE] = true, _UNPARSEABLE_TAGS[OBJECT_CLASS_TYPE_MAP.WEAKMAP] = true, _UNPARSEABLE_TAGS[OBJECT_CLASS_TYPE_MAP.WEAKSET] = true, _UNPARSEABLE_TAGS);","import { HAS_BUFFER_FROM_SUPPORT, HAS_UINT16ARRAY_SUPPORT, HTML_ELEMENT_REGEXP, ITERABLE_TAGS, OBJECT_CLASS_MAP, OBJECT_CLASS_TYPE_MAP, PRIMITIVE_TAGS, SELF_TAGS, SVG_ELEMENT_REGEXP, TOSTRING_TAGS, TYPEDARRAY_TAGS, UNPARSEABLE_TAGS } from './constants';\nvar FUNCTION_NAME_REGEX = /^\\s*function\\s*([^(]*)/i;\nvar toString = Object.prototype.toString;\nvar keys = Object.keys;\n/**\n * @function getFunctionName\n *\n * @description\n * get the name of the function based on a series of fallback attempts\n *\n * @param {function} fn the function to test\n * @returns {string} the function name\n */\n\nexport function getFunctionName(fn) {\n return fn.name || (fn.toString().match(FUNCTION_NAME_REGEX) || [])[1] || 'anonymous';\n}\n/**\n * @function getIntegerHashValue\n *\n * @description\n * based on string passed, get the integer hash value\n * through bitwise operation (based on spinoff of dbj2\n * with enhancements for reduced collisions)\n *\n * @param {string} string the string to get the hash value for\n * @returns {number} the hash value\n */\n\nexport function getIntegerHashValue(string) {\n var index = string.length,\n hashA = 5381,\n hashB = 52711,\n charCode;\n\n while (index--) {\n charCode = string.charCodeAt(index);\n hashA = hashA * 33 ^ charCode;\n hashB = hashB * 33 ^ charCode;\n }\n\n return (hashA >>> 0) * 4096 + (hashB >>> 0);\n}\n/**\n * @function getSortedEvent\n *\n * @description\n * get the event object sorted by its properties\n *\n * @param {boolean} bubbles does the event bubble up through the DOM\n * @param {function} alias to stopPropagation\n * @param {boolean} cancelable is the event cancelable\n * @param {boolean} composed can the event bubble across the boundary to shadow DOM\n * @param {HTMLElement} [currentTarget] registered target for the event\n * @param {boolean} defaultPrevented has preventDefault been called on the event\n * @param {string} eventPhase the phase of the event flow being processed\n * @param {boolean} isTrusted was the event initiated by the browser\n * @param {HTMLElement} [target] the target with which the event was dispatched\n * @param {number} timeStamp the time at which the event was created\n * @param {string} type the name of the event\n * @returns {Object} the event object with all properties sorted\n */\n\nexport function getSortedEvent(event) {\n return {\n bubbles: event.bubbles,\n cancelBubble: event.cancelBubble,\n cancelable: event.cancelable,\n composed: event.composed,\n currentTarget: event.currentTarget,\n defaultPrevented: event.defaultPrevented,\n eventPhase: event.eventPhase,\n isTrusted: event.isTrusted,\n returnValue: event.returnValue,\n target: event.target,\n type: event.type\n };\n}\n/**\n * @function shouldSort\n *\n * @description\n * get the sort result based on the two values to compare\n *\n * @param {string} valueA the first value to compare\n * @param {string} valueB the second value to compare\n * @returns {boolean} should the value be sorted\n */\n\nexport function shouldSort(valueA, valueB) {\n return valueA > valueB;\n}\n/**\n * @function shouldSortPair\n *\n * @description\n * get the sort result based on the two pairs to compare\n *\n * @param {Object} pairA the first pair to compare\n * @param {Object} pairB the second pair to compare\n * @returns {boolean} should the value be sorted\n */\n\nexport function shouldSortPair(pairA, pairB) {\n return pairA[0] > pairB[0];\n}\n/**\n * @function sort\n *\n * @description\n * sort the array based on the fn passed\n *\n * @param {Array<any>} array the array to sort\n * @param {function} fn the sorting function\n * @returns {Array<any>} the sorted array\n */\n\nexport function sort(array, fn) {\n var subIndex, value;\n\n for (var index = 0; index < array.length; ++index) {\n value = array[index];\n\n for (subIndex = index - 1; ~subIndex && fn(array[subIndex], value); --subIndex) {\n array[subIndex + 1] = array[subIndex];\n }\n\n array[subIndex + 1] = value;\n }\n\n return array;\n}\n/**\n * @function getIterablePairs\n *\n * @description\n * get the pairs in the iterable for stringification\n *\n * @param {Map|Set} iterable the iterable to get the pairs for\n * @returns {Array<{key: string, value: any}>} the pairs\n */\n\nexport function getSortedIterable(iterable, cache, keys) {\n var isMap = typeof iterable.get === 'function';\n var entries = [];\n\n if (isMap) {\n iterable.forEach(function (value, key) {\n entries.push([// eslint-disable-next-line no-use-before-define\n stringify(key, cache, keys), // eslint-disable-next-line no-use-before-define\n stringify(value, cache, keys)]);\n });\n sort(entries, shouldSortPair);\n } else {\n iterable.forEach(function (value) {\n // eslint-disable-next-line no-use-before-define\n entries.push(stringify(value, cache, keys));\n });\n sort(entries, shouldSort);\n }\n\n var _final = getFunctionName(iterable.constructor) + \"|[\";\n\n for (var index = 0, length = entries.length, entry; index < length; ++index) {\n entry = entries[index];\n _final += \"\" + (index ? ',' : '') + (isMap ? \"[\" + entry[0] + \",\" + entry[1] + \"]\" : entry);\n }\n\n return _final + \"]\";\n}\n/**\n * @function getSortedObject\n *\n * @description\n * get the object with the keys sorted\n *\n * @param {Object} object the object to sort\n * @returns {Object} the sorted object\n */\n\nexport function getSortedObject(object) {\n var objectKeys = sort(keys(object), shouldSort);\n var newObject = {};\n var key;\n\n for (var index = 0; index < objectKeys.length; ++index) {\n key = objectKeys[index];\n newObject[key] = object[key];\n }\n\n return newObject;\n}\n/**\n * @function getStringifiedArrayBufferFallback\n *\n * @description\n * get the string value of the buffer passed based on a Buffer\n *\n * @param {ArrayBuffer} buffer the array buffer to convert\n * @returns {string} the stringified buffer\n */\n\nexport function getStringifiedArrayBufferFallback(buffer) {\n return String.fromCharCode.apply(null, new Uint16Array(buffer));\n}\n/**\n * @function getStringifiedArrayBufferModern\n *\n * @description\n * get the string value of the buffer passed based on a Uint16Array\n *\n * @param {ArrayBuffer} buffer the array buffer to convert\n * @returns {string} the stringified buffer\n */\n\nexport function getStringifiedArrayBufferModern(buffer) {\n return Buffer.from(buffer).toString('utf8');\n}\n/**\n * @function getStringifiedArrayBufferNoSupport\n *\n * @description\n * return a placeholder when no arraybuffer support exists\n *\n * @returns {string} the placeholder\n */\n\nexport function getStringifiedArrayBufferNoSupport() {\n return '';\n}\n/**\n * @function getStringifiedArrayBuffer\n *\n * @description\n * get the string value of the buffer passed\n *\n * @param {ArrayBuffer} buffer the array buffer to convert\n * @returns {string} the stringified buffer\n */\n\nexport var getStringifiedArrayBuffer = function () {\n if (HAS_BUFFER_FROM_SUPPORT) {\n return getStringifiedArrayBufferModern;\n }\n\n if (HAS_UINT16ARRAY_SUPPORT) {\n return getStringifiedArrayBufferFallback;\n }\n\n return getStringifiedArrayBufferNoSupport;\n}();\n/**\n * @function getStringifiedDocumentFragment\n *\n * @description\n * build a string based on all the fragment's children\n *\n * @param {DocumentFragment} fragment the fragment to stringify\n * @returns {string} the stringified fragment\n */\n\nexport function getStringifiedDocumentFragment(fragment) {\n var children = fragment.children;\n var innerHTML = '';\n\n for (var index = 0; index < children.length; ++index) {\n innerHTML += children[index].outerHTML;\n }\n\n return innerHTML;\n}\n/**\n * @function getCutoffIndex\n *\n * @description\n * get the index after that of the value match in the array (faster than\n * native indexOf) to determine the cutoff index for the `splice()` call.\n *\n * @param {Array<any>} array the array to get the index of the value at\n * @param {any} value the value to match\n * @returns {number} the index after the value match in the array\n */\n\nexport function getCutoffIndex(array, value) {\n for (var index = 0; index < array.length; ++index) {\n if (array[index] === value) {\n return index + 1;\n }\n }\n\n return 0;\n}\n/**\n * @function getNormalizedValue\n *\n * @description\n * get the value normalized for stringification\n *\n * @param {any} value the value to normalize\n * @param {WeakMap|Object} sortedCache the cache of sorted objects\n * @param {string} [passedTag] the previously-calculated tag\n * @returns {any} the normalized value\n */\n\nexport function getNormalizedValue(value, cache, keys, passedTag) {\n if (passedTag === void 0) {\n var type = typeof value;\n\n if (type === 'string' || PRIMITIVE_TAGS[type]) {\n return type + \"|\" + value;\n }\n\n if (value === null) {\n return \"null|\" + value;\n }\n }\n\n var tag = passedTag || toString.call(value);\n\n if (SELF_TAGS[tag]) {\n return value;\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.OBJECT) {\n return getSortedObject(value);\n }\n\n if (TOSTRING_TAGS[tag]) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + value.toString();\n }\n\n if (ITERABLE_TAGS[tag]) {\n return getSortedIterable(value, cache, keys);\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.DATE) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + value.getTime();\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.ERROR) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + value.stack;\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.EVENT) {\n return getSortedEvent(value);\n }\n\n if (UNPARSEABLE_TAGS[tag]) {\n return OBJECT_CLASS_MAP[tag] + \"|NOT_ENUMERABLE\";\n }\n\n if (HTML_ELEMENT_REGEXP.test(tag) || SVG_ELEMENT_REGEXP.test(tag)) {\n return tag.slice(8, -1) + \"|\" + value.outerHTML;\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.DOCUMENTFRAGMENT) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + getStringifiedDocumentFragment(value);\n }\n\n if (TYPEDARRAY_TAGS[tag]) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + value.join(',');\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.ARRAYBUFFER) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + getStringifiedArrayBuffer(value);\n }\n\n if (tag === OBJECT_CLASS_TYPE_MAP.DATAVIEW) {\n return OBJECT_CLASS_MAP[tag] + \"|\" + getStringifiedArrayBuffer(value.buffer);\n }\n\n return value;\n}\n/**\n * @function replacer\n *\n * @description\n * create the replacer function used for stringification\n *\n * @param {WeakSet|Object} sortedCache the cache to use for sorting objects\n * @returns {function(key: string, value: any)} function getting the normalized value\n */\n\nexport function createReplacer(cache, keys) {\n if (cache === void 0) {\n cache = [];\n }\n\n if (keys === void 0) {\n keys = [];\n }\n\n return function (key, value) {\n if (typeof value === 'object') {\n if (cache.length) {\n var thisCutoff = getCutoffIndex(cache, this);\n\n if (thisCutoff === 0) {\n cache.push(this);\n } else {\n cache.splice(thisCutoff);\n keys.splice(thisCutoff);\n }\n\n keys.push(key);\n var valueCutoff = getCutoffIndex(cache, value);\n\n if (valueCutoff !== 0) {\n return \"[~\" + (keys.slice(0, valueCutoff).join('.') || '.') + \"]\";\n }\n\n cache.push(value);\n } else {\n cache[0] = value;\n keys[0] = key;\n }\n }\n\n if (key && this[key] instanceof Date) {\n return getNormalizedValue(this[key], cache, keys, OBJECT_CLASS_TYPE_MAP.DATE, cache, keys);\n }\n\n return getNormalizedValue(value, cache, keys);\n };\n}\n/**\n * @function stringify\n *\n * @description\n * stringify the value based on the options passed\n *\n * @param {any} value the value to stringify\n * @returns {string} the stringified value\n */\n\nexport function stringify(value, cache, keys) {\n if (!value || typeof value !== 'object') {\n return getNormalizedValue(value, cache, keys);\n }\n\n var tag = toString.call(value);\n\n if (tag === OBJECT_CLASS_TYPE_MAP.DATE || tag === OBJECT_CLASS_TYPE_MAP.REGEXP) {\n return getNormalizedValue(value, cache, keys, tag);\n }\n\n return JSON.stringify(value, createReplacer(cache, keys));\n}","// external dependencies\nimport { curry } from 'curriable'; // utils\n\nimport { getIntegerHashValue, stringify } from './utils';\n/**\n * @function hash\n *\n * @description\n * hash the value passed to a unique, consistent hash value\n *\n * @param {any} value the value to hash\n * @returns {number} the object hash\n */\n\nexport function hash(value) {\n return getIntegerHashValue(stringify(value));\n}\n/**\n * @function hash.is\n *\n * @description\n * create a comparator for the first object passed to determine if the second is equal\n *\n * @param {any} object the object to test against\n * @returns {function(any): boolean} the method to test against the object\n */\n\nhash.is = curry(function (object, otherObject) {\n return hash(object) === hash(otherObject);\n});\n/**\n * @function hash.is.all\n *\n * @description\n * determine if all of the objects passed are equal in value to the first\n *\n * @param {...Array<any>} objects the objects to test for equality\n * @returns {boolean} are the objects equal\n */\n\nhash.is.all = curry(function (objectBasis) {\n var isEqual = hash.is(objectBasis);\n\n for (var index = 1; index < arguments.length; ++index) {\n if (!isEqual(arguments[index])) {\n return false;\n }\n }\n\n return true;\n}, 2);\n/**\n * @function hash.is.any\n *\n * @description\n * determine if any of the objects passed are equal in value to the first\n *\n * @param {...Array<any>} objects the objects to test for equality\n * @returns {boolean} are the objects equal\n */\n\nhash.is.any = curry(function (objectBasis) {\n var isEqual = hash.is(objectBasis);\n\n for (var index = 1; index < arguments.length; index++) {\n if (isEqual(arguments[index])) {\n return true;\n }\n }\n\n return false;\n}, 2);\n/**\n * @function hash.is.not\n *\n * @description\n * create a comparator for the first object passed to determine if the second is not equal\n *\n * @param {any} object the object to test against\n * @returns {function(any): boolean} the method to test against the object\n */\n\nhash.is.not = curry(function (object, otherObject) {\n return hash(object) !== hash(otherObject);\n});\nexport default hash;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _hashIt = require('hash-it');\n\nvar _hashIt2 = _interopRequireDefault(_hashIt);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Fact = function () {\n /**\n * Returns a new fact instance\n * @param {string} id - fact unique identifer\n * @param {object} options\n * @param {boolean} options.cache - whether to cache the fact's value for future rules\n * @param {primitive|function} valueOrMethod - constant primitive, or method to call when computing the fact's value\n * @return {Fact}\n */\n function Fact(id, valueOrMethod, options) {\n _classCallCheck(this, Fact);\n\n this.id = id;\n var defaultOptions = { cache: true };\n if (typeof options === 'undefined') {\n options = defaultOptions;\n }\n if (typeof valueOrMethod !== 'function') {\n this.value = valueOrMethod;\n this.type = this.constructor.CONSTANT;\n } else {\n this.calculationMethod = valueOrMethod;\n this.type = this.constructor.DYNAMIC;\n }\n\n if (!this.id) throw new Error('factId required');\n if (typeof this.value === 'undefined' && typeof this.calculationMethod === 'undefined') {\n throw new Error('facts must have a value or method');\n }\n\n this.priority = parseInt(options.priority || 1, 10);\n this.options = Object.assign({}, defaultOptions, options);\n this.cacheKeyMethod = this.defaultCacheKeys;\n return this;\n }\n\n _createClass(Fact, [{\n key: 'isConstant',\n value: function isConstant() {\n return this.type === this.constructor.CONSTANT;\n }\n }, {\n key: 'isDynamic',\n value: function isDynamic() {\n return this.type === this.constructor.DYNAMIC;\n }\n\n /**\n * Return the fact value, based on provided parameters\n * @param {object} params\n * @param {Almanac} almanac\n * @return {any} calculation method results\n */\n\n }, {\n key: 'calculate',\n value: function calculate(params, almanac) {\n // if constant fact w/set value, return immediately\n if (this.hasOwnProperty('value')) {\n return this.value;\n }\n return this.calculationMethod(params, almanac);\n }\n\n /**\n * Return a cache key (MD5 string) based on parameters\n * @param {object} obj - properties to generate a hash key from\n * @return {string} MD5 string based on the hash'd object\n */\n\n }, {\n key: 'defaultCacheKeys',\n\n\n /**\n * Default properties to use when caching a fact\n * Assumes every fact is a pure function, whose computed value will only\n * change when input params are modified\n * @param {string} id - fact unique identifer\n * @param {object} params - parameters passed to fact calcution method\n * @return {object} id + params\n */\n value: function defaultCacheKeys(id, params) {\n return { params: params, id: id };\n }\n\n /**\n * Generates the fact's cache key(MD5 string)\n * Returns nothing if the fact's caching has been disabled\n * @param {object} params - parameters that would be passed to the computation method\n * @return {string} cache key\n */\n\n }, {\n key: 'getCacheKey',\n value: function getCacheKey(params) {\n if (this.options.cache === true) {\n var cacheProperties = this.cacheKeyMethod(this.id, params);\n var _hash = Fact.hashFromObject(cacheProperties);\n return _hash;\n }\n }\n }], [{\n key: 'hashFromObject',\n value: function hashFromObject(obj) {\n return (0, _hashIt2.default)(obj);\n }\n }]);\n\n return Fact;\n}();\n\nFact.CONSTANT = 'CONSTANT';\nFact.DYNAMIC = 'DYNAMIC';\n\nexports.default = Fact;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = debug;\nfunction debug(message) {\n if (typeof process !== 'undefined' && process.env && process.env.DEBUG && process.env.DEBUG.match(/json-rules-engine/) || typeof window !== 'undefined' && window.localStorage && window.localStorage.debug && window.localStorage.debug.match(/json-rules-engine/)) {\n console.log(message);\n }\n}","/**\n * lodash 4.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _debug = require('./debug');\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _lodash = require('lodash.isobjectlike');\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Condition = function () {\n function Condition(properties) {\n _classCallCheck(this, Condition);\n\n if (!properties) throw new Error('Condition: constructor options required');\n var booleanOperator = Condition.booleanOperator(properties);\n Object.assign(this, properties);\n if (booleanOperator) {\n var subConditions = properties[booleanOperator];\n if (!Array.isArray(subConditions)) {\n throw new Error('\"' + booleanOperator + '\" must be an array');\n }\n this.operator = booleanOperator;\n // boolean conditions always have a priority; default 1\n this.priority = parseInt(properties.priority, 10) || 1;\n this[booleanOperator] = subConditions.map(function (c) {\n return new Condition(c);\n });\n } else {\n if (!properties.hasOwnProperty('fact')) throw new Error('Condition: constructor \"fact\" property required');\n if (!properties.hasOwnProperty('operator')) throw new Error('Condition: constructor \"operator\" property required');\n if (!properties.hasOwnProperty('value')) throw new Error('Condition: constructor \"value\" property required');\n\n // a non-boolean condition does not have a priority by default. this allows\n // priority to be dictated by the fact definition\n if (properties.hasOwnProperty('priority')) {\n properties.priority = parseInt(properties.priority, 10);\n }\n }\n }\n\n /**\n * Converts the condition into a json-friendly structure\n * @param {Boolean} stringify - whether to return as a json string\n * @returns {string,object} json string or json-friendly object\n */\n\n\n _createClass(Condition, [{\n key: 'toJSON',\n value: function toJSON() {\n var stringify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n var props = {};\n if (this.priority) {\n props.priority = this.priority;\n }\n var oper = Condition.booleanOperator(this);\n if (oper) {\n props[oper] = this[oper].map(function (c) {\n return c.toJSON(stringify);\n });\n } else {\n props.operator = this.operator;\n props.value = this.value;\n props.fact = this.fact;\n if (this.factResult !== undefined) {\n props.factResult = this.factResult;\n }\n if (this.result !== undefined) {\n props.result = this.result;\n }\n if (this.params) {\n props.params = this.params;\n }\n if (this.path) {\n props.path = this.path;\n }\n }\n if (stringify) {\n return JSON.stringify(props);\n }\n return props;\n }\n\n /**\n * Interprets .value as either a primitive, or if a fact, retrieves the fact value\n */\n\n }, {\n key: '_getValue',\n value: function _getValue(almanac) {\n var value = this.value;\n if ((0, _lodash2.default)(value) && value.hasOwnProperty('fact')) {\n // value: { fact: 'xyz' }\n return almanac.factValue(value.fact, value.params, value.path);\n }\n return Promise.resolve(value);\n }\n\n /**\n * Takes the fact result and compares it to the condition 'value', using the operator\n * LHS OPER RHS\n * <fact + params + path> <operator> <value>\n *\n * @param {Almanac} almanac\n * @param {Map} operatorMap - map of available operators, keyed by operator name\n * @returns {Boolean} - evaluation result\n */\n\n }, {\n key: 'evaluate',\n value: function evaluate(almanac, operatorMap) {\n var _this = this;\n\n if (!almanac) return Promise.reject(new Error('almanac required'));\n if (!operatorMap) return Promise.reject(new Error('operatorMap required'));\n if (this.isBooleanOperator()) return Promise.reject(new Error('Cannot evaluate() a boolean condition'));\n\n var op = operatorMap.get(this.operator);\n if (!op) return Promise.reject(new Error('Unknown operator: ' + this.operator));\n\n return this._getValue(almanac) // todo - parallelize\n .then(function (rightHandSideValue) {\n return almanac.factValue(_this.fact, _this.params, _this.path).then(function (leftHandSideValue) {\n var result = op.evaluate(leftHandSideValue, rightHandSideValue);\n (0, _debug2.default)('condition::evaluate <' + leftHandSideValue + ' ' + _this.operator + ' ' + rightHandSideValue + '?> (' + result + ')');\n return { result: result, leftHandSideValue: leftHandSideValue, rightHandSideValue: rightHandSideValue, operator: _this.operator };\n });\n });\n }\n\n /**\n * Returns the boolean operator for the condition\n * If the condition is not a boolean condition, the result will be 'undefined'\n * @return {string 'all' or 'any'}\n */\n\n }, {\n key: 'booleanOperator',\n\n\n /**\n * Returns the condition's boolean operator\n * Instance version of Condition.isBooleanOperator\n * @returns {string,undefined} - 'any', 'all', or undefined (if not a boolean condition)\n */\n value: function booleanOperator() {\n return Condition.booleanOperator(this);\n }\n\n /**\n * Whether the operator is boolean ('all', 'any')\n * @returns {Boolean}\n */\n\n }, {\n key: 'isBooleanOperator',\n value: function isBooleanOperator() {\n return Condition.booleanOperator(this) !== undefined;\n }\n }], [{\n key: 'booleanOperator',\n value: function booleanOperator(condition) {\n if (condition.hasOwnProperty('any')) {\n return 'any';\n } else if (condition.hasOwnProperty('all')) {\n return 'all';\n }\n }\n }]);\n\n return Condition;\n}();\n\nexports.default = Condition;","var clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n nativeMap = Map;\n} catch(_) {\n // maybe a reference error because no `Map`. Give it a dummy value that no\n // value will ever be an instanceof.\n nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n nativeSet = Set;\n} catch(_) {\n nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n nativePromise = Promise;\n} catch(_) {\n nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n * circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n * a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n * (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n * should be cloned as well. Non-enumerable properties on the prototype\n * chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n if (typeof circular === 'object') {\n depth = circular.depth;\n prototype = circular.prototype;\n includeNonEnumerable = circular.includeNonEnumerable;\n circular = circular.circular;\n }\n // maintain two arrays for circular references, where corresponding parents\n // and children have the same index\n var allParents = [];\n var allChildren = [];\n\n var useBuffer = typeof Buffer != 'undefined';\n\n if (typeof circular == 'undefined')\n circular = true;\n\n if (typeof depth == 'undefined')\n depth = Infinity;\n\n // recurse this function so we don't reset allParents and allChildren\n function _clone(parent, depth) {\n // cloning null always returns null\n if (parent === null)\n return null;\n\n if (depth === 0)\n return parent;\n\n var child;\n var proto;\n if (typeof parent != 'object') {\n return parent;\n }\n\n if (_instanceof(parent, nativeMap)) {\n child = new nativeMap();\n } else if (_instanceof(parent, nativeSet)) {\n child = new nativeSet();\n } else if (_instanceof(parent, nativePromise)) {\n child = new nativePromise(function (resolve, reject) {\n parent.then(function(value) {\n resolve(_clone(value, depth - 1));\n }, function(err) {\n reject(_clone(err, depth - 1));\n });\n });\n } else if (clone.__isArray(parent)) {\n child = [];\n } else if (clone.__isRegExp(parent)) {\n child = new RegExp(parent.source, __getRegExpFlags(parent));\n if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n } else if (clone.__isDate(parent)) {\n child = new Date(parent.getTime());\n } else if (useBuffer && Buffer.isBuffer(parent)) {\n if (Buffer.allocUnsafe) {\n // Node.js >= 4.5.0\n child = Buffer.allocUnsafe(parent.length);\n } else {\n // Older Node.js versions\n child = new Buffer(parent.length);\n }\n parent.copy(child);\n return child;\n } else if (_instanceof(parent, Error)) {\n child = Object.create(parent);\n } else {\n if (typeof prototype == 'undefined') {\n proto = Object.getPrototypeOf(parent);\n child = Object.create(proto);\n }\n else {\n child = Object.create(prototype);\n proto = prototype;\n }\n }\n\n if (circular) {\n var index = allParents.indexOf(parent);\n\n if (index != -1) {\n return allChildren[index];\n }\n allParents.push(parent);\n allChildren.push(child);\n }\n\n if (_instanceof(parent, nativeMap)) {\n parent.forEach(function(value, key) {\n var keyChild = _clone(key, depth - 1);\n var valueChild = _clone(value, depth - 1);\n child.set(keyChild, valueChild);\n });\n }\n if (_instanceof(parent, nativeSet)) {\n parent.forEach(function(value) {\n var entryChild = _clone(value, depth - 1);\n child.add(entryChild);\n });\n }\n\n for (var i in parent) {\n var attrs;\n if (proto) {\n attrs = Object.getOwnPropertyDescriptor(proto, i);\n }\n\n if (attrs && attrs.set == null) {\n continue;\n }\n child[i] = _clone(parent[i], depth - 1);\n }\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(parent);\n for (var i = 0; i < symbols.length; i++) {\n // Don't need to worry about cloning a symbol because it is a primitive,\n // like a number or string.\n var symbol = symbols[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n continue;\n }\n child[symbol] = _clone(parent[symbol], depth - 1);\n if (!descriptor.enumerable) {\n Object.defineProperty(child, symbol, {\n enumerable: false\n });\n }\n }\n }\n\n if (includeNonEnumerable) {\n var allPropertyNames = Object.getOwnPropertyNames(parent);\n for (var i = 0; i < allPropertyNames.length; i++) {\n var propertyName = allPropertyNames[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n if (descriptor && descriptor.enumerable) {\n continue;\n }\n child[propertyName] = _clone(parent[propertyName], depth - 1);\n Object.defineProperty(child, propertyName, {\n enumerable: false\n });\n }\n }\n\n return child;\n }\n\n return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n if (parent === null)\n return null;\n\n var c = function () {};\n c.prototype = parent;\n return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n var flags = '';\n if (re.global) flags += 'g';\n if (re.ignoreCase) flags += 'i';\n if (re.multiline) flags += 'm';\n return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n module.exports = clone;\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _clone = require('clone');\n\nvar _clone2 = _interopRequireDefault(_clone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar RuleResult = function () {\n function RuleResult(conditions, event, priority, name) {\n _classCallCheck(this, RuleResult);\n\n this.conditions = (0, _clone2.default)(conditions);\n this.event = (0, _clone2.default)(event);\n this.priority = (0, _clone2.default)(priority);\n this.name = (0, _clone2.default)(name);\n this.result = null;\n }\n\n _createClass(RuleResult, [{\n key: 'setResult',\n value: function setResult(result) {\n this.result = result;\n }\n }, {\n key: 'toJSON',\n value: function toJSON() {\n var stringify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n var props = {\n conditions: this.conditions.toJSON(false),\n event: this.event,\n priority: this.priority,\n name: this.name,\n result: this.result\n };\n if (stringify) {\n return JSON.stringify(props);\n }\n return props;\n }\n }]);\n\n return RuleResult;\n}();\n\nexports.default = RuleResult;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _condition = require('./condition');\n\nvar _condition2 = _interopRequireDefault(_condition);\n\nvar _ruleResult = require('./rule-result');\n\nvar _ruleResult2 = _interopRequireDefault(_ruleResult);\n\nvar _events = require('events');\n\nvar _debug = require('./debug');\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Rule = function (_EventEmitter) {\n _inherits(Rule, _EventEmitter);\n\n /**\n * returns a new Rule instance\n * @param {object,string} options, or json string that can be parsed into options\n * @param {integer} options.priority (>1) - higher runs sooner.\n * @param {Object} options.event - event to fire when rule evaluates as successful\n * @param {string} options.event.type - name of event to emit\n * @param {string} options.event.params - parameters to pass to the event listener\n * @param {Object} options.conditions - conditions to evaluate when processing this rule\n * @param {any} options.name - identifier for a particular rule, particularly valuable in RuleResult output\n * @return {Rule} instance\n */\n function Rule(options) {\n _classCallCheck(this, Rule);\n\n var _this = _possibleConstructorReturn(this, (Rule.__proto__ || Object.getPrototypeOf(Rule)).call(this));\n\n if (typeof options === 'string') {\n options = JSON.parse(options);\n }\n if (options && options.conditions) {\n _this.setConditions(options.conditions);\n }\n if (options && options.onSuccess) {\n _this.on('success', options.onSuccess);\n }\n if (options && options.onFailure) {\n _this.on('failure', options.onFailure);\n }\n if (options && (options.name || options.name === 0)) {\n _this.setName(options.name);\n }\n\n var priority = options && options.priority || 1;\n _this.setPriority(priority);\n\n var event = options && options.event || { type: 'unknown' };\n _this.setEvent(event);\n return _this;\n }\n\n /**\n * Sets the priority of the rule\n * @param {integer} priority (>=1) - increasing the priority causes the rule to be run prior to other rules\n */\n\n\n _createClass(Rule, [{\n key: 'setPriority',\n value: function setPriority(priority) {\n priority = parseInt(priority, 10);\n if (priority <= 0) throw new Error('Priority must be greater than zero');\n this.priority = priority;\n return this;\n }\n\n /**\n * Sets the name of the rule\n * @param {any} name - any truthy input and zero is allowed\n */\n\n }, {\n key: 'setName',\n value: function setName(name) {\n if (!name && name !== 0) {\n throw new Error('Rule \"name\" must be defined');\n }\n this.name = name;\n return this;\n }\n\n /**\n * Sets the conditions to run when evaluating the rule.\n * @param {object} conditions - conditions, root element must be a boolean operator\n */\n\n }, {\n key: 'setConditions',\n value: function setConditions(conditions) {\n if (!conditions.hasOwnProperty('all') && !conditions.hasOwnProperty('any')) {\n throw new Error('\"conditions\" root must contain a single instance of \"all\" or \"any\"');\n }\n this.conditions = new _condition2.default(conditions);\n return this;\n }\n\n /**\n * Sets the event to emit when the conditions evaluate truthy\n * @param {object} event - event to emit\n * @param {string} event.type - event name to emit on\n * @param {string} event.params - parameters to emit as the argument of the event emission\n */\n\n }, {\n key: 'setEvent',\n value: function setEvent(event) {\n if (!event) throw new Error('Rule: setEvent() requires event object');\n if (!event.hasOwnProperty('type')) throw new Error('Rule: setEvent() requires event object with \"type\" property');\n this.event = {\n type: event.type\n };\n if (event.params) this.event.params = event.params;\n return this;\n }\n\n /**\n * Sets the engine to run the rules under\n * @param {object} engine\n * @returns {Rule}\n */\n\n }, {\n key: 'setEngine',\n value: function setEngine(engine) {\n this.engine = engine;\n return this;\n }\n }, {\n key: 'toJSON',\n value: function toJSON() {\n var stringify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n var props = {\n conditions: this.conditions.toJSON(false),\n priority: this.priority,\n event: this.event,\n name: this.name\n };\n if (stringify) {\n return JSON.stringify(props);\n }\n return props;\n }\n\n /**\n * Priorizes an array of conditions based on \"priority\"\n * When no explicit priority is provided on the condition itself, the condition's priority is determine by its fact\n * @param {Condition[]} conditions\n * @return {Condition[][]} prioritized two-dimensional array of conditions\n * Each outer array element represents a single priority(integer). Inner array is\n * all conditions with that priority.\n */\n\n }, {\n key: 'prioritizeConditions',\n value: function prioritizeConditions(conditions) {\n var _this2 = this;\n\n var factSets = conditions.reduce(function (sets, condition) {\n // if a priority has been set on this specific condition, honor that first\n // otherwise, use the fact's priority\n var priority = condition.priority;\n if (!priority) {\n var fact = _this2.engine.getFact(condition.fact);\n priority = fact && fact.priority || 1;\n }\n if (!sets[priority]) sets[priority] = [];\n sets[priority].push(condition);\n return sets;\n }, {});\n return Object.keys(factSets).sort(function (a, b) {\n return Number(a) > Number(b) ? -1 : 1; // order highest priority -> lowest\n }).map(function (priority) {\n return factSets[priority];\n });\n }\n\n /**\n * Evaluates the rule, starting with the root boolean operator and recursing down\n * All evaluation is done within the context of an almanac\n * @return {Promise(RuleResult)} rule evaluation result\n */\n\n }, {\n key: 'evaluate',\n value: function evaluate(almanac) {\n var _this3 = this;\n\n var ruleResult = new _ruleResult2.default(this.conditions, this.event, this.priority, this.name);\n\n /**\n * Evaluates the rule conditions\n * @param {Condition} condition - condition to evaluate\n * @return {Promise(true|false)} - resolves with the result of the condition evaluation\n */\n var evaluateCondition = function evaluateCondition(condition) {\n if (condition.isBooleanOperator()) {\n var subConditions = condition[condition.operator];\n var comparisonPromise = void 0;\n if (condition.operator === 'all') {\n comparisonPromise = all(subConditions);\n } else {\n comparisonPromise = any(subConditions);\n }\n // for booleans, rule passing is determined by the all/any result\n return comparisonPromise.then(function (comparisonValue) {\n var passes = comparisonValue === true;\n condition.result = passes;\n return passes;\n });\n } else {\n return condition.evaluate(almanac, _this3.engine.operators).then(function (evaluationResult) {\n var passes = evaluationResult.result;\n condition.factResult = evaluationResult.leftHandSideValue;\n condition.result = passes;\n return passes;\n });\n }\n };\n\n /**\n * Evalutes an array of conditions, using an 'every' or 'some' array operation\n * @param {Condition[]} conditions\n * @param {string(every|some)} array method to call for determining result\n * @return {Promise(boolean)} whether conditions evaluated truthy or falsey based on condition evaluation + method\n */\n var evaluateConditions = function evaluateConditions(conditions, method) {\n if (!Array.isArray(conditions)) conditions = [conditions];\n\n return Promise.all(conditions.map(function (condition) {\n return evaluateCondition(condition);\n })).then(function (conditionResults) {\n (0, _debug2.default)('rule::evaluateConditions results', conditionResults);\n return method.call(conditionResults, function (result) {\n return result === true;\n });\n });\n };\n\n /**\n * Evaluates a set of conditions based on an 'all' or 'any' operator.\n * First, orders the top level conditions based on priority\n * Iterates over each priority set, evaluating each condition\n * If any condition results in the rule to be guaranteed truthy or falsey,\n * it will short-circuit and not bother evaluating any additional rules\n * @param {Condition[]} conditions - conditions to be evaluated\n * @param {string('all'|'any')} operator\n * @return {Promise(boolean)} rule evaluation result\n */\n var prioritizeAndRun = function prioritizeAndRun(conditions, operator) {\n if (conditions.length === 0) {\n return Promise.resolve(true);\n }\n var method = Array.prototype.some;\n if (operator === 'all') {\n method = Array.prototype.every;\n }\n var orderedSets = _this3.prioritizeConditions(conditions);\n var cursor = Promise.resolve();\n // use for() loop over Array.forEach to support IE8 without polyfill\n\n var _loop = function _loop(i) {\n var set = orderedSets[i];\n var stop = false;\n cursor = cursor.then(function (setResult) {\n // after the first set succeeds, don't fire off the remaining promises\n if (operator === 'any' && setResult === true || stop) {\n (0, _debug2.default)('prioritizeAndRun::detected truthy result; skipping remaining conditions');\n stop = true;\n return true;\n }\n\n // after the first set fails, don't fire off the remaining promises\n if (operator === 'all' && setResult === false || stop) {\n (0, _debug2.default)('prioritizeAndRun::detected falsey result; skipping remaining conditions');\n stop = true;\n return false;\n }\n // all conditions passed; proceed with running next set in parallel\n return evaluateConditions(set, method);\n });\n };\n\n for (var i = 0; i < orderedSets.length; i++) {\n _loop(i);\n }\n return cursor;\n };\n\n /**\n * Runs an 'any' boolean operator on an array of conditions\n * @param {Condition[]} conditions to be evaluated\n * @return {Promise(boolean)} condition evaluation result\n */\n var any = function any(conditions) {\n return prioritizeAndRun(conditions, 'any');\n };\n\n /**\n * Runs an 'all' boolean operator on an array of conditions\n * @param {Condition[]} conditions to be evaluated\n * @return {Promise(boolean)} condition evaluation result\n */\n var all = function all(conditions) {\n return prioritizeAndRun(conditions, 'all');\n };\n\n /**\n * Emits based on rule evaluation result, and decorates ruleResult with 'result' property\n * @param {Boolean} result\n */\n var processResult = function processResult(result) {\n ruleResult.setResult(result);\n\n if (result) _this3.emit('success', ruleResult.event, almanac, ruleResult);else _this3.emit('failure', ruleResult.event, almanac, ruleResult);\n return ruleResult;\n };\n\n if (ruleResult.conditions.any) {\n return any(ruleResult.conditions.any).then(function (result) {\n return processResult(result);\n });\n } else {\n return all(ruleResult.conditions.all).then(function (result) {\n return processResult(result);\n });\n }\n }\n }]);\n\n return Rule;\n}(_events.EventEmitter);\n\nexports.default = Rule;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Operator = function () {\n /**\n * Constructor\n * @param {string} name - operator identifier\n * @param {function(factValue, jsonValue)} callback - operator evaluation method\n * @param {function} [factValueValidator] - optional validator for asserting the data type of the fact\n * @returns {Operator} - instance\n */\n function Operator(name, cb, factValueValidator) {\n _classCallCheck(this, Operator);\n\n this.name = String(name);\n if (!name) throw new Error('Missing operator name');\n if (typeof cb !== 'function') throw new Error('Missing operator callback');\n this.cb = cb;\n this.factValueValidator = factValueValidator;\n if (!this.factValueValidator) this.factValueValidator = function () {\n return true;\n };\n }\n\n /**\n * Takes the fact result and compares it to the condition 'value', using the callback\n * @param {mixed} factValue - fact result\n * @param {mixed} jsonValue - \"value\" property of the condition\n * @returns {Boolean} - whether the values pass the operator test\n */\n\n\n _createClass(Operator, [{\n key: 'evaluate',\n value: function evaluate(factValue, jsonValue) {\n return this.factValueValidator(factValue) && this.cb(factValue, jsonValue);\n }\n }]);\n\n return Operator;\n}();\n\nexports.default = Operator;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar UndefinedFactError = exports.UndefinedFactError = function (_Error) {\n _inherits(UndefinedFactError, _Error);\n\n function UndefinedFactError() {\n var _ref;\n\n _classCallCheck(this, UndefinedFactError);\n\n for (var _len = arguments.length, props = Array(_len), _key = 0; _key < _len; _key++) {\n props[_key] = arguments[_key];\n }\n\n var _this = _possibleConstructorReturn(this, (_ref = UndefinedFactError.__proto__ || Object.getPrototypeOf(UndefinedFactError)).call.apply(_ref, [this].concat(props)));\n\n _this.code = 'UNDEFINED_FACT';\n return _this;\n }\n\n return UndefinedFactError;\n}(Error);","'use strict';\nmodule.exports = function(boundThis) {\n var f = this\n , ret\n\n if (arguments.length < 2)\n ret = function() {\n if (this instanceof ret) {\n var ret_ = f.apply(this, arguments)\n return Object(ret_) === ret_\n ? ret_\n : this\n }\n else\n return f.apply(boundThis, arguments)\n }\n else {\n var boundArgs = new Array(arguments.length - 1)\n for (var i = 1; i < arguments.length; i++)\n boundArgs[i - 1] = arguments[i]\n\n ret = function() {\n var boundLen = boundArgs.length\n , args = new Array(boundLen + arguments.length)\n , i\n for (i = 0; i < boundLen; i++)\n args[i] = boundArgs[i]\n for (i = 0; i < arguments.length; i++)\n args[boundLen + i] = arguments[i]\n\n if (this instanceof ret) {\n var ret_ = f.apply(this, args)\n return Object(ret_) === ret_\n ? ret_\n : this\n }\n else\n return f.apply(boundThis, args)\n }\n }\n\n ret.prototype = f.prototype\n return ret\n}\n","'use strict'\n\n/*!\n * imports.\n */\n\nvar bind = Function.prototype.bind || require('fast-bind')\n\n/*!\n * exports.\n */\n\nmodule.exports = curry2\n\n/**\n * Curry a binary function.\n *\n * @param {Function} fn\n * Binary function to curry.\n *\n * @param {Object} [self]\n * Function `this` context.\n *\n * @return {Function|*}\n * If partially applied, return unary function, otherwise, return result of full application.\n */\n\nfunction curry2 (fn, self) {\n var out = function () {\n if (arguments.length === 0) return out\n\n return arguments.length > 1\n ? fn.apply(self, arguments)\n : bind.call(fn, self, arguments[0])\n }\n\n out.uncurry = function uncurry () {\n return fn\n }\n\n return out\n}\n","'use strict';\n\n/*!\n * exports.\n */\n\nmodule.exports = brackets2dots;\n\n/*!\n * regexp patterns.\n */\n\nvar REPLACE_BRACKETS = /\\[([^\\[\\]]+)\\]/g;\nvar LFT_RT_TRIM_DOTS = /^[.]*|[.]*$/g;\n\n/**\n * Convert string with bracket notation to dot property notation.\n *\n * ### Examples:\n *\n * brackets2dots('group[0].section.a.seat[3]')\n * //=> 'group.0.section.a.seat.3'\n *\n * brackets2dots('[0].section.a.seat[3]')\n * //=> '0.section.a.seat.3'\n *\n * brackets2dots('people[*].age')\n * //=> 'people.*.age'\n *\n * @param {String} string\n * original string\n *\n * @return {String}\n * dot/bracket-notation string\n */\n\nfunction brackets2dots(string) {\n return ({}).toString.call(string) == '[object String]'\n ? string.replace(REPLACE_BRACKETS, '.$1').replace(LFT_RT_TRIM_DOTS, '')\n : ''\n}\n","'use strict'\n\nvar toString = Object.prototype.toString\n\n/**\n * Transform dot-delimited strings to array of strings.\n *\n * @param {String} string\n * Dot-delimited string.\n *\n * @return {Array}\n * Array of strings.\n */\n\nfunction dotsplit (string) {\n var idx = -1\n var str = compact(normalize(string).split('.'))\n var end = str.length\n var out = []\n\n while (++idx < end) {\n out.push(todots(str[idx]))\n }\n\n return out\n}\n\n/**\n * Replace escapes with a placeholder.\n *\n * @param {String} string\n * Dot-delimited string.\n *\n * @return {String}\n * Dot-delimited string with placeholders in place of escapes.\n */\n\nfunction normalize (string) {\n return (toString.call(string) === '[object String]' ? string : '').replace(/\\\\\\./g, '\\uffff')\n}\n\n/**\n * Drop empty values from array.\n *\n * @param {Array} array\n * Array of strings.\n *\n * @return {Array}\n * Array of strings (empty values dropped).\n */\n\nfunction compact (arr) {\n var idx = -1\n var end = arr.length\n var out = []\n\n while (++idx < end) {\n if (arr[idx]) out.push(arr[idx])\n }\n\n return out\n}\n\n/**\n * Change placeholder to dots.\n *\n * @param {String} string\n * Dot-delimited string with placeholders.\n *\n * @return {String}\n * Dot-delimited string without placeholders.\n */\n\nfunction todots (string) {\n return string.replace(/\\uffff/g, '.')\n}\n\n/*!\n * exports.\n */\n\nmodule.exports = dotsplit\n","'use strict'\n\nconst curry2 = require('curry2')\nconst dotted = require('brackets2dots')\nconst splits = require('dotsplit.js')\nconst string = Object.prototype.toString\n\nmodule.exports = curry2(selectn)\n\n/**\n * Curried property accessor function that resolves deeply-nested object properties via dot/bracket-notation\n * string path while mitigating `TypeErrors` via friendly and composable API.\n *\n * @param {String|Array} path\n * Dot/bracket-notation string path or array.\n *\n * @param {Object} object\n * Object to access.\n *\n * @return {Function|*|undefined}\n * (1) returns `selectn/1` when partially applied.\n * (2) returns value at path if path exists.\n * (3) returns undefined if path does not exist.\n */\nfunction selectn (path, object) {\n let idx = -1\n const seg = string.call(path) === '[object Array]' ? path : splits(dotted(path))\n const end = seg.length\n let ref = end ? object : undefined\n\n while (++idx < end) {\n if (Object(ref) !== ref) return undefined\n ref = ref[seg[idx]]\n }\n\n return typeof ref === 'function' ? ref() : ref\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _fact = require('./fact');\n\nvar _fact2 = _interopRequireDefault(_fact);\n\nvar _errors = require('./errors');\n\nvar _debug = require('./debug');\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _selectn = require('selectn');\n\nvar _selectn2 = _interopRequireDefault(_selectn);\n\nvar _lodash = require('lodash.isobjectlike');\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Fact results lookup\n * Triggers fact computations and saves the results\n * A new almanac is used for every engine run()\n */\nvar Almanac = function () {\n function Almanac(factMap) {\n var runtimeFacts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, Almanac);\n\n this.factMap = new Map(factMap);\n this.factResultsCache = new Map(); // { cacheKey: Promise<factValu> }\n this.allowUndefinedFacts = Boolean(options.allowUndefinedFacts);\n\n for (var factId in runtimeFacts) {\n var fact = void 0;\n if (runtimeFacts[factId] instanceof _fact2.default) {\n fact = runtimeFacts[factId];\n } else {\n fact = new _fact2.default(factId, runtimeFacts[factId]);\n }\n\n this._addConstantFact(fact);\n (0, _debug2.default)('almanac::constructor initialized runtime fact:' + fact.id + ' with ' + fact.value + '<' + _typeof(fact.value) + '>');\n }\n }\n\n /**\n * Retrieve fact by id, raising an exception if it DNE\n * @param {String} factId\n * @return {Fact}\n */\n\n\n _createClass(Almanac, [{\n key: '_getFact',\n value: function _getFact(factId) {\n return this.factMap.get(factId);\n }\n\n /**\n * Registers fact with the almanac\n * @param {[type]} fact [description]\n */\n\n }, {\n key: '_addConstantFact',\n value: function _addConstantFact(fact) {\n this.factMap.set(fact.id, fact);\n this._setFactValue(fact, {}, fact.value);\n }\n\n /**\n * Sets the computed value of a fact\n * @param {Fact} fact\n * @param {Object} params - values for differentiating this fact value from others, used for cache key\n * @param {Mixed} value - computed value\n */\n\n }, {\n key: '_setFactValue',\n value: function _setFactValue(fact, params, value) {\n var cacheKey = fact.getCacheKey(params);\n var factValue = Promise.resolve(value);\n if (cacheKey) {\n this.factResultsCache.set(cacheKey, factValue);\n }\n return factValue;\n }\n\n /**\n * Adds a constant fact during runtime. Can be used mid-run() to add additional information\n * @param {String} fact - fact identifier\n * @param {Mixed} value - constant value of the fact\n */\n\n }, {\n key: 'addRuntimeFact',\n value: function addRuntimeFact(factId, value) {\n var fact = new _fact2.default(factId, value);\n return this._addConstantFact(fact);\n }\n\n /**\n * Returns the value of a fact, based on the given parameters. Utilizes the 'almanac' maintained\n * by the engine, which cache's fact computations based on parameters provided\n * @param {string} factId - fact identifier\n * @param {Object} params - parameters to feed into the fact. By default, these will also be used to compute the cache key\n * @param {String} path - object\n * @return {Promise} a promise which will resolve with the fact computation.\n */\n\n }, {\n key: 'factValue',\n value: function factValue(factId) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n var factValuePromise = void 0;\n var fact = this._getFact(factId);\n if (fact === undefined) {\n if (this.allowUndefinedFacts) {\n return Promise.resolve(undefined);\n } else {\n return Promise.reject(new _errors.UndefinedFactError('Undefined fact: ' + factId));\n }\n }\n if (fact.isConstant()) {\n factValuePromise = Promise.resolve(fact.calculate(params, this));\n } else {\n var cacheKey = fact.getCacheKey(params);\n var cacheVal = cacheKey && this.factResultsCache.get(cacheKey);\n if (cacheVal) {\n factValuePromise = Promise.resolve(cacheVal);\n (0, _debug2.default)('almanac::factValue cache hit for fact:' + factId);\n } else {\n (0, _debug2.default)('almanac::factValue cache miss for fact:' + factId + '; calculating');\n factValuePromise = this._setFactValue(fact, params, fact.calculate(params, this));\n }\n }\n if (path) {\n return factValuePromise.then(function (factValue) {\n if ((0, _lodash2.default)(factValue)) {\n var pathValue = (0, _selectn2.default)(path)(factValue);\n (0, _debug2.default)('condition::evaluate extracting object property ' + path + ', received: ' + pathValue);\n return pathValue;\n } else {\n (0, _debug2.default)('condition::evaluate could not compute object path(' + path + ') of non-object: ' + factValue + ' <' + (typeof factValue === 'undefined' ? 'undefined' : _typeof(factValue)) + '>; continuing with ' + factValue);\n return factValue;\n }\n });\n }\n return factValuePromise;\n }\n }]);\n\n return Almanac;\n}();\n\nexports.default = Almanac;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar SuccessEventFact = function SuccessEventFact() {\n var successTriggers = [];\n return function () {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (params.event) {\n successTriggers.push(params.event);\n }\n return successTriggers;\n };\n};\n\nexports.SuccessEventFact = SuccessEventFact;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _operator = require('./operator');\n\nvar _operator2 = _interopRequireDefault(_operator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Operators = [];\nOperators.push(new _operator2.default('equal', function (a, b) {\n return a === b;\n}));\nOperators.push(new _operator2.default('notEqual', function (a, b) {\n return a !== b;\n}));\nOperators.push(new _operator2.default('in', function (a, b) {\n return b.indexOf(a) > -1;\n}));\nOperators.push(new _operator2.default('notIn', function (a, b) {\n return b.indexOf(a) === -1;\n}));\n\nOperators.push(new _operator2.default('contains', function (a, b) {\n return a.indexOf(b) > -1;\n}, Array.isArray));\nOperators.push(new _operator2.default('doesNotContain', function (a, b) {\n return a.indexOf(b) === -1;\n}, Array.isArray));\n\nfunction numberValidator(factValue) {\n return Number.parseFloat(factValue).toString() !== 'NaN';\n}\nOperators.push(new _operator2.default('lessThan', function (a, b) {\n return a < b;\n}, numberValidator));\nOperators.push(new _operator2.default('lessThanInclusive', function (a, b) {\n return a <= b;\n}, numberValidator));\nOperators.push(new _operator2.default('greaterThan', function (a, b) {\n return a > b;\n}, numberValidator));\nOperators.push(new _operator2.default('greaterThanInclusive', function (a, b) {\n return a >= b;\n}, numberValidator));\n\nexports.default = Operators;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FINISHED = exports.RUNNING = exports.READY = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _fact = require('./fact');\n\nvar _fact2 = _interopRequireDefault(_fact);\n\nvar _rule = require('./rule');\n\nvar _rule2 = _interopRequireDefault(_rule);\n\nvar _operator = require('./operator');\n\nvar _operator2 = _interopRequireDefault(_operator);\n\nvar _almanac = require('./almanac');\n\nvar _almanac2 = _interopRequireDefault(_almanac);\n\nvar _events = require('events');\n\nvar _engineFacts = require('./engine-facts');\n\nvar _engineDefaultOperators = require('./engine-default-operators');\n\nvar _engineDefaultOperators2 = _interopRequireDefault(_engineDefaultOperators);\n\nvar _debug = require('./debug');\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar READY = exports.READY = 'READY';\nvar RUNNING = exports.RUNNING = 'RUNNING';\nvar FINISHED = exports.FINISHED = 'FINISHED';\n\nvar Engine = function (_EventEmitter) {\n _inherits(Engine, _EventEmitter);\n\n /**\n * Returns a new Engine instance\n * @param {Rule[]} rules - array of rules to initialize with\n */\n function Engine() {\n var rules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Engine);\n\n var _this = _possibleConstructorReturn(this, (Engine.__proto__ || Object.getPrototypeOf(Engine)).call(this));\n\n _this.rules = [];\n _this.allowUndefinedFacts = options.allowUndefinedFacts || false;\n _this.operators = new Map();\n _this.facts = new Map();\n _this.status = READY;\n rules.map(function (r) {\n return _this.addRule(r);\n });\n _engineDefaultOperators2.default.map(function (o) {\n return _this.addOperator(o);\n });\n return _this;\n }\n\n /**\n * Add a rule definition to the engine\n * @param {object|Rule} properties - rule definition. can be JSON representation, or instance of Rule\n * @param {integer} properties.priority (>1) - higher runs sooner.\n * @param {Object} properties.event - event to fire when rule evaluates as successful\n * @param {string} properties.event.type - name of event to emit\n * @param {string} properties.event.params - parameters to pass to the event listener\n * @param {Object} properties.conditions - conditions to evaluate when processing this rule\n */\n\n\n _createClass(Engine, [{\n key: 'addRule',\n value: function addRule(properties) {\n if (!properties) throw new Error('Engine: addRule() requires options');\n if (!properties.hasOwnProperty('conditions')) throw new Error('Engine: addRule() argument requires \"conditions\" property');\n if (!properties.hasOwnProperty('event')) throw new Error('Engine: addRule() argument requires \"event\" property');\n\n var rule = void 0;\n if (properties instanceof _rule2.default) {\n rule = properties;\n } else {\n rule = new _rule2.default(properties);\n }\n rule.setEngine(this);\n\n this.rules.push(rule);\n this.prioritizedRules = null;\n return this;\n }\n\n /**\n * Remove a rule from the engine\n * @param {object|Rule} rule - rule definition. Must be a instance of Rule\n */\n\n }, {\n key: 'removeRule',\n value: function removeRule(rule) {\n if (rule instanceof _rule2.default === false) throw new Error('Engine: removeRule() rule must be a instance of Rule');\n\n var index = this.rules.indexOf(rule);\n if (index === -1) return false;\n this.prioritizedRules = null;\n return Boolean(this.rules.splice(index, 1).length);\n }\n\n /**\n * Add a custom operator definition\n * @param {string} operatorOrName - operator identifier within the condition; i.e. instead of 'equals', 'greaterThan', etc\n * @param {function(factValue, jsonValue)} callback - the method to execute when the operator is encountered.\n */\n\n }, {\n key: 'addOperator',\n value: function addOperator(operatorOrName, cb) {\n var operator = void 0;\n if (operatorOrName instanceof _operator2.default) {\n operator = operatorOrName;\n } else {\n operator = new _operator2.default(operatorOrName, cb);\n }\n (0, _debug2.default)('engine::addOperator name:' + operator.name);\n this.operators.set(operator.name, operator);\n }\n\n /**\n * Remove a custom operator definition\n * @param {string} operatorOrName - operator identifier within the condition; i.e. instead of 'equals', 'greaterThan', etc\n * @param {function(factValue, jsonValue)} callback - the method to execute when the operator is encountered.\n */\n\n }, {\n key: 'removeOperator',\n value: function removeOperator(operatorOrName) {\n var operatorName = void 0;\n if (operatorOrName instanceof _operator2.default) {\n operatorName = operatorOrName.name;\n } else {\n operatorName = operatorOrName;\n }\n\n return this.operators.delete(operatorName);\n }\n\n /**\n * Add a fact definition to the engine. Facts are called by rules as they are evaluated.\n * @param {object|Fact} id - fact identifier or instance of Fact\n * @param {function} definitionFunc - function to be called when computing the fact value for a given rule\n * @param {Object} options - options to initialize the fact with. used when \"id\" is not a Fact instance\n */\n\n }, {\n key: 'addFact',\n value: function addFact(id, valueOrMethod, options) {\n var factId = id;\n var fact = void 0;\n if (id instanceof _fact2.default) {\n factId = id.id;\n fact = id;\n } else {\n fact = new _fact2.default(id, valueOrMethod, options);\n }\n (0, _debug2.default)('engine::addFact id:' + factId);\n this.facts.set(factId, fact);\n return this;\n }\n\n /**\n * Add a fact definition to the engine. Facts are called by rules as they are evaluated.\n * @param {object|Fact} id - fact identifier or instance of Fact\n */\n\n }, {\n key: 'removeFact',\n value: function removeFact(factOrId) {\n var factId = void 0;\n if (!(factOrId instanceof _fact2.default)) {\n factId = factOrId;\n } else {\n factId = factOrId.id;\n }\n\n return this.facts.delete(factId);\n }\n\n /**\n * Iterates over the engine rules, organizing them by highest -> lowest priority\n * @return {Rule[][]} two dimensional array of Rules.\n * Each outer array element represents a single priority(integer). Inner array is\n * all rules with that priority.\n */\n\n }, {\n key: 'prioritizeRules',\n value: function prioritizeRules() {\n if (!this.prioritizedRules) {\n var ruleSets = this.rules.reduce(function (sets, rule) {\n var priority = rule.priority;\n if (!sets[priority]) sets[priority] = [];\n sets[priority].push(rule);\n return sets;\n }, {});\n this.prioritizedRules = Object.keys(ruleSets).sort(function (a, b) {\n return Number(a) > Number(b) ? -1 : 1; // order highest priority -> lowest\n }).map(function (priority) {\n return ruleSets[priority];\n });\n }\n return this.prioritizedRules;\n }\n\n /**\n * Stops the rules engine from running the next priority set of Rules. All remaining rules will be resolved as undefined,\n * and no further events emitted. Since rules of the same priority are evaluated in parallel(not series), other rules of\n * the same priority may still emit events, even though the engine is in a \"finished\" state.\n * @return {Engine}\n */\n\n }, {\n key: 'stop',\n value: function stop() {\n this.status = FINISHED;\n return this;\n }\n\n /**\n * Returns a fact by fact-id\n * @param {string} factId - fact identifier\n * @return {Fact} fact instance, or undefined if no such fact exists\n */\n\n }, {\n key: 'getFact',\n value: function getFact(factId) {\n return this.facts.get(factId);\n }\n\n /**\n * Runs an array of rules\n * @param {Rule[]} array of rules to be evaluated\n * @return {Promise} resolves when all rules in the array have been evaluated\n */\n\n }, {\n key: 'evaluateRules',\n value: function evaluateRules(ruleArray, almanac) {\n var _this2 = this;\n\n return Promise.all(ruleArray.map(function (rule) {\n if (_this2.status !== RUNNING) {\n (0, _debug2.default)('engine::run status:' + _this2.status + '; skipping remaining rules');\n return;\n }\n return rule.evaluate(almanac).then(function (ruleResult) {\n (0, _debug2.default)('engine::run ruleResult:' + ruleResult.result);\n if (ruleResult.result) {\n _this2.emit('success', rule.event, almanac, ruleResult);\n _this2.emit(rule.event.type, rule.event.params, almanac, ruleResult);\n almanac.factValue('success-events', { event: rule.event });\n } else {\n _this2.emit('failure', rule.event, almanac, ruleResult);\n }\n });\n }));\n }\n\n /**\n * Runs the rules engine\n * @param {Object} runtimeFacts - fact values known at runtime\n * @param {Object} runOptions - run options\n * @return {Promise} resolves when the engine has completed running\n */\n\n }, {\n key: 'run',\n value: function run() {\n var _this3 = this;\n\n var runtimeFacts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n (0, _debug2.default)('engine::run started');\n (0, _debug2.default)('engine::run runtimeFacts:', runtimeFacts);\n runtimeFacts['success-events'] = new _fact2.default('success-events', (0, _engineFacts.SuccessEventFact)(), { cache: false });\n this.status = RUNNING;\n var almanac = new _almanac2.default(this.facts, runtimeFacts, { allowUndefinedFacts: this.allowUndefinedFacts });\n var orderedSets = this.prioritizeRules();\n var cursor = Promise.resolve();\n // for each rule set, evaluate in parallel,\n // before proceeding to the next priority set.\n return new Promise(function (resolve, reject) {\n orderedSets.map(function (set) {\n cursor = cursor.then(function () {\n return _this3.evaluateRules(set, almanac);\n }).catch(reject);\n return cursor;\n });\n cursor.then(function () {\n _this3.status = FINISHED;\n (0, _debug2.default)('engine::run completed');\n return almanac.factValue('success-events');\n }).then(function (events) {\n resolve({\n events: events,\n almanac: almanac\n });\n }).catch(reject);\n });\n }\n }]);\n\n return Engine;\n}(_events.EventEmitter);\n\nexports.default = Engine;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Engine = exports.Operator = exports.Rule = exports.Fact = undefined;\n\nexports.default = function (rules, options) {\n return new _engine2.default(rules, options);\n};\n\nvar _engine = require('./engine');\n\nvar _engine2 = _interopRequireDefault(_engine);\n\nvar _fact = require('./fact');\n\nvar _fact2 = _interopRequireDefault(_fact);\n\nvar _rule = require('./rule');\n\nvar _rule2 = _interopRequireDefault(_rule);\n\nvar _operator = require('./operator');\n\nvar _operator2 = _interopRequireDefault(_operator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Fact = _fact2.default;\nexports.Rule = _rule2.default;\nexports.Operator = _operator2.default;\nexports.Engine = _engine2.default;","'use strict';\n\nmodule.exports = require('./json-rules-engine');","import cookie from \"cookie\";\nimport { packlytics } from \"@pack/packlytics\";\nimport type { Pack } from \"./create-pack-client\";\nimport { isSafari } from \"./session/cookies-utils\";\nimport {\n sessionVerdict,\n sessionMarkerSetCookie,\n} from \"./audiences/visitor-recency\";\n\nexport async function handleRequest(\n pack: Pack,\n request: Request,\n handleRequest: (request: Request) => Promise<Response>,\n): Promise<Response> {\n const packHandleResponse = await pack.handleRequest(request);\n\n let response: Response;\n\n response = await packlytics(pack, request, () => {\n return handleRequest(request);\n });\n\n packHandleResponse(response);\n\n response.headers.append(\"powered-by\", \"Shopify, Hydrogen + Pack Digital\");\n response.headers.append(\"Set-Cookie\", await pack.session.commit());\n // Rolling session marker carrying the visitor's new/returning verdict for the\n // `visitor_recency` built-in. The verdict is decided once when a session\n // starts and preserved while the marker is present, refreshed every response\n // so the session lapses only after PACK_SESSION_MAX_AGE of inactivity (see\n // sessionVerdict / sessionMarkerSetCookie). Attributes mirror __pack so the\n // marker is visible wherever __pack is (incl. the cross-site customizer\n // iframe).\n const incoming = cookie.parse(request.headers.get(\"Cookie\") || \"\");\n const omitSecure =\n isSafari(request.headers.get(\"User-Agent\")) &&\n process.env.NODE_ENV === \"development\";\n response.headers.append(\n \"Set-Cookie\",\n sessionMarkerSetCookie(sessionVerdict(incoming), omitSecure),\n );\n\n if (pack.testSession && pack.testSession.hasChanges()) {\n response.headers.append(\"Set-Cookie\", await pack.testSession.commit());\n }\n\n return response;\n}\n","function sha256(ascii) {\n function rightRotate(value, amount) {\n return (value >>> amount) | (value << (32 - amount));\n }\n const mathPow = Math.pow;\n const maxWord = mathPow(2, 32);\n const lengthProperty = \"length\";\n let i, j; // Used as a counter across the whole file\n let result = \"\";\n const words = [];\n const asciiBitLength = ascii[lengthProperty] * 8;\n //* caching results is optional - remove/add slash from front of this line to toggle\n // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\n // (we actually calculate the first 64, but extra values are just ignored)\n // @ts-ignore\n let hash = (sha256.h = sha256.h || []);\n // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\n // @ts-ignore\n const k = (sha256.k = sha256.k || []);\n let primeCounter = k[lengthProperty];\n /*/\n var hash = [], k = [];\n var primeCounter = 0;\n //*/\n const isComposite = {};\n for (let candidate = 2; primeCounter < 64; candidate++) {\n // @ts-ignore\n if (!isComposite[candidate]) {\n for (i = 0; i < 313; i += candidate) {\n // @ts-ignore\n isComposite[i] = candidate;\n }\n hash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0;\n k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0;\n }\n }\n ascii += \"\\x80\"; // Append Ƈ' bit (plus zero padding)\n while ((ascii[lengthProperty] % 64) - 56)\n ascii += \"\\x00\"; // More zero padding\n for (i = 0; i < ascii[lengthProperty]; i++) {\n j = ascii.charCodeAt(i);\n if (j >> 8)\n return; // ASCII check: only accept characters in range 0-255\n words[i >> 2] |= j << (((3 - i) % 4) * 8);\n }\n words[words[lengthProperty]] = (asciiBitLength / maxWord) | 0;\n words[words[lengthProperty]] = asciiBitLength;\n // process each chunk\n for (j = 0; j < words[lengthProperty];) {\n const w = words.slice(j, (j += 16)); // The message is expanded into 64 words as part of the iteration\n const oldHash = hash;\n // This is now the undefinedworking hash\", often labelled as variables a...g\n // (we have to truncate as well, otherwise extra entries at the end accumulate\n hash = hash.slice(0, 8);\n for (i = 0; i < 64; i++) {\n const i2 = i + j;\n // Expand the message into 64 words\n // Used below if\n const w15 = w[i - 15], w2 = w[i - 2];\n // Iterate\n const a = hash[0], e = hash[4];\n const temp1 = hash[7] +\n (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + // S1\n ((e & hash[5]) ^ (~e & hash[6])) + // ch\n k[i] +\n // Expand the message schedule if needed\n (w[i] =\n i < 16\n ? w[i]\n : (w[i - 16] +\n (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) + // s0\n w[i - 7] +\n (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10))) | // s1\n 0);\n // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\n const temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + // S0\n ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj\n hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\n hash[4] = (hash[4] + temp1) | 0;\n }\n for (i = 0; i < 8; i++) {\n hash[i] = (hash[i] + oldHash[i]) | 0;\n }\n }\n for (i = 0; i < 8; i++) {\n for (j = 3; j + 1; j--) {\n const b = (hash[i] >> (j * 8)) & 255;\n result += (b < 16 ? 0 : \"\") + b.toString(16);\n }\n }\n return result;\n}\nfunction createHash(data) {\n const hash = sha256(data);\n return [\n hash?.substring(0, 8),\n hash?.substring(8, 12),\n hash?.substring(12, 16),\n hash?.substring(16, 20),\n hash?.substring(20, 32),\n ].join(\"-\");\n}\n/**\n * Generates a UUID from the user data, such as user-agent and IP Address + Salt\n * The salt is generated on the currante date + a Secret from the StoreFront,\n * So this UUID will be regenerated every day.\n *\n * We can never use this id to trace back users for GDPR compliance.\n *\n * @param data\n * @param secret\n */\nexport function getPacklyticsId(data, secret) {\n const currentDate = new Date();\n const formattedDate = currentDate.toLocaleDateString(\"en-US\");\n const salt = sha256(formattedDate + secret);\n return createHash(data + salt);\n}\n","export type Options = {\n /**\n * A validate callback that is called for each `locale`. If the `locale` is valid, return the `locale` as a string.\n * Otherwise return `undefined`, `null`, or an empty Array.\n * Should the callback throw an error, the error will be caught and the `locale` will be ignored.\n */\n validate?: (locale: string) => string | string[] | null | undefined;\n\n /**\n * If set to `true`, the wildcard locale `*` will be returned in the array.\n * If set to `false`, the wildcard locale `*` will be ignored.\n * Defaults to `true`.\n */\n ignoreWildcard?: boolean;\n};\n\nconst defaultValidate = (locale: string) => locale;\n\nexport const parseAcceptLanguage = (\n /** The value from the `Accept-Language` header.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language\n */\n languageHeaderValue: string | null | undefined,\n options: Options = {}\n): string[] => {\n if (!languageHeaderValue) return [];\n const { ignoreWildcard = true, validate = defaultValidate } = options;\n\n return languageHeaderValue\n .split(',')\n .map((lang): [number, string] => {\n const [locale, q = 'q=1'] = lang.split(';');\n const trimmedLocale = locale.trim();\n const numQ = Number(q.replace(/q ?=/, ''));\n if (isNaN(numQ)) return [0, trimmedLocale];\n return [numQ, trimmedLocale];\n })\n .sort(([q1], [q2]) => q2 - q1)\n .flatMap(([_, locale]) => {\n if (locale === '*' && ignoreWildcard) return [];\n try {\n return validate(locale) || [];\n // return Intl.DateTimeFormat.supportedLocalesOf(locale);\n } catch {\n return [];\n }\n });\n};\n","export function getHeaders(requestOrHeaders) {\n if (requestOrHeaders instanceof Request) {\n return requestOrHeaders.headers;\n }\n return requestOrHeaders;\n}\n","import { parseAcceptLanguage } from \"intl-parse-accept-language\";\nimport { getHeaders } from \"./get-headers.js\";\nexport function getClientLocales(requestOrHeaders) {\n let headers = getHeaders(requestOrHeaders);\n let acceptLanguage = headers.get(\"Accept-Language\");\n // if the header is not defined, return undefined\n if (!acceptLanguage)\n return undefined;\n let locales = parseAcceptLanguage(acceptLanguage, {\n validate: Intl.DateTimeFormat.supportedLocalesOf,\n ignoreWildcard: true,\n });\n // if there are no locales found, return undefined\n if (locales.length === 0)\n return undefined;\n // if there are multiple locales, return the array\n return locales;\n}\n","// Generic list of potential sensitive payload data\nexport const sanitizePayload = (data) => {\n let dataStr = JSON.stringify(data);\n const sensitiveFields = [\n \"username\",\n \"user\",\n \"user_id\",\n \"userid\",\n \"password\",\n \"pass\",\n \"pin\",\n \"passcode\",\n \"token\",\n \"api_token\",\n \"email\",\n \"address\",\n \"phone\",\n \"sex\",\n \"gender\",\n \"order\",\n \"order_id\",\n \"orderid\",\n \"payment\",\n \"credit_card\",\n ];\n sensitiveFields.forEach((field) => {\n dataStr = dataStr.replaceAll(new RegExp(`(\"${field}\"):(\".+?\"|\\\\d+)`, \"mgi\"), '$1:\"********\"');\n });\n return dataStr;\n};\n","import { sanitizePayload } from \"./sanatize-payload\";\nlet metadata = null;\nconst getPacklyticsMetadata = async () => {\n if (metadata)\n return;\n try {\n const response = await fetch(\"https://cdn.packlytics.packdigital.com/metadata.json\", {\n headers: {\n \"User-Agent\": \"packlytics-js\",\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n });\n if (response.ok) {\n metadata = await response.json();\n }\n else {\n console.error(\"Error getting Packlytics metadata:\", response.statusText);\n }\n }\n catch (error) {\n // @ts-ignore\n console.error(\"Error getting Packlytics metadata:\", error.message);\n }\n};\nexport const sendEvent = (storefrontId, sessionId) => {\n return async (action, eventPayload) => {\n const sanitizedEventPayload = sanitizePayload({\n ...eventPayload,\n });\n await getPacklyticsMetadata();\n if (!metadata) {\n console.warn(\"Pack event not sent: packlytics medatada is missing\");\n return;\n }\n // implement localization and add EU\n const analyticsData = metadata[\"us\"] || metadata[\"default\"];\n if (!analyticsData.token) {\n console.warn(\"Pack event not sent: api token is missing\");\n return;\n }\n const dataSourceName = metadata[\"dataSourceName\"] || \"analytics_events\";\n const endpointUrl = `${analyticsData.endpoint}/${analyticsData.version}/events?name=${dataSourceName}`;\n // qualified event data with payload and session id\n const eventData = {\n timestamp: new Date().toISOString(),\n action,\n version: \"1\",\n storefront_id: storefrontId || \"unknown\",\n session_id: sessionId,\n payload: sanitizedEventPayload,\n };\n return fetch(endpointUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${analyticsData.token}`,\n },\n body: JSON.stringify(eventData),\n });\n };\n};\n","import { sendEvent } from \"./send-event\";\nexport const trackPageHit = (storefrontId, sessionId) => {\n return (eventPayload = {}) => {\n return sendEvent(storefrontId, sessionId)(\"page_hit\", eventPayload);\n };\n};\n","import parser from \"ua-parser-js\";\nexport function getDevice(userAgent) {\n const userAgentData = parser(userAgent);\n return {\n deviceType: userAgentData.device.type || \"desktop\",\n deviceModel: userAgentData.device.model || \"unknown\",\n deviceVendor: userAgentData.device.vendor || \"unknown\",\n os: userAgentData.os.name || \"unknown\",\n osVersion: userAgentData.os.version || \"unknown\",\n browser: userAgentData.browser.name || \"unknown\",\n browserVersion: userAgentData.browser.version || \"unknown\",\n engine: userAgentData.engine.name || \"unknown\",\n engineVersion: userAgentData.engine.version || \"unknown\",\n cpu: userAgentData.cpu.architecture || \"unknown\",\n };\n}\n","import { getPacklyticsId } from \"./utils/get-packlytics-id\";\nimport { getClientLocales } from \"./utils/get-client-locales\";\nimport { trackPageHit } from \"./utils/page-hit\";\nimport { getDevice } from \"./utils/get-client-device\";\nimport { getStorefrontHeaders } from \"@shopify/hydrogen/oxygen\";\nimport { getClientLocation } from \"./utils/get-client-location\";\nexport async function sendEvent(request, session, params) {\n if (process.env.NODE_ENV === \"development\") {\n return;\n }\n // Preview enabled\n if (!!session.get(\"previewEnabled\")) {\n return;\n }\n const payload = await request.json();\n const url = new URL(request.url);\n const ipaddress = getStorefrontHeaders(request)[\"buyerIp\"] || \"\";\n const dataToHash = `${request.headers.get(\"user-agent\")}${ipaddress}${url.hostname}`;\n const packlyticsId = getPacklyticsId(dataToHash, params.sessionSecret);\n const locale = getClientLocales(request) || [\"en-US\"];\n const location = getClientLocation(payload.locale || locale[0]);\n return trackPageHit(params.storefrontId, packlyticsId)({\n \"pack-session-id\": session.id, // This session ID is saved on the __pack cookie\n \"user-agent\": payload.userAgent || request.headers.get(\"user-agent\") || \"\",\n pathname: payload.pathname,\n query: payload.query,\n screen: payload.screen,\n referrer: payload.referrer,\n hostname: payload.hostname,\n ipaddress: ipaddress,\n userTimeZone: payload.userTimeZone,\n language: payload.language || getClientLocales(request) || \"\",\n locale: payload.locale || locale[0],\n location: location,\n connection: payload.connection || request.headers.get(\"connection\") || \"\",\n deviceCategory: payload.deviceCategory || \"\",\n href: payload.href || request.url,\n ...getDevice(request.headers.get(\"user-agent\") || \"\"),\n });\n}\nexport async function packlytics(pack, request, next) {\n const url = new URL(request.url);\n if (url.pathname.endsWith(\"/pack/track\") && request.method === \"POST\") {\n try {\n await sendEvent(request, pack.session, {\n storefrontId: pack.getPackSessionData().storeId,\n sessionSecret: pack.session.secret,\n });\n }\n catch (err) { }\n return new Response(JSON.stringify({ response: \"ok\" }));\n }\n return next();\n}\n","export function getClientLocation(locale) {\n const localeSplit = locale.split(\"-\");\n return localeSplit.length > 1 ? localeSplit[1].toLowerCase() : \"\";\n}\n","export const PACK_COOKIE_ID = \"__pack\";\nexport const PACK_USER_CONSENT_COOKIE_ID = \"__pack_user_consent\";\nexport const PACK_TEST_COOKIE_ID = \"__pack_test\";\nexport const PACK_COOKIE_MAX_AGE = 60 * 60 * 24 * 360; // 1 year\n// Short rolling session marker for new-vs-returning. Carries the verdict\n// decided when the session starts — \"r\" (returning) or \"n\" (new) — which the\n// persistent __pack cookie can't, since it lasts a year and can't tell a first\n// session from a later one. Refreshed on every response (GA-style inactivity\n// session), preserving its value so the verdict is stable across page views.\nexport const PACK_SESSION_COOKIE_ID = \"__pack_s\";\nexport const PACK_SESSION_MAX_AGE = 30 * 60; // 30 minutes\n","import { PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\n\nimport cookie from \"cookie\";\n\nconst tokenHash = \"xxxx-4xxx-xxxx-xxxxxxxxxxxx\";\n\n// Safari (incl. iOS) doesn't treat http://localhost as a secure context, so it\n// drops `Secure` cookies in local dev. The Pack cookies omit `Secure` for that\n// case; shared here so session.ts, test-session.ts, and handle-request use one\n// definition instead of separate copies.\nexport function isSafari(userAgent: string | null): boolean {\n if (!userAgent) return false;\n\n return (\n /Safari\\//.test(userAgent) &&\n !/Chrome\\//.test(userAgent) &&\n !/Chromium\\//.test(userAgent) &&\n !/Edg\\//.test(userAgent) &&\n !/Firefox\\//.test(userAgent)\n );\n}\n\nexport function hasUserConsent(request: Request) {\n // Guard the null header: the `cookie` package throws on non-string input, so\n // a cookie-less request would otherwise crash here (and in session.ts).\n const cookies = cookie.parse(request.headers.get(\"Cookie\") || \"\");\n\n return cookies[PACK_USER_CONSENT_COOKIE_ID]\n ? cookies[PACK_USER_CONSENT_COOKIE_ID] === \"true\"\n : true;\n}\n\n/**\n * This will generate a random UUID\n * This is not based on user data,\n * This is based on a random number generator using crypto or math.random\n *\n * This UUID is used to generate a session ID for the session cookie\n *\n * We can never use this id to trace back users for GDPR compliance.\n *\n */\nexport function buildRandomUUID(): string {\n let hash = \"\";\n\n try {\n const crypto: Crypto = window.crypto;\n const randomValuesArray = new Uint16Array(31);\n crypto.getRandomValues(randomValuesArray);\n\n // Generate a strong UUID\n let i = 0;\n hash = tokenHash.replace(/[x]/g, (c: string): string => {\n const r = randomValuesArray[i] % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n i++;\n return v.toString(16);\n });\n } catch (err) {\n // crypto not available, generate weak UUID\n hash = tokenHash.replace(/[x]/g, (c: string): string => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n return `${hexTime()}-${hash}`;\n}\n\nfunction hexTime(): string {\n // 32 bit representations of new Date().getTime() and performance.now()\n let dateNumber = 0;\n let perfNumber = 0;\n\n // Result of zero-fill right shift is always positive\n dateNumber = new Date().getTime() >>> 0;\n\n try {\n perfNumber = performance.now() >>> 0;\n } catch (err) {\n perfNumber = 0;\n }\n\n const output = Math.abs(dateNumber + perfNumber)\n .toString(16)\n .toLowerCase();\n\n // Ensure the output is exactly 8 characters\n return output?.substring(0, 8).padStart(8, \"0\");\n}\n","import {\n PACK_COOKIE_ID,\n PACK_TEST_COOKIE_ID,\n PACK_SESSION_COOKIE_ID,\n PACK_SESSION_MAX_AGE,\n} from \"../constants\";\n\n// Shared new-vs-returning (`visitor_recency`) logic. The verdict WRITER\n// (handle-request, which sets __pack_s on every response) and the READER (the\n// built-in evaluator) both import from here so the two halves can't drift on how\n// the marker is produced or interpreted. Conceptually mirrored in backpack's\n// built-in definitions.\n\n// Persistent \"seen before\" markers — Pack's own cookies (__pack lasts a year),\n// then GA4 / Shopify. Presence means a prior visit at some point.\nexport const PRIOR_VISIT_COOKIES = [\n PACK_COOKIE_ID,\n PACK_TEST_COOKIE_ID,\n \"_ga\",\n \"_shopify_y\",\n];\n\n// The verdict carried by __pack_s, decided once when a session starts.\nexport type SessionVerdict = \"r\" | \"n\"; // returning | new\n\n// Decide the session's verdict from the incoming cookies: preserve a valid\n// stored verdict (so it stays stable across a session's page views); otherwise\n// — a new session, or an unrecognized/tampered value — decide from the\n// prior-visit cookies.\nexport function sessionVerdict(\n incoming: Record<string, string | undefined>,\n): SessionVerdict {\n const stored = incoming[PACK_SESSION_COOKIE_ID];\n if (stored === \"r\" || stored === \"n\") return stored;\n return PRIOR_VISIT_COOKIES.some((name) => incoming[name]) ? \"r\" : \"n\";\n}\n\n// Set-Cookie for the rolling session marker. Mirrors __pack's cross-site\n// attributes (`SameSite=None`) so the marker has the SAME visibility as __pack:\n// otherwise it's dropped inside the cross-site customizer iframe while __pack\n// survives, and the reader — seeing no marker but a prior-visit cookie — falls\n// back to \"returning\" for every visitor. `omitSecure` matches __pack's Safari +\n// local-dev exception (Safari won't store `Secure` cookies on http://localhost).\nexport function sessionMarkerSetCookie(\n verdict: SessionVerdict,\n omitSecure: boolean,\n): string {\n return `${PACK_SESSION_COOKIE_ID}=${verdict}; Path=/; Max-Age=${PACK_SESSION_MAX_AGE}; SameSite=None${\n omitSecure ? \"\" : \"; Secure\"\n }`;\n}\n","import { useEffect } from \"react\";\nimport { serialize } from \"cookie\";\nimport { PACK_COOKIE_MAX_AGE, PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\n\ntype UsePackCookiesOptions = {\n /**\n * If set to `false`, Shopify cookies will be removed.\n * If set to `true`, Shopify unique user token cookie will have cookie expiry of 1 year.\n * Defaults to false.\n **/\n hasUserConsent?: boolean;\n /**\n * The domain scope of the cookie. Defaults to empty string.\n **/\n domain?: string;\n};\n\nexport function usePackCookies(options?: UsePackCookiesOptions): void {\n const { hasUserConsent = true, domain = \"\" } = options || {};\n\n useEffect(() => {\n setCookie(\n PACK_USER_CONSENT_COOKIE_ID,\n hasUserConsent ? \"true\" : \"false\",\n PACK_COOKIE_MAX_AGE,\n domain,\n );\n }, [hasUserConsent]);\n}\n\nfunction setCookie(\n name: string,\n value: string,\n maxage: number,\n domain: string,\n): void {\n document.cookie = serialize(name, value, {\n maxAge: maxage,\n domain,\n sameSite: \"lax\",\n path: \"/\",\n });\n}\n","import {\n createCookie,\n createCookieSessionStorage,\n type Session,\n type SessionStorage,\n} from \"react-router\";\nimport { PACK_COOKIE_ID, PACK_COOKIE_MAX_AGE } from \"../constants\";\nimport { buildRandomUUID, hasUserConsent, isSafari } from \"./cookies-utils\";\n\nexport class PackSession {\n readonly id: string;\n\n readonly secret: string;\n\n readonly #session: Session;\n\n #sessionStorage: SessionStorage;\n\n constructor(\n id: string,\n secret: string,\n sessionStorage: SessionStorage,\n session: Session\n ) {\n this.id = id;\n this.secret = secret;\n this.#session = session;\n this.#sessionStorage = sessionStorage;\n }\n\n static async init(request: Request, secrets: string[]): Promise<PackSession> {\n const userAgent = request.headers.get(\"User-Agent\");\n\n const storage = createCookieSessionStorage({\n cookie: createCookie(PACK_COOKIE_ID, {\n secure:\n isSafari(userAgent) && process.env.NODE_ENV === \"development\"\n ? false\n : true,\n secrets,\n sameSite: \"none\",\n maxAge: PACK_COOKIE_MAX_AGE,\n }),\n });\n\n const session = await storage.getSession(request.headers.get(\"Cookie\"));\n\n let sessionId = session.get(\"session_id\");\n\n if (!sessionId || !hasUserConsent(request)) {\n sessionId = buildRandomUUID();\n session.set(\"session_id\", sessionId);\n }\n\n return new this(sessionId, secrets[0], storage, session);\n }\n\n has(key: string): boolean {\n return this.#session.has(key);\n }\n\n get(key: string) {\n return this.#session.get(key);\n }\n\n destroy(): Promise<string> {\n for (const key of Object.keys(this.#session.data)) {\n this.#session.unset(key);\n }\n\n return this.#sessionStorage.destroySession(this.#session);\n }\n\n set(key: string, value: any): void {\n this.#session.set(key, value);\n }\n\n commit(): Promise<string> {\n return this.#sessionStorage.commitSession(this.#session);\n }\n}\n","import {\n createCookie,\n createCookieSessionStorage,\n type Session,\n type SessionStorage,\n} from \"react-router\";\nimport { Test } from \"../tests/test\";\nimport { PACK_COOKIE_MAX_AGE, PACK_TEST_COOKIE_ID } from \"../constants\";\nimport { isSafari } from \"./cookies-utils\";\nimport createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:test-session\");\n\nexport class PackTestSession {\n readonly id: string;\n readonly #session: Session;\n #sessionStorage: SessionStorage;\n #isDirty: boolean = false;\n #initialData: { \n test_data?: Test; \n test_expire_at?: string;\n test_rules_cache?: any[];\n test_rules_cache_timestamp?: number;\n } = {};\n\n constructor(id: string, sessionStorage: SessionStorage, session: Session) {\n this.id = id;\n this.#session = session;\n this.#sessionStorage = sessionStorage;\n\n // Store initial state to track changes\n this.#initialData = {\n test_data: this.#session.get(\"test_data\"),\n test_expire_at: this.#session.get(\"test_expire_at\"),\n test_rules_cache: this.#session.get(\"test_rules_cache\"),\n test_rules_cache_timestamp: this.#session.get(\"test_rules_cache_timestamp\"),\n };\n }\n\n static async init(\n request: Request,\n secrets: string[]\n ): Promise<PackTestSession> {\n const userAgent = request.headers.get(\"User-Agent\");\n debug(\"[PackTestSession.init] Initializing test session\", {\n hasSecrets: secrets.length > 0,\n userAgent: userAgent?.substring(0, 50),\n });\n\n const storage = createCookieSessionStorage({\n cookie: createCookie(PACK_TEST_COOKIE_ID, {\n secure:\n isSafari(userAgent) && process.env.NODE_ENV === \"development\"\n ? false\n : true,\n secrets,\n sameSite: \"lax\",\n maxAge: PACK_COOKIE_MAX_AGE,\n path: \"/\",\n }),\n });\n\n const session = await storage.getSession(request.headers.get(\"Cookie\"));\n let sessionId = session.get(\"test_session_id\");\n\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n session.set(\"test_session_id\", sessionId);\n debug(\"[PackTestSession.init] Generated new session ID\", { sessionId });\n } else {\n debug(\"[PackTestSession.init] Using existing session ID\", { sessionId });\n }\n\n return new this(sessionId, storage, session);\n }\n\n getTestData(): Test | undefined {\n const testData = this.#session.get(\"test_data\");\n debug('[getTestData] Called', {\n sessionId: this.id,\n hasTestData: !!testData,\n hasIsFirstExposure: testData && 'isFirstExposure' in testData,\n isFirstExposure: testData ? (testData as any).isFirstExposure : undefined,\n testId: testData?.id,\n testHandle: testData?.handle,\n });\n \n if (testData && 'isFirstExposure' in testData) {\n // Strip isFirstExposure flag from stored session data and re-save clean data\n const { isFirstExposure, ...cleanTestData } = testData as any;\n debug('[getTestData] Cleaning session data, removing isFirstExposure flag', {\n sessionId: this.id,\n isFirstExposure,\n });\n this.#session.set(\"test_data\", cleanTestData);\n this.#isDirty = true;\n return cleanTestData;\n }\n return testData;\n }\n\n getExpireAt(): string | undefined {\n return this.#session.get(\"test_expire_at\");\n }\n\n setTestData(testData: Test | undefined): void {\n debug('[setTestData] Setting test data', {\n sessionId: this.id,\n testId: testData?.id,\n testHandle: testData?.handle,\n variantId: testData?.testVariant?.id,\n variantHandle: testData?.testVariant?.handle,\n });\n this.#isDirty = true;\n this.#session.set(\"test_data\", testData);\n }\n\n setExpireAt(expireAt: string | undefined): void {\n debug('[setExpireAt] Setting expiry', {\n sessionId: this.id,\n expireAt,\n });\n this.#isDirty = true;\n this.#session.set(\"test_expire_at\", expireAt);\n }\n\n clearTestData(): void {\n debug('[clearTestData] Clearing test data and expiry', {\n sessionId: this.id,\n });\n this.#isDirty = true;\n this.#session.unset(\"test_data\");\n this.#session.unset(\"test_expire_at\");\n }\n\n hasTestData(): boolean {\n return this.#session.has(\"test_data\");\n }\n\n // Test rules cache methods\n getTestRulesCache(): any[] | undefined {\n return this.#session.get(\"test_rules_cache\");\n }\n\n getTestRulesCacheTimestamp(): number | undefined {\n return this.#session.get(\"test_rules_cache_timestamp\");\n }\n\n setTestRulesCache(rules: any[], timestamp: number): void {\n debug('[setTestRulesCache] Caching test rules', {\n sessionId: this.id,\n rulesCount: rules.length,\n timestamp: new Date(timestamp).toISOString(),\n });\n this.#isDirty = true;\n this.#session.set(\"test_rules_cache\", rules);\n this.#session.set(\"test_rules_cache_timestamp\", timestamp);\n }\n\n clearTestRulesCache(): void {\n debug('[clearTestRulesCache] Clearing rules cache', {\n sessionId: this.id,\n });\n this.#isDirty = true;\n this.#session.unset(\"test_rules_cache\");\n this.#session.unset(\"test_rules_cache_timestamp\");\n }\n\n isTestRulesCacheValid(cacheDurationMs: number = 60 * 60 * 1000): boolean {\n const timestamp = this.getTestRulesCacheTimestamp();\n if (!timestamp) {\n debug('[isTestRulesCacheValid] No cache timestamp found', {\n sessionId: this.id,\n });\n return false;\n }\n \n const isValid = Date.now() - timestamp < cacheDurationMs;\n debug('[isTestRulesCacheValid] Cache validity check', {\n sessionId: this.id,\n isValid,\n cacheAge: Math.floor((Date.now() - timestamp) / 1000) + 's',\n maxAge: Math.floor(cacheDurationMs / 1000) + 's',\n });\n return isValid;\n }\n\n hasChanges(): boolean {\n // Check if data has actually changed\n const currentTestData = this.getTestData();\n const currentExpireAt = this.getExpireAt();\n const currentTestRulesCache = this.getTestRulesCache();\n const currentTestRulesCacheTimestamp = this.getTestRulesCacheTimestamp();\n\n // Compare with initial state\n const testDataChanged =\n JSON.stringify(currentTestData) !==\n JSON.stringify(this.#initialData.test_data);\n const expireAtChanged =\n currentExpireAt !== this.#initialData.test_expire_at;\n const testRulesCacheChanged =\n JSON.stringify(currentTestRulesCache) !==\n JSON.stringify(this.#initialData.test_rules_cache);\n const testRulesCacheTimestampChanged =\n currentTestRulesCacheTimestamp !== this.#initialData.test_rules_cache_timestamp;\n\n const hasChanges = testDataChanged || expireAtChanged || testRulesCacheChanged || testRulesCacheTimestampChanged || this.#isDirty;\n \n debug('[hasChanges] Checking for changes', {\n sessionId: this.id,\n hasChanges,\n testDataChanged,\n expireAtChanged,\n testRulesCacheChanged,\n testRulesCacheTimestampChanged,\n isDirty: this.#isDirty,\n });\n\n return hasChanges;\n }\n\n commit(): Promise<string> {\n debug('[commit] Committing session', {\n sessionId: this.id,\n isDirty: this.#isDirty,\n hasTestData: !!this.getTestData(),\n });\n // Reset dirty flag after commit\n this.#isDirty = false;\n\n // Update initial data to current state\n this.#initialData = {\n test_data: this.getTestData(),\n test_expire_at: this.getExpireAt(),\n test_rules_cache: this.getTestRulesCache(),\n test_rules_cache_timestamp: this.getTestRulesCacheTimestamp(),\n };\n\n return this.#sessionStorage.commitSession(this.#session);\n }\n\n destroy(): Promise<string> {\n debug('[destroy] Destroying session', {\n sessionId: this.id,\n });\n this.#isDirty = true;\n this.#session.unset(\"test_data\");\n this.#session.unset(\"test_expire_at\");\n this.#session.unset(\"test_rules_cache\");\n this.#session.unset(\"test_rules_cache_timestamp\");\n return this.#sessionStorage.destroySession(this.#session);\n }\n}\n","import { PackClient } from \"@pack/client\";\nimport { CacheCustom, createWithCache } from \"@shopify/hydrogen\";\nimport * as cookie from \"cookie\";\nimport { PackSession } from \"./session/session\";\nimport { PackTestSession } from \"./session/test-session\";\nimport {\n getTestInfo,\n getTestFromQueryParams,\n getTestSession,\n getTestTargetingAttributesFromRequest,\n hasCompleteTestInput,\n setTestHeaders,\n Test,\n TestInput,\n TestInfo,\n} from \"./tests/test\";\nimport createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:create-pack-client\");\n\n/** @see https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/cache#caching-strategies */\ntype CachingStrategy = ReturnType<typeof CacheCustom>;\n\ninterface EnvironmentOptions {\n /**\n * A Cache API instance.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Cache\n */\n cache: Cache;\n /**\n * A runtime utility for serverless environments\n * @see https://developers.cloudflare.com/workers/runtime-apis/fetch-event/#waituntil\n */\n waitUntil: ExecutionContext[\"waitUntil\"];\n}\n\ninterface I18nOptions {\n language: string;\n country: string;\n}\n\nexport interface CreatePackClientOptions extends EnvironmentOptions {\n apiUrl?: string;\n token?: string;\n storeId?: string;\n session: PackSession;\n testSession: PackTestSession;\n contentEnvironment?: string;\n i18n?: I18nOptions;\n /** Default theme data to use when no token is provided */\n defaultThemeData?: DefaultThemeData;\n /**\n * Initial request to extract query parameters from.\n * If not provided, it will be captured from the first handleRequest call.\n * @deprecated Pass request to handleRequest instead of createPackClient\n */\n request?: Request;\n}\n\ntype Variables = Record<string, any>;\n\ninterface QueryOptions {\n variables?: Variables;\n cache?: CachingStrategy;\n test?: TestInput;\n}\n\ninterface QueryError {\n message: string;\n param?: string;\n code?: string;\n type: string;\n}\n\ninterface QueryResponse<T> {\n data: T | null;\n error: QueryError | null;\n packTestInfo?: Test;\n}\n\nexport interface PackCustomizerMeta {\n environment?: string;\n overlay?: {\n src?: string;\n version?: string;\n };\n previewContext?: {\n linkName?: string;\n locale?: string;\n releaseId?: string;\n releaseName?: string;\n pageDraft?: string;\n siteSettingsDraft?: string;\n testHandle?: string;\n testVariantHandle?: string;\n };\n [key: string]: any;\n}\n\nexport interface Pack {\n abTest: Test | null | undefined;\n /**\n * @deprecated The method should not be used\n */\n getPackSessionData(): {\n storeId: string;\n sessionId: string;\n abTest: Test | null | undefined;\n isPreviewModeEnabled: boolean;\n customizerMeta: any;\n };\n getPackContextData(): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n };\n handleRequest(request: Request): Promise<(response: Response) => void>;\n isPreviewModeEnabled: () => boolean;\n isValidEditToken: PackClient[\"isValidEditToken\"];\n query: <T = any>(\n query: string,\n options: QueryOptions,\n ) => Promise<QueryResponse<T>>;\n session: PackSession;\n testSession: PackTestSession;\n}\n\ninterface DefaultThemeData {\n data: Record<string, any>;\n}\n\n/**\n * Create an SHA-256 hash as a hex string\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string\n */\nasync function sha256(message: string): Promise<string> {\n // encode as UTF-8\n const messageBuffer = new TextEncoder().encode(message);\n // hash the message\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", messageBuffer);\n // convert bytes to hex string\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Hash query and its parameters for use as cache key.\n * NOTE: Oxygen deployment will break if the cache key is long or contains `\\n`\n */\nfunction hashQuery(\n query: string,\n variables?: Variables,\n headers?: {},\n): Promise<string> {\n let hash = query;\n if (variables !== null) hash += JSON.stringify(variables);\n if (headers !== null) hash += JSON.stringify(headers);\n\n return sha256(hash);\n}\n\nasync function getCacheKey(\n withCache: ReturnType<typeof createWithCache>,\n query: string,\n token: string,\n options: {\n variables?: Variables;\n headers?: {};\n },\n) {\n let queryHash = await hashQuery(query, options?.variables, options?.headers);\n\n let publishedAt;\n try {\n const resp = await withCache.run<{ publishedAt?: string } | null>(\n {\n cacheKey: [\"pack:content:publishedAt\"],\n cacheStrategy: CacheCustom({\n maxAge: 15,\n staleWhileRevalidate: 15,\n }),\n shouldCacheResult: (value) => value !== null,\n },\n async ({ addDebugData }): Promise<{ publishedAt?: string } | null> => {\n const URL =\n \"https://cache-check-production.packdigital.workers.dev/published-at\";\n const resp = await fetch(URL, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n addDebugData?.({\n displayName: \"Pack Cache Check\",\n response: resp,\n });\n\n const { status } = resp;\n if (status !== 200) {\n let message;\n\n if (status === 401) {\n message =\n \"Pack error: Unauthorized request to cache check service. Please check your token.\";\n } else {\n message = `Pack error: Request to cache check service failed with status ${status}`;\n }\n\n debug(`Cache check error: ${message}`);\n console.error(message);\n return null;\n }\n\n return resp.json();\n },\n );\n\n publishedAt = resp?.publishedAt;\n } catch (err) {\n debug(`Error getting cache key: ${err}`);\n console.error(err);\n }\n\n if (publishedAt) {\n return `${queryHash}:${publishedAt}`;\n }\n\n return queryHash;\n}\n\n// Extends the CacheLong strategy with a stale-if-error policy\nconst cacheCustom = CacheCustom({\n maxAge: 3600,\n staleWhileRevalidate: 82800,\n staleIfError: 86400, // 1 day\n});\n\n/** Resolves the default data for a given query based on the theme config */\nfunction resolveQuery({\n query,\n variables,\n defaultThemeData,\n}: {\n query: string;\n variables?: Variables;\n defaultThemeData: DefaultThemeData;\n}): any {\n const queryField = extractTopLevelField(query);\n const identifier = variables?.handle || variables?.id;\n\n const defaultDataForField = defaultThemeData.data[queryField];\n if (!defaultDataForField) {\n return null;\n }\n\n return {\n [queryField]: identifier\n ? defaultDataForField[identifier]\n : defaultDataForField,\n };\n}\n\n/**\n * Extracts the top-level field from a GraphQL query string.\n *\n * The function assumes that the query follows the standard GraphQL syntax\n * and expects the top-level field to be the first field in the query.\n *\n * @example\n * const query = `\n * query GetProduct($id: ID!) {\n * product(id: $id) {\n * id\n * name\n * }\n * }\n * `;\n * const topLevelField = extractTopLevelField(query);\n * console.log(topLevelField); // Output: \"product\"\n */\nfunction extractTopLevelField(query: string): string {\n const match = query.match(/\\{[^{]*?\\w+(?=\\(|:|\\s*\\{)/);\n if (match) {\n return match[0].slice(1).trim();\n }\n return \"\";\n}\n\nexport function createPackClient(options: CreatePackClientOptions): Pack {\n const {\n cache,\n waitUntil,\n session,\n testSession,\n contentEnvironment,\n storeId,\n token,\n apiUrl,\n defaultThemeData,\n i18n,\n request,\n } = options;\n\n const previewEnabled = !!session.get(\"previewEnabled\");\n const previewEnvironment = session.get(\"environment\");\n const locale = session.get(\"locale\");\n const releaseId = session.get(\"releaseId\");\n const pageDraft = session.get(\"pageDraft\");\n const siteSettingsDraft = session.get(\"siteSettingsDraft\");\n const testHandle = session.get(\"testHandle\");\n const testVariantHandle = session.get(\"testVariantHandle\");\n\n const clientContentEnvironment = previewEnvironment || contentEnvironment;\n\n let packClient: PackClient;\n let testInfoForRequest: TestInfo | undefined = undefined;\n let testInfoPromise: Promise<TestInfo | undefined> | undefined = undefined;\n let currentRequest: Request | undefined = request;\n let testFromQueryParams: TestInput | null = request\n ? getTestFromQueryParams(request)\n : null;\n\n // In preview/customizer mode the selected A/B test is carried on the Pack\n // session (set by the preview loader from customizerMeta.previewContext) and\n // today only drives CMS content resolution. Surface it through pack.abTest as\n // well so code-driven storefront variants render the previewed variant —\n // matching the live site. Requires BOTH handles so a content-only or control\n // preview does not fabricate a fake test.\n const testFromPreviewSession: TestInput | null =\n previewEnabled && testHandle && testVariantHandle\n ? { testId: \"\", testHandle, testVariantId: \"\", testVariantHandle }\n : null;\n\n // Prefer a complete test from URL query params, otherwise fall back to the\n // selected preview-session test. Evaluated lazily so query params captured in\n // handleRequest are honored.\n const getExplicitTestForSession = (): TestInput | null =>\n hasCompleteTestInput(testFromQueryParams)\n ? testFromQueryParams\n : testFromPreviewSession;\n\n const getCurrentAbTest = (): Test | null | undefined =>\n getTestSession(testSession, getExplicitTestForSession(), previewEnabled);\n\n if (!token && !defaultThemeData) {\n throw new Error(\n \"ERR_HY_MISSING_TOKEN: The Pack client token is missing or empty. Please provide a valid token or default theme data. Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_TOKEN\",\n );\n }\n\n if (!storeId) {\n throw new Error(\n \"ERR_HY_MISSING_STORE_ID: The Pack Store ID is missing or empty. Please provide a valid Store ID. Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_STORE_ID\",\n );\n }\n\n const handleRequest = async (request: Request) => {\n // Store the request for use in query() if not already provided\n if (!currentRequest) {\n currentRequest = request;\n testFromQueryParams = getTestFromQueryParams(request);\n }\n\n return (response: Response) => {\n const hasExposedTestCookie = request.headers\n .get(\"cookie\")\n ?.includes(\"exposedTest\");\n\n if (hasExposedTestCookie) {\n // Clear the exposedTest cookie\n response.headers.append(\n \"Set-Cookie\",\n cookie.serialize(\"exposedTest\", \"\", {\n maxAge: 0,\n expires: new Date(0),\n path: \"/\",\n }),\n );\n }\n };\n };\n\n if (!token) {\n return {\n get abTest() {\n return getCurrentAbTest();\n },\n handleRequest,\n getPackSessionData: () => {\n return {\n storeId: storeId,\n sessionId: session.id,\n abTest: getCurrentAbTest(),\n isPreviewModeEnabled: previewEnabled,\n customizerMeta: session.get(\"customizerMeta\"),\n };\n },\n getPackContextData: (): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n } => {\n return {\n packStoreId: storeId,\n packSessionId: session.id,\n packAbTest: getCurrentAbTest(),\n packIsPreviewMode: previewEnabled,\n packCustomizerMeta: session.get(\"customizerMeta\"),\n };\n },\n isPreviewModeEnabled: () => previewEnabled,\n isValidEditToken: () => new Promise(() => false),\n async query<T = any>(\n query: string,\n { variables }: QueryOptions = {},\n ): Promise<QueryResponse<T>> {\n if (!defaultThemeData?.data) {\n debug(\"Warning: Invalid default theme data provided to Pack client\");\n console.warn(\"Invalid default theme data provided to Pack client.\");\n return { data: null, error: null };\n }\n\n const data = resolveQuery({ query, variables, defaultThemeData });\n\n return { data: data as T, error: null };\n },\n session,\n testSession,\n };\n }\n\n const resolvedApiUrl = apiUrl\n ? apiUrl\n : previewEnabled || process.env.NODE_ENV === \"development\"\n ? \"https://app.packdigital.com/graphql\"\n : undefined;\n\n packClient = new PackClient({\n // Use apiUrl, it is configured\n // Use active API URL if preview mode is enabled\n // Otherwise, Live PackClient uses its internal configuration\n apiUrl: resolvedApiUrl,\n storeId,\n token,\n contentEnvironment: clientContentEnvironment,\n sessionId: session.id,\n clientName: \"HydrogenClient\",\n locale,\n releaseId,\n pageDraft,\n siteSettingsDraft,\n testHandle,\n testVariantHandle,\n // When in preview mode, ignore test status to allow previewing draft tests\n ignoreTestStatus: previewEnabled,\n });\n\n return {\n get abTest() {\n return getCurrentAbTest();\n },\n getPackSessionData: () => {\n return {\n storeId: storeId,\n sessionId: session.id,\n abTest: getCurrentAbTest(),\n isPreviewModeEnabled: previewEnabled,\n customizerMeta: session.get(\"customizerMeta\"),\n };\n },\n getPackContextData: (): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n } => {\n return {\n packStoreId: storeId,\n packSessionId: session.id,\n packAbTest: getCurrentAbTest(),\n packIsPreviewMode: previewEnabled,\n packCustomizerMeta: session.get(\"customizerMeta\"),\n };\n },\n handleRequest,\n isPreviewModeEnabled: () => previewEnabled,\n isValidEditToken: (token: string | null) =>\n packClient.isValidEditToken(token),\n async query<T = any>(\n query: string,\n { variables, cache: strategy = cacheCustom, test }: QueryOptions = {},\n ): Promise<QueryResponse<T>> {\n try {\n let headers: any = {};\n let testInfoForLoader: Test | undefined = undefined;\n\n const withCache = createWithCache({\n cache,\n waitUntil,\n request: new Request(\"https://pack.local/cache\", { method: \"GET\" }),\n });\n\n const queryVariables = variables ? { ...variables } : {};\n if (previewEnabled) {\n queryVariables.version = \"CURRENT\";\n } else {\n queryVariables.version = \"PUBLISHED\";\n }\n\n // Add locale to variables if it exists\n if (i18n) {\n queryVariables.language = i18n.language;\n queryVariables.country = i18n.country;\n }\n\n const explicitTest = testFromQueryParams || test;\n const resolveTestInfo = !previewEnabled && !explicitTest;\n\n if (\n resolveTestInfo &&\n packClient &&\n token &&\n !testInfoForRequest &&\n currentRequest\n ) {\n try {\n if (!testInfoPromise) {\n debug(\n \"[Pack Test] Creating getTestInfo promise - first query for this request\",\n );\n testInfoPromise = getTestInfo({\n request: currentRequest,\n testTargetAudienceAttributes:\n getTestTargetingAttributesFromRequest(currentRequest),\n packClient,\n testSession, // Use dedicated test session instead\n withCache,\n token,\n });\n } else {\n debug(\n \"[Pack Test] Reusing existing getTestInfo promise - concurrent query\",\n );\n }\n testInfoForRequest = await testInfoPromise;\n } catch (error) {\n debug(\n \"[Pack Test] Error getting test info, continuing without test:\",\n error,\n );\n console.error(\n \"[Pack Test] Error getting test info, continuing without test:\",\n error,\n );\n // Continue without test info to allow site to load\n testInfoForRequest = undefined;\n testInfoPromise = undefined; // Reset promise so it can be retried on next query\n }\n } else if (\n resolveTestInfo &&\n packClient &&\n token &&\n testInfoForRequest\n ) {\n debug(\"[Pack Test] Using cached testInfo - subsequent query\");\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[Pack Test] Using cached testInfo - subsequent query\");\n }\n }\n\n if (resolveTestInfo && testInfoForRequest?.isFirstExposure) {\n const { isFirstExposure: _isFirstExposure, ...testInfo } =\n testInfoForRequest;\n\n testInfoForLoader = testInfo;\n }\n\n headers = setTestHeaders(headers, {\n testInfoForRequest,\n testFromQueryParams: explicitTest,\n });\n\n // Preview mode always bypasses the cache\n if (previewEnabled) {\n try {\n const result = await packClient.fetch(query, {\n variables: queryVariables,\n headers: headers,\n });\n\n return {\n ...result,\n packTestInfo: testInfoForLoader,\n };\n } catch (error) {\n return { error: error as QueryError, data: null };\n }\n }\n\n const queryHash = await getCacheKey(withCache, query, token, {\n variables: queryVariables,\n headers,\n });\n\n const response = await withCache.run(\n {\n cacheKey: [queryHash],\n cacheStrategy: strategy,\n shouldCacheResult: (value) => !value?.error,\n },\n async () => {\n try {\n const result = await packClient.fetch(query, {\n variables: queryVariables,\n headers: headers,\n });\n\n return result;\n } catch (error) {\n return { error, data: null };\n }\n },\n );\n\n return response.error\n ? response\n : { ...response, packTestInfo: testInfoForLoader };\n } catch (error) {\n debug(\n \"[Pack Test] Critical error in query method, returning error:\",\n error,\n );\n console.error(\n \"[Pack Test] Critical error in query method, returning error:\",\n error,\n );\n const queryError: QueryError = {\n message: error instanceof Error ? error.message : String(error),\n type: \"NetworkError\",\n };\n return { error: queryError, data: null };\n }\n },\n session,\n testSession,\n };\n}\n","import { PackClient } from \"@pack/client\";\nimport { PackTestSession } from \"../session/test-session\";\nimport * as cookie from \"cookie\";\nimport { LocalTestResolver } from \"./local-test-resolver\";\nimport createDebug from \"debug\";\nimport { getImpressionSectionIdsForVariant } from \"./impression\";\nimport { buildIdentityBundle } from \"../audiences\";\n\nconst debug = createDebug(\"pack:ab-testing:test\");\n\nexport interface TestInput {\n testId?: string;\n testHandle?: string;\n testVariantId?: string;\n testVariantHandle?: string;\n}\n\nexport interface Test {\n id: string;\n handle: string;\n impressionTrigger?: string;\n testVariant: {\n id: string;\n handle: string;\n };\n impression?: {\n sectionIds?: string[];\n };\n}\n\nexport interface TestTargetAudienceAttributes {\n url?: string;\n query?: string;\n path?: string;\n utmCampaign?: string;\n utmContent?: string;\n utmMedium?: string;\n utmSource?: string;\n utmTerm?: string;\n}\n\n// Removed: QUERY_TEST_VARIANT_IS_RUNNING is no longer needed\n// Test validity is now checked via the test-cache-check system\n\nconst QUERY_TESTS_BY_RULES = `#graphql\n query TestsByRules($status: String) {\n testsByRulesV2(status: $status) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n handle\n rules {\n attribute\n operator\n value\n }\n impressionTrigger\n experimentAudience {\n pinnedVersion\n pinnedRules\n }\n testVariants {\n id\n handle\n trafficPercentage\n sectionTestVariants {\n section {\n id\n }\n }\n }\n }\n }\n }\n }\n`;\n\n// Global instance of LocalTestResolver - no caching, just holds rules for request duration\nconst localTestResolver = new LocalTestResolver();\n\n// Generate cache key for shared test rules (same for all users)\nfunction generateTestRulesCacheKey(\n storeId: string,\n contentEnvironment?: string,\n): string {\n return `pack-tests:${storeId}:${contentEnvironment || \"default\"}`;\n}\n\n// Function to fetch test rules with shared caching (storefront-environment level)\nasync function fetchTestRulesShared(\n packClient: PackClient,\n withCache: any, // ReturnType<typeof createWithCache>\n token: string,\n): Promise<any[]> {\n const baseCacheKey = generateTestRulesCacheKey(\n packClient.storeId || \"\",\n packClient.contentEnvironment,\n );\n\n debug(\n \"[Pack Test] Fetching test rules with shared cache:\",\n JSON.stringify({\n baseCacheKey,\n storeId: packClient.storeId,\n contentEnvironment: packClient.contentEnvironment,\n }),\n );\n\n // Check test cache timestamp to include in cache key for automatic invalidation\n // This is the only place where test-cache-check should be called\n let testsUpdatedAt;\n try {\n const resp = await withCache.run(\n {\n cacheKey: [\"pack:tests:updatedAt\"],\n cacheStrategy: {\n maxAge: 15,\n staleWhileRevalidate: 15,\n },\n shouldCacheResult: (value: any) => value !== null,\n },\n async ({\n addDebugData,\n }: any): Promise<{ testsUpdatedAt?: string } | null> => {\n // Always use production endpoint for now\n // TODO: Add proper environment variable support for custom URLs\n const URL =\n \"https://test-cache-check-production.packdigital.workers.dev/tests-updated-at\";\n\n const resp = await fetch(URL, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n addDebugData?.({\n displayName: \"Pack Test Cache Check\",\n response: resp,\n });\n\n const { status } = resp;\n if (status !== 200) {\n let message;\n\n if (status === 401) {\n message =\n \"Pack error: Unauthorized request to test cache check service. Please check your token.\";\n } else {\n message = `Pack error: Request to test cache check service failed with status ${status}`;\n }\n\n debug(`[Pack Test] Cache check error: ${message}`);\n console.error(message);\n return null;\n }\n\n const data = await resp.json();\n debug(\"[Pack Test] Timestamp response:\", JSON.stringify(data));\n return data as { testsUpdatedAt?: string } | null;\n },\n );\n\n testsUpdatedAt = resp?.testsUpdatedAt;\n debug(\n \"[Pack Test] Using timestamp for cache key:\",\n JSON.stringify({\n testsUpdatedAt,\n hasTimestamp: !!testsUpdatedAt,\n }),\n );\n } catch (err) {\n debug(\n \"[Pack Test] Error checking test cache timestamp:\",\n JSON.stringify(err),\n );\n console.error(\"[Pack Test] Error checking test cache timestamp:\", err);\n }\n\n // Include testsUpdatedAt in cache key for cache invalidation\n const cacheKey = testsUpdatedAt\n ? `${baseCacheKey}:${testsUpdatedAt}`\n : baseCacheKey;\n\n debug(\"[Pack Test] Final cache key for test rules:\", cacheKey);\n\n return withCache.run(\n {\n cacheKey: [cacheKey],\n cacheStrategy: {\n maxAge: 3600, // 1 hour\n staleWhileRevalidate: 86400, // 24 hours\n staleIfError: 86400, // 24 hours\n },\n shouldCacheResult: (result: any) =>\n Array.isArray(result) && result.length >= 0,\n displayName: \"Pack Test Rules\",\n },\n async ({ addDebugData }: any): Promise<any[]> => {\n const startTime = Date.now();\n debug(\n \"[Pack Test] Cache miss - fetching test rules from Pack GraphQL API\",\n );\n\n try {\n // Fetch test rules from Pack API (only running tests)\n const { data, error } = await packClient.fetch(QUERY_TESTS_BY_RULES, {\n variables: { status: \"running\" },\n });\n\n const fetchDuration = Date.now() - startTime;\n debug(\n \"[Pack Test] GraphQL query completed:\",\n JSON.stringify({\n duration: `${fetchDuration}ms`,\n hasData: !!data,\n hasError: !!error,\n totalCount: data?.testsByRulesV2?.totalCount,\n edgesCount: data?.testsByRulesV2?.edges?.length || 0,\n }),\n );\n\n addDebugData?.({\n displayName: \"Pack Test Rules Query\",\n });\n\n if (error) {\n debug(\n \"[Pack Test] Error fetching test rules:\",\n JSON.stringify({\n error,\n errorType: typeof error,\n errorMessage: error?.message || JSON.stringify(error),\n }),\n );\n throw new Error(`GraphQL error: ${JSON.stringify(error)}`);\n }\n\n const rules =\n data?.testsByRulesV2?.edges.map((edge: any) => edge.node) || [];\n\n debug(\n \"[Pack Test] Successfully fetched and cached test rules:\",\n JSON.stringify({\n rulesCount: rules.length,\n cacheKey,\n rules: rules.map((rule: any) => ({\n id: rule.id,\n handle: rule.handle,\n rulesCount: rule.rules?.length || 0,\n variantsCount: rule.testVariants?.length || 0,\n })),\n }),\n );\n\n return rules;\n } catch (error) {\n const fetchDuration = Date.now() - startTime;\n debug(\n \"[Pack Test] Exception fetching test rules:\",\n JSON.stringify({\n error: error instanceof Error ? error.message : error,\n duration: `${fetchDuration}ms`,\n stack: error instanceof Error ? error.stack : undefined,\n }),\n );\n throw error;\n }\n },\n );\n}\n\nexport interface GetTestInfoOptions {\n request: Request;\n testTargetAudienceAttributes: TestTargetAudienceAttributes | null;\n packClient: PackClient;\n testSession: PackTestSession;\n withCache?: any; // ReturnType<typeof createWithCache>\n token?: string; // Pack secret token for cache check service\n}\n\nexport interface TestInfo extends Test {\n isFirstExposure?: boolean;\n}\n\nfunction isPrefetchRequest(request: Request): boolean {\n const secPurpose = request.headers.get(\"sec-purpose\")?.toLowerCase();\n const purpose = request.headers.get(\"purpose\")?.toLowerCase();\n const xPurpose = request.headers.get(\"x-purpose\")?.toLowerCase();\n\n return [secPurpose, purpose, xPurpose].some((value) =>\n value\n ?.split(\",\")\n .map((part) => part.trim())\n .includes(\"prefetch\"),\n );\n}\n\nasync function packClientFetchTestByRules(\n packClient: PackClient,\n testTargetAudienceAttributes: TestTargetAudienceAttributes | null,\n testSession: PackTestSession,\n request: Request,\n withCache?: any,\n token?: string,\n exposedTest?: Test | null,\n validateOnly?: boolean,\n) {\n try {\n debug(\n \"[Pack Test] Starting test assignment process:\",\n JSON.stringify({\n storeId: packClient.storeId,\n targetingAttributes: testTargetAudienceAttributes,\n requestUrl: request.url,\n validateOnly,\n }),\n );\n\n if (!packClient.storeId) {\n debug(\"[Pack Test] Store ID is required to fetch a test.\");\n console.error(\"[Pack Test] Store ID is required to fetch a test.\");\n return undefined;\n }\n\n debug(\n \"[Pack Test] Checking if rules are loaded:\",\n JSON.stringify({\n hasRules: localTestResolver.hasRules(),\n }),\n );\n\n // Always fetch rules through shared cache - it will return cached rules if still valid\n // This ensures we get fresh rules when tests are updated\n if (withCache && token) {\n debug(\"[Pack Test] Fetching test rules through shared cache\");\n try {\n const rules = await fetchTestRulesShared(packClient, withCache, token);\n localTestResolver.setTestRules(rules);\n debug(\n \"[Pack Test] Updated local resolver with rules from shared cache\",\n );\n\n // Check if current session test is still in active rules and get fresh data\n const currentTestData = testSession.getTestData();\n let needsNewTest = false;\n\n if (currentTestData?.id) {\n const freshTestData = localTestResolver.getTestById(\n currentTestData.id,\n );\n\n if (!freshTestData) {\n debug(\n \"[Pack Test] Current session test is no longer active (paused/stopped), clearing session:\",\n JSON.stringify({\n testId: currentTestData.id,\n testHandle: currentTestData.handle,\n }),\n );\n testSession.clearTestData();\n needsNewTest = true; // Mark that we need to assign a new test\n } else {\n debug(\n \"[Pack Test] Current session test is still active in rules, updating with fresh data:\",\n JSON.stringify({\n testId: freshTestData.id,\n testHandle: freshTestData.handle,\n variantsCount: freshTestData.testVariants?.length,\n }),\n );\n\n // Check if the user's variant still exists\n if (currentTestData.testVariant?.id) {\n const currentVariant = freshTestData.testVariants?.find(\n (v) => v.id === currentTestData.testVariant.id,\n );\n\n if (currentVariant) {\n // Variant still exists, return refreshed test data\n const impressionSectionIds = getImpressionSectionIdsForVariant(\n freshTestData,\n currentVariant,\n );\n const refreshedTest = {\n id: freshTestData.id,\n handle: freshTestData.handle,\n impressionTrigger: freshTestData.impressionTrigger,\n testVariant: {\n id: currentVariant.id,\n handle: currentVariant.handle,\n },\n impression:\n impressionSectionIds.length > 0\n ? { sectionIds: impressionSectionIds }\n : undefined,\n isFirstExposure: undefined,\n } as TestInfo;\n\n // Update session with refreshed data\n const {\n isFirstExposure: _isFirstExposure,\n ...testDataWithoutFlag\n } = refreshedTest;\n testSession.setTestData(testDataWithoutFlag);\n testSession.setExpireAt(getExpireAtDate().toISOString());\n\n // Return the refreshed test data (even in validateOnly mode)\n return refreshedTest;\n } else {\n // Variant no longer exists in test, clear session and need new test\n debug(\n \"[Pack Test] Current variant no longer exists in test, clearing session:\",\n JSON.stringify({\n testId: currentTestData.id,\n variantId: currentTestData.testVariant.id,\n }),\n );\n testSession.clearTestData();\n needsNewTest = true;\n }\n }\n }\n }\n\n // If in validateOnly mode and test is still valid, we already returned above\n // If we need a new test (old one inactive), continue to assign even in validateOnly\n if (validateOnly && !needsNewTest) {\n debug(\"[Pack Test] Validation complete, no new test needed\");\n return undefined;\n }\n } catch (error) {\n debug(\"[Pack Test] Failed to fetch test rules:\", JSON.stringify(error));\n console.error(\"[Pack Test] Failed to fetch test rules:\", error);\n // Continue without test rules\n }\n } else {\n debug(\n \"[Pack Test] No withCache or token available - cannot fetch test rules\",\n );\n // Cannot fetch without caching infrastructure\n }\n\n // Check if exposed test is still active and get fresh data\n if (exposedTest) {\n const freshTestData = localTestResolver.getTestById(exposedTest.id);\n if (freshTestData) {\n debug(\n \"[Pack Test] Exposed test is still active in rules, restoring with fresh data:\",\n JSON.stringify({\n testId: freshTestData.id,\n testHandle: freshTestData.handle,\n }),\n );\n\n // Find the variant in fresh data\n const exposedVariant = freshTestData.testVariants?.find(\n (v) => v.id === exposedTest.testVariant?.id,\n );\n\n if (exposedVariant) {\n const impressionSectionIds = getImpressionSectionIdsForVariant(\n freshTestData,\n exposedVariant,\n );\n // Return the exposed test with fresh data\n const result = {\n id: freshTestData.id,\n handle: freshTestData.handle,\n impressionTrigger: freshTestData.impressionTrigger,\n testVariant: {\n id: exposedVariant.id,\n handle: exposedVariant.handle,\n },\n impression:\n impressionSectionIds.length > 0\n ? { sectionIds: impressionSectionIds }\n : undefined,\n isFirstExposure: undefined,\n } as TestInfo;\n\n // Save to session\n const { isFirstExposure: _isFirstExposure, ...testDataWithoutFlag } =\n result;\n testSession.setTestData(testDataWithoutFlag);\n testSession.setExpireAt(getExpireAtDate().toISOString());\n\n return result;\n } else {\n debug(\n \"[Pack Test] Exposed test variant no longer exists in fresh data:\",\n JSON.stringify({\n testId: exposedTest.id,\n variantId: exposedTest.testVariant?.id,\n }),\n );\n }\n } else {\n debug(\n \"[Pack Test] Exposed test is no longer active in rules:\",\n JSON.stringify({\n testId: exposedTest.id,\n }),\n );\n }\n }\n\n // Use local resolver to assign test\n const sessionId = packClient.storeId; // Use store ID as session ID for consistency\n debug(\"[Pack Test] Assigning test with session ID:\", sessionId);\n\n // Request-level identity bundle (A/B runs at handleRequest, before the\n // Shopify customer is resolved). Used to gate audience-targeted tests.\n const identity = buildIdentityBundle(request);\n\n const assignedTest = await localTestResolver.assignTest(\n testTargetAudienceAttributes || {},\n sessionId,\n identity,\n );\n\n debug(\n \"[Pack Test] Test assignment result:\",\n JSON.stringify({\n assigned: !!assignedTest,\n testId: assignedTest?.id,\n testHandle: assignedTest?.handle,\n variantId: assignedTest?.testVariant?.id,\n variantHandle: assignedTest?.testVariant?.handle,\n }),\n );\n\n if (!assignedTest) {\n debug(\"[Pack Test] No test assigned - user not eligible for any tests\");\n return undefined;\n }\n\n // Return in the same format as the original implementation\n const result = {\n ...assignedTest,\n isFirstExposure: true,\n } as TestInfo;\n\n debug(\n \"[Pack Test] Test assigned, saving to session:\",\n JSON.stringify({\n testId: result.id,\n testHandle: result.handle,\n variantId: result.testVariant.id,\n variantHandle: result.testVariant.handle,\n }),\n );\n\n // Save the assigned test to session WITHOUT isFirstExposure flag\n const { isFirstExposure: _isFirstExposure, ...testDataWithoutFlag } =\n result;\n testSession.setTestData(testDataWithoutFlag);\n testSession.setExpireAt(getExpireAtDate().toISOString());\n\n debug(\"[Pack Test] Returning test info with first exposure flag\");\n return result;\n } catch (error) {\n debug(\n \"[Pack Test] Error in packClientFetchTestByRules, continuing without test:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error in packClientFetchTestByRules, continuing without test:\",\n error,\n );\n // Return undefined to allow site to load without test info\n return undefined;\n }\n}\n\n// Removed: packClientCheckTestIsRunning is no longer needed\n// Test validity is now checked via the test-cache-check system and localTestResolver.isTestActive()\n\n// Slid forward on each validate but display/debug only — no longer gates\n// assignment (a valid assignment is sticky until the test/variant goes away).\nfunction getExpireAtDate() {\n const expireAt = new Date();\n expireAt.setHours(expireAt.getHours() + 4); // 4 hours\n return expireAt;\n}\n\nexport async function getTestInfo({\n request,\n testTargetAudienceAttributes,\n packClient,\n testSession,\n withCache,\n token,\n}: GetTestInfoOptions): Promise<TestInfo | undefined> {\n debug(\n \"[Pack Test] Getting test info:\",\n JSON.stringify({\n hasTestSession: !!testSession,\n targetingAttributes: testTargetAudienceAttributes,\n requestUrl: request.url,\n }),\n );\n\n if (isPrefetchRequest(request)) {\n debug(\"[Pack Test] Skipping test assignment for prefetch request.\");\n return undefined;\n }\n\n let testInfo: TestInfo | undefined = undefined;\n let exposedTest: Test | undefined = undefined;\n\n if (!testSession) {\n debug(\"[Pack Test] No test session available, returning undefined\");\n return testInfo;\n }\n\n // Retrieve simplified test data and expiry\n const testSessionData: Test | undefined = testSession.getTestData();\n const testSessionExpireAt: string | undefined = testSession.getExpireAt();\n\n debug(\n \"[Pack Test] Session data check:\",\n JSON.stringify({\n hasTestData: !!testSessionData,\n testId: testSessionData?.id,\n testHandle: testSessionData?.handle,\n variantId: testSessionData?.testVariant?.id,\n variantHandle: testSessionData?.testVariant?.handle,\n expireAt: testSessionExpireAt,\n isExpired: testSessionExpireAt\n ? new Date(testSessionExpireAt) < new Date()\n : false,\n }),\n );\n\n const exposedTestCookieString = cookie.parse(\n request.headers.get(\"cookie\") || \"\",\n )?.exposedTest;\n\n debug(\n \"[Pack Test] Exposed test cookie check:\",\n JSON.stringify({\n hasExposedTestCookie: !!exposedTestCookieString,\n }),\n );\n\n // If we already have a valid test in the session, validate it's still active\n if (testSessionData?.id && testSessionData?.testVariant) {\n debug(\"[Pack Test] Found existing test data in session\");\n\n // Validate the assignment against current rules on every request. We\n // intentionally do NOT re-roll on time-based expiry: a still-eligible\n // assignment is preserved (the validate path returns the same variant and\n // slides the expiry forward), and only a paused/removed test or a removed\n // variant triggers a new assignment. Forcing a re-roll on expiry flipped\n // returning users between variants and corrupted test results.\n try {\n const validationResult = await packClientFetchTestByRules(\n packClient,\n testTargetAudienceAttributes,\n testSession,\n request,\n withCache,\n token,\n null,\n true, // validateOnly - but will assign new test if current is inactive\n );\n\n // If we got test data back, determine if it's refreshed or new\n if (validationResult) {\n if (validationResult.id === testSessionData.id) {\n debug(\n \"[Pack Test] Test is still active, using refreshed data\",\n JSON.stringify({\n testId: validationResult.id,\n testHandle: validationResult.handle,\n variantId: validationResult.testVariant.id,\n variantHandle: validationResult.testVariant.handle,\n }),\n );\n // Same test, just refreshed - no first exposure\n return validationResult;\n } else {\n debug(\n \"[Pack Test] Original test no longer active, new test assigned\",\n JSON.stringify({\n oldTestId: testSessionData.id,\n newTestId: validationResult.id,\n newTestHandle: validationResult.handle,\n newVariantId: validationResult.testVariant.id,\n newVariantHandle: validationResult.testVariant.handle,\n }),\n );\n // New test was assigned, mark as first exposure\n return {\n ...validationResult,\n isFirstExposure: true,\n } as TestInfo;\n }\n } else {\n debug(\n \"[Pack Test] Test is no longer active and no new test was assigned\",\n );\n return undefined;\n }\n } catch (error) {\n debug(\n \"[Pack Test] Error validating test, using cached data:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error validating test, using cached data:\",\n error,\n );\n // On error, still return the cached data\n return { ...testSessionData, isFirstExposure: undefined } as TestInfo;\n }\n }\n\n if (exposedTestCookieString) {\n try {\n exposedTest = JSON.parse(exposedTestCookieString);\n debug(\n \"[Pack Test] Parsed exposed test from cookie:\",\n JSON.stringify({\n testId: exposedTest?.id,\n testHandle: exposedTest?.handle,\n variantId: exposedTest?.testVariant?.id,\n variantHandle: exposedTest?.testVariant?.handle,\n }),\n );\n } catch (error) {\n debug(\n \"[Pack Test] Failed to parse exposed test cookie:\",\n JSON.stringify(error),\n );\n console.error(\"[Pack Test] Failed to parse exposed test cookie:\", error);\n }\n }\n\n if (exposedTest && !testSessionData) {\n debug(\n \"[Pack Test] Found exposed test cookie with no session data - will fetch rules and validate\",\n );\n // If there is no assigned test on the session and an exposed test in the\n // incoming request cookie it means that the user was exposed to a test previously.\n\n // Fetch test rules and check if exposed test is still active\n try {\n // Pass the exposed test to packClientFetchTestByRules\n testInfo = await packClientFetchTestByRules(\n packClient,\n testTargetAudienceAttributes,\n testSession,\n request,\n withCache,\n token,\n exposedTest,\n false, // Not validateOnly - allow assigning new tests\n );\n\n if (testInfo?.id === exposedTest.id) {\n debug(\"[Pack Test] Exposed test was restored (still active)\");\n } else if (testInfo) {\n debug(\n \"[Pack Test] Exposed test is no longer active, using newly assigned test:\",\n JSON.stringify({\n exposedTestId: exposedTest.id,\n newTestId: testInfo.id,\n }),\n );\n } else {\n debug(\n \"[Pack Test] Exposed test is no longer active and no new test was assigned\",\n );\n }\n } catch (error) {\n debug(\n \"[Pack Test] Error processing exposed test:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error processing exposed test, continuing without test:\",\n error,\n );\n // Continue without test info to allow site to load\n testInfo = undefined;\n }\n } else if (testSessionData) {\n debug(\n \"[Pack Test] Test session data exists but was invalid - fetching new test\",\n );\n // Reached only when testSessionData exists but is malformed (missing id or\n // testVariant), so the validate-and-keep block above did not run. A valid\n // assignment — expired or not — already returned there. Clear and reassign.\n testSession.clearTestData();\n\n // Then fetch new test\n try {\n testInfo = await packClientFetchTestByRules(\n packClient,\n testTargetAudienceAttributes,\n testSession,\n request,\n withCache,\n token,\n null,\n false, // Not validateOnly - allow assigning new tests\n );\n } catch (error) {\n debug(\n \"[Pack Test] Error fetching new test after expired session:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error fetching new test, continuing without test:\",\n error,\n );\n // Continue without test info to allow site to load\n testInfo = undefined;\n }\n } else {\n debug(\n \"[Pack Test] No existing test data found - fetching new test for user\",\n );\n // If there is no test on session and no exposed test, check for a new test for client\n try {\n testInfo = await packClientFetchTestByRules(\n packClient,\n testTargetAudienceAttributes,\n testSession,\n request,\n withCache,\n token,\n null,\n false, // Not validateOnly - allow assigning new tests\n );\n } catch (error) {\n debug(\n \"[Pack Test] Error fetching new test for user:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error fetching new test, continuing without test:\",\n error,\n );\n // Continue without test info to allow site to load\n testInfo = undefined;\n }\n }\n\n debug(\n \"[Pack Test] Final test info result:\",\n JSON.stringify({\n hasTestInfo: !!testInfo,\n testId: testInfo?.id,\n testHandle: testInfo?.handle,\n variantId: testInfo?.testVariant?.id,\n variantHandle: testInfo?.testVariant?.handle,\n isFirstExposure: testInfo?.isFirstExposure,\n }),\n );\n\n return testInfo;\n}\n\n/**\n * An explicit A/B test input is only usable when it identifies BOTH a test\n * (id or handle) AND a variant (id or handle). This prevents partial or\n * control-only preview context from fabricating a bogus test on `pack.abTest`.\n */\nexport function hasCompleteTestInput(\n testInput: TestInput | null | undefined,\n): testInput is TestInput {\n if (!testInput) return false;\n\n const hasTest = Boolean(testInput.testId || testInput.testHandle);\n const hasVariant = Boolean(\n testInput.testVariantId || testInput.testVariantHandle,\n );\n\n return hasTest && hasVariant;\n}\n\nexport function getTestSession(\n testSession?: PackTestSession,\n explicitTest: TestInput | null = null,\n previewEnabled: boolean = false,\n): Test | null | undefined {\n debug(\n \"[Pack Test] Getting test session:\",\n JSON.stringify({\n hasTestSession: !!testSession,\n hasExplicitTest: hasCompleteTestInput(explicitTest),\n previewEnabled,\n }),\n );\n\n // An explicit test (from URL query params or the selected preview-session\n // test) wins. This is what surfaces the previewed variant on `pack.abTest`,\n // so code-driven storefront variants render in the customizer and preview\n // links exactly as they do on the live site.\n if (hasCompleteTestInput(explicitTest)) {\n const result = {\n id: explicitTest.testId || \"\",\n handle: explicitTest.testHandle || \"\",\n testVariant: {\n id: explicitTest.testVariantId || \"\",\n handle: explicitTest.testVariantHandle || \"\",\n },\n };\n debug(\"[Pack Test] Using explicit test input:\", JSON.stringify(result));\n return result;\n }\n\n if (previewEnabled) {\n const result = {\n id: \"\",\n handle: \"isPreview\",\n testVariant: {\n id: \"\",\n handle: \"isPreview\",\n },\n };\n debug(\n \"[Pack Test] Using preview mode test session:\",\n JSON.stringify(result),\n );\n return result;\n }\n\n if (!testSession) {\n debug(\"[Pack Test] No test session available\");\n return undefined;\n }\n\n // Read simplified test data from the dedicated test session\n const testSessionData: Test | undefined = testSession.getTestData();\n debug(\n \"[Pack Test] Retrieved test session data:\",\n JSON.stringify({\n hasData: !!testSessionData,\n testId: testSessionData?.id,\n testHandle: testSessionData?.handle,\n variantId: testSessionData?.testVariant?.id,\n variantHandle: testSessionData?.testVariant?.handle,\n }),\n );\n\n return testSessionData || null;\n}\n\nexport function getTestTargetingAttributesFromRequest(\n request: Request,\n): TestTargetAudienceAttributes {\n let testTargetingAttributes: TestTargetAudienceAttributes = {};\n\n const requestUrl = new URL(request.url);\n const searchParams = requestUrl.searchParams;\n\n testTargetingAttributes.url = requestUrl.origin + requestUrl.pathname;\n testTargetingAttributes.query = requestUrl.search;\n testTargetingAttributes.path = requestUrl.pathname;\n searchParams.has(\"utm_campaign\") &&\n (testTargetingAttributes.utmCampaign =\n searchParams.get(\"utm_campaign\") || undefined);\n searchParams.has(\"utm_content\") &&\n (testTargetingAttributes.utmContent =\n searchParams.get(\"utm_content\") || undefined);\n searchParams.has(\"utm_medium\") &&\n (testTargetingAttributes.utmMedium =\n searchParams.get(\"utm_medium\") || undefined);\n searchParams.has(\"utm_source\") &&\n (testTargetingAttributes.utmSource =\n searchParams.get(\"utm_source\") || undefined);\n searchParams.has(\"utm_term\") &&\n (testTargetingAttributes.utmTerm =\n searchParams.get(\"utm_term\") || undefined);\n\n return testTargetingAttributes;\n}\n\nexport function getTestFromQueryParams(request: Request): TestInput | null {\n const requestUrl = new URL(request.url);\n const params = requestUrl.searchParams;\n\n if (\n params.has(\"testId\") ||\n params.has(\"test_id\") ||\n params.has(\"test-id\") ||\n params.has(\"testHandle\") ||\n params.has(\"test_handle\") ||\n params.has(\"test-handle\") ||\n params.has(\"testVariantId\") ||\n params.has(\"test_variant_id\") ||\n params.has(\"test-variant-id\") ||\n params.has(\"testVariantHandle\") ||\n params.has(\"test_variant_handle\") ||\n params.has(\"test-variant-handle\")\n ) {\n return {\n testId:\n params.get(\"testId\") ||\n params.get(\"test_id\") ||\n params.get(\"test-id\") ||\n \"\",\n testHandle:\n params.get(\"testHandle\") ||\n params.get(\"test_handle\") ||\n params.get(\"test-handle\") ||\n \"\",\n testVariantId:\n params.get(\"testVariantId\") ||\n params.get(\"test_variant_id\") ||\n params.get(\"test-variant-id\") ||\n \"\",\n testVariantHandle:\n params.get(\"testVariantHandle\") ||\n params.get(\"test_variant_handle\") ||\n params.get(\"test-variant-handle\") ||\n \"\",\n };\n }\n\n return null;\n}\n\nexport function setTestHeaders(\n headers: any,\n options: {\n testInfoForRequest?: TestInfo;\n testFromQueryParams?: TestInput;\n },\n) {\n const { testFromQueryParams, testInfoForRequest } = options;\n\n if (testFromQueryParams) {\n headers[\"X-Pack-Test-Ignore-Test-Status\"] = true;\n\n if (testFromQueryParams.testId) {\n headers[\"X-Pack-Test-Id\"] = testFromQueryParams.testId;\n }\n\n if (testFromQueryParams.testHandle) {\n headers[\"X-Pack-Test-Handle\"] = testFromQueryParams.testHandle;\n }\n\n if (testFromQueryParams.testVariantId) {\n headers[\"X-Pack-Test-Variant-Id\"] = testFromQueryParams.testVariantId;\n }\n\n if (testFromQueryParams.testVariantHandle) {\n headers[\"X-Pack-Test-Variant-Handle\"] =\n testFromQueryParams.testVariantHandle;\n }\n } else if (testInfoForRequest) {\n headers[\"X-Pack-Test-Id\"] = testInfoForRequest?.id;\n headers[\"X-Pack-Test-Variant-Id\"] = testInfoForRequest?.testVariant?.id;\n }\n\n return headers;\n}\n","import { Test, TestTargetAudienceAttributes } from \"./test\";\nimport { Engine, Rule } from \"json-rules-engine\";\nimport createDebug from \"debug\";\nimport { getImpressionSectionIdsForVariant } from \"./impression\";\nimport { AudienceRulesTree, IdentityBundle, resolveRulesTree } from \"../audiences\";\n\nconst debug = createDebug(\"pack:ab-testing:local-resolver\");\n\n// Types for json-rules-engine\ntype EngineResult = any;\n\nexport interface TestWithRules {\n id: string;\n handle: string;\n impressionTrigger?: string;\n rules: Array<{\n attribute: string;\n operator: string;\n value: string;\n }>;\n // Attached audience (XOR with inline rules). The pinned snapshot the SSR\n // resolver evaluates; absent for inline-targeted or untargeted tests.\n experimentAudience?: {\n pinnedVersion?: number | null;\n pinnedRules?: AudienceRulesTree | null;\n } | null;\n testVariants: Array<{\n id: string;\n handle: string;\n trafficPercentage: number;\n sectionTestVariants?: Array<{\n section?: {\n id?: string | null;\n } | null;\n }> | null;\n }>;\n}\n\n/**\n * Local test resolver that evaluates test rules without external API calls\n * Rules are stored in memory for the request duration only - caching is handled by fetchTestRulesShared\n */\nexport class LocalTestResolver {\n private testRules: TestWithRules[] = [];\n\n constructor() {\n // No caching logic - rules are managed by fetchTestRulesShared with proper cache invalidation\n }\n\n /**\n * Set test rules (from the shared cache)\n */\n setTestRules(rules: TestWithRules[]) {\n this.testRules = rules;\n }\n\n /**\n * Check if rules are loaded\n */\n hasRules(): boolean {\n return this.testRules.length > 0;\n }\n\n /**\n * Check if a specific test is still active in the current rules\n */\n isTestActive(testId: string): boolean {\n return this.testRules.some((test) => test.id === testId);\n }\n\n /**\n * Get fresh test data by ID from current rules\n */\n getTestById(testId: string): TestWithRules | null {\n return this.testRules.find((test) => test.id === testId) || null;\n }\n\n /**\n * Get random number for test assignment\n */\n private getRandomNumber(max: number, min: number = 0): number {\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * Evaluate test rules and assign a variant\n */\n async assignTest(\n attributes: TestTargetAudienceAttributes,\n _sessionId: string,\n identity?: IdentityBundle,\n ): Promise<Test | null> {\n debug(\n \"[Pack Test LocalResolver] Starting test assignment:\",\n JSON.stringify({\n totalRules: this.testRules.length,\n attributes,\n }),\n );\n\n if (!this.testRules.length) {\n debug(\"[Pack Test LocalResolver] No test rules available\");\n return null;\n }\n\n // Filter tests by evaluating rules\n const eligibleTests = await this.evaluateRules(\n this.testRules,\n attributes,\n identity,\n );\n\n debug(\n \"[Pack Test LocalResolver] Rule evaluation result:\",\n JSON.stringify({\n totalTests: this.testRules.length,\n eligibleTests: eligibleTests.length,\n eligibleTestIds: eligibleTests.map((t) => ({\n id: t.id,\n handle: t.handle,\n })),\n }),\n );\n\n if (!eligibleTests.length) {\n debug(\"[Pack Test LocalResolver] No eligible tests found\");\n return null;\n }\n\n // Select a random test from eligible ones\n const randomTestIndex = this.getRandomNumber(eligibleTests.length - 1);\n const selectedTest = eligibleTests[randomTestIndex];\n\n debug(\n \"[Pack Test LocalResolver] Selected test:\",\n JSON.stringify({\n testId: selectedTest.id,\n testHandle: selectedTest.handle,\n randomIndex: randomTestIndex,\n totalEligible: eligibleTests.length,\n }),\n );\n\n // Assign variant based on traffic percentage\n const randomPercentage = this.getRandomNumber(100, 1);\n let accumulatedPercentage = 0;\n\n debug(\n \"[Pack Test LocalResolver] Starting variant assignment:\",\n JSON.stringify({\n randomPercentage,\n variants: selectedTest.testVariants.map((v) => ({\n id: v.id,\n handle: v.handle,\n trafficPercentage: v.trafficPercentage,\n })),\n }),\n );\n\n for (const variant of selectedTest.testVariants) {\n accumulatedPercentage += variant.trafficPercentage * 100;\n\n debug(\n \"[Pack Test LocalResolver] Checking variant:\",\n JSON.stringify({\n variantId: variant.id,\n variantHandle: variant.handle,\n trafficPercentage: variant.trafficPercentage,\n accumulatedPercentage,\n randomPercentage,\n isSelected: accumulatedPercentage >= randomPercentage,\n }),\n );\n\n if (accumulatedPercentage >= randomPercentage) {\n const impressionSectionIds = getImpressionSectionIdsForVariant(\n selectedTest,\n variant,\n );\n const result = {\n id: selectedTest.id,\n handle: selectedTest.handle,\n impressionTrigger: selectedTest.impressionTrigger,\n testVariant: {\n id: variant.id,\n handle: variant.handle,\n },\n impression:\n impressionSectionIds.length > 0\n ? { sectionIds: impressionSectionIds }\n : undefined,\n };\n debug(\n \"[Pack Test LocalResolver] Variant selected:\",\n JSON.stringify(result),\n );\n return result;\n }\n }\n\n debug(\"[Pack Test LocalResolver] No variant selected (should not happen)\");\n return null;\n }\n\n /**\n * Evaluate rules using json-rules-engine (same as tests-service)\n */\n private async evaluateRules(\n tests: TestWithRules[],\n attributes: TestTargetAudienceAttributes,\n identity?: IdentityBundle,\n ): Promise<TestWithRules[]> {\n debug(\n \"[Pack Test LocalResolver] Starting rule evaluation:\",\n JSON.stringify({\n totalTests: tests.length,\n attributes,\n isClientSide: typeof window !== \"undefined\",\n }),\n );\n\n // Only run on server side\n if (typeof window !== \"undefined\") {\n debug(\"[Pack Test LocalResolver] Client side - returning all tests\");\n return tests; // Return all tests on client side\n }\n\n const engineResultsPromises: (Promise<EngineResult> | undefined)[] =\n tests.map((test, index) => {\n const { rules } = test;\n\n debug(\n `[Pack Test LocalResolver] Processing test ${index}:`,\n JSON.stringify({\n testId: test.id,\n testHandle: test.handle,\n rulesCount: rules?.length || 0,\n rules: rules,\n }),\n );\n\n if (rules && Array.isArray(rules)) {\n if (rules.length === 0) {\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} has no rules - targeting all`,\n );\n // If there are no rules, targeting all, so simulate a targeted event\n return Promise.resolve({\n events: [{ type: \"targeted\" }],\n } as EngineResult);\n } else {\n const engineConditionalProperties = (\n rules.filter(\n (rule: any) =>\n rule !== null &&\n typeof rule === \"object\" &&\n Object.hasOwn(rule, \"attribute\") &&\n Object.hasOwn(rule, \"operator\") &&\n Object.hasOwn(rule, \"value\"),\n ) as {\n attribute: string;\n operator: string;\n value: string;\n }[]\n ).map((rule) => ({\n fact: rule.attribute,\n operator: rule.operator,\n value: rule.value,\n }));\n\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} engine conditions:`,\n JSON.stringify(engineConditionalProperties),\n );\n\n const engineRules = [\n new Rule({\n conditions: {\n all: engineConditionalProperties,\n },\n event: {\n type: \"targeted\",\n },\n }),\n ];\n\n const engine = new Engine(engineRules, {\n allowUndefinedFacts: true,\n });\n\n // Add custom operators to the engine\n engine.addOperator<string, string>(\n \"stringContains\",\n (factValue, jsonValue) => {\n return !!factValue && factValue.includes(jsonValue);\n },\n );\n engine.addOperator<string, string>(\n \"stringDoesNotContain\",\n (factValue, jsonValue) => {\n return !!factValue && !factValue.includes(jsonValue);\n },\n );\n engine.addOperator<string, string>(\n \"matchesRegex\",\n (factValue, jsonValue) => {\n return !!factValue && new RegExp(jsonValue).test(factValue);\n },\n );\n engine.addOperator<string, string>(\n \"doesNotMatchRegex\",\n (factValue, jsonValue) => {\n return !!factValue && !new RegExp(jsonValue).test(factValue);\n },\n );\n engine.addOperator<string, string>(\n \"isSet\",\n (factValue) => !!factValue,\n );\n engine.addOperator<string, string>(\n \"isNotSet\",\n (factValue) => !factValue,\n );\n\n const result = engine.run(attributes);\n debug(\n `[Pack Test LocalResolver] Engine result for test ${test.handle}:`,\n JSON.stringify(result),\n );\n return result;\n }\n }\n\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} has invalid rules`,\n );\n // Return undefined for tests without valid rules\n return undefined;\n });\n\n const engineResults = await Promise.all(engineResultsPromises);\n\n debug(\n \"[Pack Test LocalResolver] All engine results:\",\n JSON.stringify(engineResults),\n );\n\n const eligibleTests = tests.filter((test, index) => {\n const hasTargetedEvent = !!engineResults?.[index]?.events.find(\n (event: any) => event.type === \"targeted\",\n );\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} eligibility:`,\n JSON.stringify({\n hasTargetedEvent,\n events: engineResults?.[index]?.events,\n }),\n );\n return hasTargetedEvent;\n });\n\n debug(\n \"[Pack Test LocalResolver] Inline-eligible tests:\",\n JSON.stringify({\n eligibleCount: eligibleTests.length,\n eligibleTests: eligibleTests.map((t) => ({\n id: t.id,\n handle: t.handle,\n })),\n }),\n );\n\n return this.applyAudienceGating(eligibleTests, identity);\n }\n\n /**\n * Audience gating (XOR with inline rules): a test attached to an audience is\n * only eligible when the visitor matches the pinned audience snapshot. Tests\n * without an audience pass through unchanged. Fails closed (excludes the test)\n * when the audience can't be evaluated — no identity, or an evaluator error —\n * so audience-targeted tests never leak to unintended traffic.\n */\n private async applyAudienceGating(\n eligibleTests: TestWithRules[],\n identity?: IdentityBundle,\n ): Promise<TestWithRules[]> {\n const hasAudience = eligibleTests.some(\n (test) => test.experimentAudience?.pinnedRules,\n );\n if (!hasAudience) return eligibleTests;\n\n const gated = await Promise.all(\n eligibleTests.map(async (test) => {\n const pinnedRules = test.experimentAudience?.pinnedRules;\n if (!pinnedRules) return test; // inline-targeted or untargeted\n\n if (!identity) {\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} has an audience but no identity — excluding`,\n );\n return null;\n }\n\n try {\n const { matches } = await resolveRulesTree(pinnedRules, identity);\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} audience match:`,\n JSON.stringify({ matches }),\n );\n return matches ? test : null;\n } catch (err) {\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} audience eval error — excluding:`,\n String(err),\n );\n return null;\n }\n }),\n );\n\n return gated.filter((test): test is TestWithRules => test !== null);\n }\n\n /**\n * Resolve test and variant IDs from their handles\n */\n resolveTestIdsFromHandles(\n testHandle: string,\n variantHandle: string,\n ): {\n testId?: string;\n variantId?: string;\n } | null {\n const test = this.testRules.find((t) => t.handle === testHandle);\n if (!test) {\n return null;\n }\n\n const variant = test.testVariants?.find((v) => v.handle === variantHandle);\n if (!variant) {\n return null;\n }\n\n return {\n testId: test.id,\n variantId: variant.id,\n };\n }\n}\n","type SectionTestVariant = {\n section?: {\n id?: string | null;\n } | null;\n};\n\nexport type TestVariantWithImpression = {\n handle: string;\n sectionTestVariants?: SectionTestVariant[] | null;\n};\n\nexport type TestWithImpressionVariants = {\n testVariants?: TestVariantWithImpression[] | null;\n};\n\nexport function getVariantImpressionSectionIds(\n testVariant?: TestVariantWithImpression | null,\n): string[] {\n const sectionIds =\n testVariant?.sectionTestVariants\n ?.map((variant) => variant?.section?.id)\n .filter((id): id is string => Boolean(id)) || [];\n\n return [...new Set(sectionIds)];\n}\n\nexport function getImpressionSectionIdsForVariant(\n test?: TestWithImpressionVariants | null,\n testVariant?: TestVariantWithImpression | null,\n): string[] {\n const selectedVariantSectionIds = getVariantImpressionSectionIds(testVariant);\n\n if (selectedVariantSectionIds.length > 0) {\n return selectedVariantSectionIds;\n }\n\n if (testVariant?.handle !== \"control\") {\n return [];\n }\n\n const fallbackSectionIds =\n test?.testVariants\n ?.filter((variant) => variant.handle !== \"control\")\n .flatMap((variant) => getVariantImpressionSectionIds(variant)) || [];\n\n return [...new Set(fallbackSectionIds)];\n}\n","import * as cookie from \"cookie\";\nimport { PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\n\n/**\n * The identity signals audience conditions evaluate against. Built once per SSR\n * request and passed to the resolver; every condition reads from this bundle\n * rather than re-parsing the request.\n *\n * Two population levels:\n * - request-only (handleRequest / A/B): everything except customer identity;\n * - request + customer (root loader / Personalization): also `shopifyCustomerId`.\n * All fields are optional; customer-keyed conditions simply don't match at the\n * request-only level.\n */\nexport interface IdentityBundle {\n // Customer identity — only known once the Shopify customer is resolved.\n shopifyCustomerId?: string;\n\n // Provider identifiers. Only `ga4ClientId` is populated today (the `_ga`\n // format is stable + verified). The rest are declared to keep the bundle\n // shape stable, but are populated by the condition tasks that own each\n // provider once their real cookie/storage formats are verified (several\n // encode base64/JSON, or live in localStorage and aren't readable at SSR).\n // Until then, conditions should read the raw `cookies` jar.\n ga4ClientId?: string; // _ga cookie (GA1.1.<id>.<ts>)\n amplitudeDeviceId?: string;\n amplitudeUserId?: string;\n klaviyoProfileId?: string;\n segmentAnonymousId?: string;\n\n // Raw cookie jar — the reliable source for cookie conditions.\n cookies: Record<string, string>;\n\n // Binary consent (from the __pack_user_consent cookie; absent = consented,\n // matching hasUserConsent). Consent-sensitive conditions fail closed without it.\n hasConsent: boolean;\n\n userAgent?: string;\n deviceType: \"mobile\" | \"tablet\" | \"desktop\";\n geo: { country?: string; region?: string };\n url: { path: string; query: Record<string, string>; host?: string };\n referrer?: string;\n}\n\nexport interface BuildIdentityBundleOptions {\n /** Shopify customer id, when resolved (loader-level / Personalization). */\n shopifyCustomerId?: string;\n}\n\nfunction detectDeviceType(userAgent: string): IdentityBundle[\"deviceType\"] {\n const ua = userAgent.toLowerCase();\n if (/ipad|tablet|(android(?!.*mobile))/.test(ua)) return \"tablet\";\n if (/mobi|iphone|android|ipod|phone/.test(ua)) return \"mobile\";\n return \"desktop\";\n}\n\n// GA4 client id is the last two dot-segments of the `_ga` cookie\n// (e.g. \"GA1.1.1234567890.1600000000\" -> \"1234567890.1600000000\").\nfunction extractGa4ClientId(\n cookies: Record<string, string>,\n): string | undefined {\n const ga = cookies[\"_ga\"];\n if (!ga) return undefined;\n const parts = ga.split(\".\");\n return parts.length >= 4 ? parts.slice(-2).join(\".\") : undefined;\n}\n\nfunction firstHeader(request: Request, ...names: string[]): string | undefined {\n for (const name of names) {\n const value = request.headers.get(name);\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * Builds an IdentityBundle from an SSR request (headers + cookies) and, when\n * available, the resolved Shopify customer. Pure and synchronous — safe to call\n * once per request and memoize.\n */\nexport function buildIdentityBundle(\n request: Request,\n options: BuildIdentityBundleOptions = {},\n): IdentityBundle {\n const parsedCookies = cookie.parse(request.headers.get(\"cookie\") || \"\");\n const cookies: Record<string, string> = {};\n for (const [name, value] of Object.entries(parsedCookies)) {\n if (typeof value === \"string\") cookies[name] = value;\n }\n\n const userAgent = request.headers.get(\"user-agent\") || undefined;\n\n // Binary consent from the parsed jar — absent means consented, matching\n // hasUserConsent's semantics (computed here to avoid re-parsing the header).\n const consentCookie = cookies[PACK_USER_CONSENT_COOKIE_ID];\n const hasConsent = consentCookie ? consentCookie === \"true\" : true;\n\n const requestUrl = new URL(request.url);\n const query: Record<string, string> = {};\n requestUrl.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return {\n shopifyCustomerId: options.shopifyCustomerId,\n // Only GA4 is populated today; other provider ids are filled in by the\n // condition tasks that own them (see the type declaration).\n ga4ClientId: extractGa4ClientId(cookies),\n cookies,\n hasConsent,\n userAgent,\n deviceType: userAgent ? detectDeviceType(userAgent) : \"desktop\",\n // Host-provided geo-IP, first header present wins. Every name here is one\n // the host defines, and they must carry the same FORMAT across hosts:\n // country as ISO 3166-1 alpha-2, region as an ISO 3166-2 subdivision code.\n //\n // Defined is not the same as delivered. Only `oxygen-buyer-*` and\n // `cf-ipcountry` arrive unconditionally; `cf-region-code` needs\n // Cloudflare's \"Add visitor location headers\" managed transform, which is\n // off by default, so a Workers deployment behind plain Cloudflare has no\n // region and its region audiences match nobody. That is fine while\n // storefronts are on Oxygen (which sets it from request.cf) — revisit if a\n // storefront ever fronts an origin with Cloudflare directly.\n // Oxygen also exposes `oxygen-buyer-region`, but that is the full name\n // (\"California\") — mixing it in would make an audience configured as \"CA\"\n // match on Cloudflare/Vercel and never on Oxygen, since matchGeo compares\n // the whole string.\n geo: {\n country: firstHeader(\n request,\n \"oxygen-buyer-country\",\n \"cf-ipcountry\",\n \"x-vercel-ip-country\",\n ),\n region: firstHeader(\n request,\n \"oxygen-buyer-region-code\",\n \"cf-region-code\",\n \"x-vercel-ip-country-region\",\n ),\n },\n url: {\n path: requestUrl.pathname,\n query,\n // Public host — prefer the forwarded host over the received one so\n // self-referral detection works behind a proxy / preview domain, where\n // request.url carries the internal host (e.g. *.vercel.app) while the\n // browser typed the storefront domain. x-forwarded-host may be a comma\n // list and may carry a port.\n host: (\n firstHeader(request, \"x-forwarded-host\", \"host\") ?? requestUrl.hostname\n )\n .split(\",\")[0]\n .trim()\n .split(\":\")[0]\n .toLowerCase(),\n },\n referrer: request.headers.get(\"referer\") || undefined,\n };\n}\n","// Bounded regex matching for user-supplied cookie `matches_regex` patterns.\n// Mirrors backpack's server/app/services/audiences/safe-regex.ts — keep in sync.\n//\n// A true timeout on a synchronous regex isn't available at SSR without a worker,\n// so we bound the blast radius: cap the pattern and input lengths, and treat an\n// invalid pattern as \"no match\". Patterns are authored by admins (not end\n// users), so a catastrophic pattern would only affect the author's own tenant.\nexport const MAX_REGEX_PATTERN_LENGTH = 200;\nexport const MAX_REGEX_INPUT_LENGTH = 4096;\n\nexport function safeRegexMatch(\n pattern: string | undefined,\n input: string | undefined,\n): boolean {\n // Absent input (undefined) fails closed; a present-but-empty value (\"\") is a\n // valid regex target, so let it through — e.g. `^$` / `.*` can match it.\n if (!pattern || input === undefined) return false;\n if (\n pattern.length > MAX_REGEX_PATTERN_LENGTH ||\n input.length > MAX_REGEX_INPUT_LENGTH\n ) {\n return false;\n }\n\n try {\n return new RegExp(pattern).test(input);\n } catch {\n return false;\n }\n}\n","import { IdentityBundle } from \"../identity-bundle\";\nimport { safeRegexMatch } from \"../safe-regex\";\n\n// SSR evaluator for the \"cookie\" condition. Mirrors backpack's\n// server/app/services/audiences/conditions/cookie.ts — keep the operator\n// semantics in lockstep. Pure over the identity bundle's cookie jar (+ the\n// binary consent signal); no I/O.\n\n// Negation is expressed once, via the leaf-level `negate` toggle, so there are\n// no not_* operators here.\nexport const COOKIE_OPERATORS = [\n \"exists\",\n \"equals\",\n \"contains\",\n \"starts_with\",\n \"ends_with\",\n \"matches_regex\",\n] as const;\n\nexport type CookieOperator = (typeof COOKIE_OPERATORS)[number];\n\nexport interface CookieConfig {\n name?: string;\n op?: CookieOperator;\n value?: string;\n requireConsent?: boolean;\n}\n\nexport function evaluateCookie(\n config: CookieConfig | null | undefined,\n identity: IdentityBundle,\n): boolean {\n const name = config?.name;\n const op = config?.op;\n if (!name || !op) return false;\n\n // Consent gate: fail closed when consent is required but not granted.\n if (config?.requireConsent && !identity.hasConsent) return false;\n\n const value = identity.cookies?.[name]; // string | undefined\n const target = config?.value ?? \"\";\n\n switch (op) {\n case \"exists\":\n return value !== undefined && value !== \"\";\n case \"equals\":\n return value === target;\n case \"contains\":\n return value !== undefined && value.includes(target);\n case \"starts_with\":\n return value !== undefined && value.startsWith(target);\n case \"ends_with\":\n return value !== undefined && value.endsWith(target);\n case \"matches_regex\":\n return safeRegexMatch(target, value);\n default:\n return false;\n }\n}\n","import { PACK_SESSION_COOKIE_ID } from \"../../constants\";\nimport { PRIOR_VISIT_COOKIES } from \"../visitor-recency\";\nimport { IdentityBundle } from \"../identity-bundle\";\n\n// SDK-side evaluators for the `builtin` condition type, dispatched by\n// `config.key`. MIRRORS backpack's built-in definitions\n// (server/app/services/audiences/builtins/) — evaluation only; the admin\n// metadata + save-time validation live server-side. Keep the two in lockstep.\n// Missing signals resolve to the documented fallback; never throw.\n\ninterface BuiltinConfig {\n key?: string;\n value?: string;\n op?: string;\n param?: string;\n}\n\ntype BuiltinEvaluator = (\n config: BuiltinConfig,\n identity: IdentityBundle,\n) => boolean;\n\n// referrer_source implements GA4's Default Channel Group, collapsed to six\n// buckets. Medium rules are VERBATIM from GA4's published channel definitions\n// (https://support.google.com/analytics/answer/9756891); the SOURCE lists are a\n// curated subset of Google's source categories. Keep in lockstep with backpack's\n// built-in definitions.\nconst PAID_MEDIUM = /^(.*cp.*|ppc|retargeting|paid.*)$/;\nconst DISPLAY_MEDIUM = [\"display\", \"banner\", \"expandable\", \"interstitial\", \"cpm\"];\nconst SOCIAL_MEDIUM = [\"social\", \"social-network\", \"social-media\", \"sm\", \"social network\", \"social media\"];\nconst ORGANIC_VIDEO_MEDIUM = /^.*video.*$/;\nconst EMAIL_MEDIUM = /^(email|e-mail|e_mail|e mail)$/;\nconst REFERRAL_MEDIUM = [\"referral\", \"app\", \"link\"];\nconst SEARCH_SOURCES = [\n \"google\", \"bing\", \"yahoo\", \"duckduckgo\", \"baidu\", \"yandex\", \"ecosia\", \"ask.\",\n \"aol.\", \"naver\", \"daum\", \"brave\", \"startpage\", \"qwant\", \"sogou\", \"seznam\",\n];\nconst SOCIAL_SOURCES = [\n \"facebook\", \"fb.\", \"instagram\", \"tiktok\", \"pinterest\", \"pin.it\", \"linkedin\",\n \"lnkd.in\", \"reddit\", \"snapchat\", \"twitter\", \"x.com\", \"t.co\", \"tumblr\",\n \"threads\", \"whatsapp\", \"wechat\", \"weibo\", \"vk.\", \"quora\",\n];\n\nfunction hostFromReferrer(referrer: string | undefined): string {\n if (!referrer) return \"\";\n try {\n return new URL(referrer).hostname.toLowerCase();\n } catch {\n return \"\";\n }\n}\n\n// in_list / not_in_list values are a comma-delimited string — the shape the\n// audience builder's text field emits and backpack's evaluator/validator assume.\n// If this ever becomes a JSON array, update the UI field and both evaluators in\n// lockstep: a shape mismatch here degrades not_in_list to matching nobody\n// (the resolver swallows the thrown .split), silently.\nconst parseList = (value: string | undefined): string[] =>\n (value ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n// Geo match; a missing signal fails closed for every operator. An empty parsed\n// list also fails closed for not_in_list — otherwise a value that trims to\n// nothing (e.g. \",\" or \" \") would match EVERY geo-known visitor\n// (!list.includes ⇒ true), turning an \"exclude these\" audience into \"match\n// everyone\". The backend blocks such a value on save; this is the SDK's own\n// guard for any config that predates that validation. Mirrors backpack.\nfunction matchGeo(\n code: string | undefined,\n op: string | undefined,\n value: string | undefined,\n): boolean {\n if (!code) return false;\n const c = code.toUpperCase();\n const list = parseList(value).map((s) => s.toUpperCase());\n switch (op) {\n case \"equals\":\n return c === (value ?? \"\").trim().toUpperCase();\n case \"in_list\":\n return list.includes(c);\n case \"not_in_list\":\n return list.length > 0 && !list.includes(c);\n default:\n return false;\n }\n}\n\nfunction classifyReferrerSource(\n query: Record<string, string> | undefined,\n referrer: string | undefined,\n currentHost: string | undefined,\n): string {\n const medium = (query?.[\"utm_medium\"] ?? \"\").toLowerCase();\n const source = (query?.[\"utm_source\"] ?? \"\").toLowerCase();\n const stripWww = (h: string) => h.replace(/^www\\./, \"\");\n let host = hostFromReferrer(referrer);\n // A same-site (self) referrer isn't an external referral. Browsers send a\n // full same-origin Referer by default, so without this a \"Direct traffic\"\n // audience stops matching after the first page and a \"Referral traffic\"\n // audience matches nearly all internal navigation. Treat as self when the\n // hosts are equal or one is a subdomain of the other (www↔apex,\n // shop.example.com↔example.com). Label-anchored so \"evil-example.com\" isn't a\n // subdomain of \"example.com\"; sibling subdomains would need an eTLD+1 list.\n if (host && currentHost) {\n const a = stripWww(host);\n const b = stripWww(currentHost.toLowerCase());\n if (a === b || a.endsWith(\".\" + b) || b.endsWith(\".\" + a)) host = \"\";\n }\n // Match a host against category keys on domain-label boundaries — a plain\n // substring test put e.g. \"target.com\" in social (contains \"t.co\") and\n // \"flask.io\" in organic (contains \"ask.\"). Keys are brand labels\n // (\"facebook\"), short domains (\"t.co\"), or brand prefixes (\"fb.\"). The same\n // anchoring applies to utm_source below (a raw substring put full domains like\n // \"target.com\" in social, and the dot-strip widened \"ask.\" into \"flask\").\n const bareHost = stripWww(host);\n // Category keys may carry a trailing \".\" (brand prefixes like \"fb.\") — strip\n // it consistently for both the host and utm_source paths.\n const bareKey = (k: string) => (k.endsWith(\".\") ? k.slice(0, -1) : k);\n const hostInList = (list: string[]) =>\n !!bareHost &&\n list.some((k) => {\n const key = bareKey(k);\n return key.includes(\".\")\n ? bareHost === key || bareHost.endsWith(\".\" + key)\n : bareHost.split(\".\").includes(key);\n });\n // utm_source, token-matched on the same boundaries as the host: split on\n // domain/word separators so a bare key (\"fb\") matches a whole token but not a\n // substring (\"target.com\" no longer hits \"t.co\", \"flask\" no longer \"ask\"),\n // and a dotted key (\"t.co\") matches as a domain.\n const sourceInList = (list: string[]) => {\n if (!source) return false;\n const tokens = source.split(/[.\\-_ ]/);\n return list.some((k) => {\n const key = bareKey(k);\n return key.includes(\".\")\n ? source === key || source.endsWith(\".\" + key)\n : tokens.includes(key);\n });\n };\n const inCategory = (list: string[]) =>\n sourceInList(list) || hostInList(list);\n\n if (PAID_MEDIUM.test(medium) || DISPLAY_MEDIUM.includes(medium)) return \"paid\";\n if (SOCIAL_MEDIUM.includes(medium) || inCategory(SOCIAL_SOURCES)) return \"social\";\n if (medium === \"organic\" || ORGANIC_VIDEO_MEDIUM.test(medium) || inCategory(SEARCH_SOURCES)) return \"organic\";\n if (EMAIL_MEDIUM.test(medium) || EMAIL_MEDIUM.test(source)) return \"email\";\n // An external referrer, or any present-but-unrecognized medium OR source (sms,\n // push, newsletter, a custom utm_source, … — campaign traffic our six buckets\n // can't place) → referral, not direct. Deviates from GA4's \"Unassigned\";\n // direct is reserved for NO medium, NO source, and no referrer.\n if (\n medium === \"affiliate\" ||\n REFERRAL_MEDIUM.includes(medium) ||\n host ||\n medium ||\n source\n )\n return \"referral\";\n return \"direct\";\n}\n\nconst BUILTINS: Record<string, BuiltinEvaluator> = {\n // Logged in vs. guest — Shopify customer session presence.\n auth_status: (config, identity) => {\n const loggedIn = !!identity.shopifyCustomerId;\n if (config?.value === \"logged_in\") return loggedIn;\n if (config?.value === \"anonymous\") return !loggedIn;\n return false; // unrecognized value fails closed (backend blocks on save)\n },\n\n // Device type from the User-Agent; unknown falls back to desktop.\n device: (config, identity) =>\n (identity.deviceType ?? \"desktop\") === config?.value,\n\n // New vs. returning. The persistent prior-visit cookies say the visitor has\n // been here at some point, not whether THIS session is their first. The\n // rolling __pack_s marker carries that verdict (\"r\"/\"n\"), decided once at\n // session start in handle-request (see sessionVerdict in ../visitor-recency).\n // Mirror that writer's tri-state: \"r\"/\"n\" are authoritative; anything else (a\n // new session with no marker, or a tampered value) falls back to prior visits.\n // Missing signal → new.\n //\n // Consent note: this is the only built-in that reads cookies, and it does NOT\n // enforce a consent gate. _ga / _shopify_y only exist when analytics consent\n // was given, but Pack's own __pack / __pack_s are written on every response\n // regardless of consent (see handle-request), so a visitor who declined can\n // still be classified from them. Whether that is acceptable is a system-wide\n // consent-posture decision for the resolver/identity layer — flagged, not\n // enforced.\n visitor_recency: (config, identity) => {\n const cookies = identity.cookies ?? {};\n const priorVisit = PRIOR_VISIT_COOKIES.some((name) => !!cookies[name]);\n const session = cookies[PACK_SESSION_COOKIE_ID];\n const returning =\n session === \"r\" ? true : session === \"n\" ? false : priorVisit;\n if (config?.value === \"returning\") return returning;\n if (config?.value === \"new\") return !returning;\n return false; // unrecognized value fails closed (backend blocks on save)\n },\n\n // Country / region from the CDN geo signal; missing → no match.\n geo_country: (config, identity) =>\n matchGeo(identity.geo?.country, config?.op, config?.value),\n geo_region: (config, identity) =>\n matchGeo(identity.geo?.region, config?.op, config?.value),\n\n // Traffic source from utm_medium, then Referer host; else direct.\n referrer_source: (config, identity) =>\n classifyReferrerSource(\n identity.url?.query,\n identity.referrer,\n identity.url?.host,\n ) ===\n config?.value,\n\n // A specific UTM parameter on the current URL.\n utm_param: (config, identity) => {\n if (!config?.param) return false;\n // Tolerate a \"utm_\"-prefixed param, and compare case-insensitively — UTM\n // values are merchant/ad-platform authored and inconsistently cased\n // (utm_source=TikTok vs tiktok).\n const name = config.param.replace(/^utm_/, \"\");\n const v = identity.url?.query?.[`utm_${name}`]?.toLowerCase();\n switch (config?.op) {\n case \"exists\":\n return v !== undefined && v !== \"\";\n case \"equals\":\n // Guard the param exists — otherwise an equals with no configured value\n // matches every URL that LACKS the param (undefined === undefined).\n return v !== undefined && v === config?.value?.toLowerCase();\n case \"in_list\":\n return (\n v !== undefined &&\n parseList(config?.value)\n .map((s) => s.toLowerCase())\n .includes(v)\n );\n default:\n return false;\n }\n },\n};\n\nexport function evaluateBuiltin(\n config: BuiltinConfig | null | undefined,\n identity: IdentityBundle,\n): boolean {\n const evaluator = config?.key ? BUILTINS[config.key] : undefined;\n // Unknown key fails closed (the backend blocks it on save).\n return evaluator ? evaluator(config ?? {}, identity) : false;\n}\n","import { IdentityBundle } from \"./identity-bundle\";\nimport { evaluateCookie } from \"./conditions/cookie\";\nimport { evaluateBuiltin } from \"./conditions/builtin\";\n\n// SDK-side evaluator registry. Unlike backpack's registry (which also owns\n// metadata + config-schema validation for the builder), the SDK only needs to\n// evaluate: map a condition `type` to a function over the IdentityBundle.\n// Pure types (cookie/built-in) evaluate in-process; cohort delegates to backpack.\nexport type ConditionEvaluator = (\n config: Record<string, any> | null | undefined,\n identity: IdentityBundle,\n) => boolean | Promise<boolean>;\n\nconst evaluators = new Map<string, ConditionEvaluator>();\n\nexport function registerConditionEvaluator(\n type: string,\n evaluate: ConditionEvaluator,\n): void {\n if (evaluators.has(type)) {\n throw new Error(`Condition evaluator \"${type}\" is already registered.`);\n }\n evaluators.set(type, evaluate);\n}\n\nexport function getConditionEvaluator(\n type: string,\n): ConditionEvaluator | undefined {\n return evaluators.get(type);\n}\n\nexport function isConditionRegistered(type: string): boolean {\n return evaluators.has(type);\n}\n\n// Cookie: stateless name/op/value match over the identity bundle's cookie jar.\nregisterConditionEvaluator(\"cookie\", evaluateCookie);\n\n// Built-in: curated signals (device, auth, recency, …) dispatched by key.\nregisterConditionEvaluator(\"builtin\", evaluateBuiltin);\n","import { getConditionEvaluator } from \"./condition-registry\";\nimport { IdentityBundle } from \"./identity-bundle\";\nimport {\n AudienceRulesTree,\n RuleConditionNode,\n RuleGroupNode,\n} from \"./types\";\n\nexport interface MatchedCondition {\n type: string;\n provider?: string | null;\n // The leaf's config — lets debug surfaces distinguish same-type conditions.\n config?: Record<string, any> | null;\n // Whether the leaf was negated (matched because it did NOT apply).\n negate?: boolean | null;\n}\n\nexport interface AudienceResolution {\n matches: boolean;\n matchedConditions: MatchedCondition[];\n}\n\nfunction isEmptyRules(rules: unknown): boolean {\n return (\n rules == null ||\n (typeof rules === \"object\" &&\n !Array.isArray(rules) &&\n Object.keys(rules as object).length === 0)\n );\n}\n\nfunction isGroupNode(node: unknown): node is RuleGroupNode {\n return (\n !!node && typeof node === \"object\" && typeof (node as any).op === \"string\"\n );\n}\n\n/**\n * Evaluates an audience rules tree against an IdentityBundle at SSR. AND/OR\n * short-circuit; NOT (\"none of these\") matches when none of its children match;\n * leaves dispatch to their registered evaluator (with leaf `negate` applied). An\n * empty tree matches everyone. Unknown types + evaluator errors fail closed.\n */\nexport async function resolveRulesTree(\n rules: AudienceRulesTree | null | undefined,\n identity: IdentityBundle,\n): Promise<AudienceResolution> {\n const matchedConditions: MatchedCondition[] = [];\n\n if (isEmptyRules(rules)) {\n return { matches: true, matchedConditions };\n }\n\n const matches = await evaluateNode(rules, identity, matchedConditions);\n // Only surface matched conditions when the audience actually matched —\n // otherwise a `matches: false` result contradicts a populated list. Even on a\n // match the list is raw per-leaf truthiness: a leaf inside a NOT group that\n // the group then excludes can still appear.\n return { matches, matchedConditions: matches ? matchedConditions : [] };\n}\n\nasync function evaluateNode(\n node: unknown,\n identity: IdentityBundle,\n matched: MatchedCondition[],\n): Promise<boolean> {\n if (isGroupNode(node)) {\n const { op, children } = node;\n\n if (op === \"AND\") {\n for (const child of children) {\n if (!(await evaluateNode(child, identity, matched))) return false;\n }\n return true;\n }\n\n if (op === \"OR\") {\n for (const child of children) {\n if (await evaluateNode(child, identity, matched)) return true;\n }\n return false;\n }\n\n // NOT (\"none of these\") — matches iff none of the children match, i.e.\n // !(OR of children). A single child reduces to plain negation. Short-circuit\n // on the first match; an empty group fails closed. Mirrors backpack.\n if (!children?.length) return false;\n for (const child of children) {\n if (await evaluateNode(child, identity, matched)) return false;\n }\n return true;\n }\n\n return evaluateLeaf(node as RuleConditionNode, identity, matched);\n}\n\nasync function evaluateLeaf(\n leaf: RuleConditionNode,\n identity: IdentityBundle,\n matched: MatchedCondition[],\n): Promise<boolean> {\n const evaluate = getConditionEvaluator(leaf.type);\n\n // Unknown type at eval time (validation blocks this on save) → fail closed.\n if (!evaluate) return false;\n\n let result: boolean;\n try {\n result = await evaluate(leaf.config ?? {}, identity);\n } catch {\n result = false;\n }\n\n if (leaf.negate) result = !result;\n\n if (result) {\n matched.push({\n type: leaf.type,\n provider: leaf.provider ?? null,\n config: leaf.config ?? null,\n negate: leaf.negate ?? null,\n });\n }\n\n return result;\n}\n","import type { ActionFunctionArgs, LoaderFunctionArgs } from \"react-router\";\nimport { PackCustomizerMeta } from \"../create-pack-client\";\n\nconst ROOT_PATH = \"/\" as const;\n\ntype JsonFunction = <Data>(\n data: Data,\n init?: number | ResponseInit,\n) => TypedResponse<Data>;\n\ntype RedirectFunction = (url: string, init?: number | ResponseInit) => Response;\n\n// must be a type since this is a subtype of response\n// interfaces must conform to the types they extend\ntype TypedResponse<T = unknown> = Omit<Response, \"json\"> & {\n json(): Promise<T>;\n};\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A not found response. Sets the status code.\n */\nfunction notFound(message = \"Not Found\") {\n return new Response(message, { status: 404, statusText: \"Not Found\" });\n}\n\nfunction isLocalPath(request: Request, url: string) {\n // Our domain, based on the current request path\n const currentUrl = new URL(request.url);\n\n // If url is relative, the 2nd argument will act as the base domain.\n const urlToCheck = new URL(url, currentUrl.origin);\n\n // If the origins don't match the slug is not on our domain.\n return currentUrl.origin === urlToCheck.origin;\n}\n\n/**\n * A `POST` request to this route will exit preview mode\n * POST /api/edit Content-Type: application/x-www-form-urlencoded\n */\nexport async function action({ request, context }: ActionFunctionArgs) {\n const { session } = context.pack;\n\n if (!(request.method === \"POST\" && session)) {\n return json({ message: \"Method not allowed\" }, 405);\n }\n\n const body = await request.formData();\n const slug = (body.get(\"slug\") as string) ?? ROOT_PATH;\n const redirectTo = isLocalPath(request, slug) ? slug : ROOT_PATH;\n\n await session.destroy();\n\n return redirect(redirectTo);\n}\n\n/**\n * A `GET` request to this route will enter preview mode\n */\nexport async function loader({ request, context }: LoaderFunctionArgs) {\n const { pack } = context;\n\n if (!pack.session) return notFound();\n\n const { searchParams } = new URL(request.url);\n\n const token = searchParams.get(\"token\");\n const environment = searchParams.get(\"environment\");\n const path = searchParams.get(\"path\") ?? ROOT_PATH;\n const customizerMeta = searchParams.get(\"customizerMeta\");\n const redirectTo = isLocalPath(request, path) ? path : ROOT_PATH;\n\n if (!searchParams.has(\"token\")) {\n throw new MissingTokenError();\n }\n\n const validatedToken = await pack.isValidEditToken(token);\n\n if (!validatedToken) {\n throw new InvalidTokenError();\n }\n\n let customizerMetaJson: PackCustomizerMeta | null;\n let previewContext: PackCustomizerMeta[\"previewContext\"] | null = null;\n\n try {\n customizerMetaJson = customizerMeta\n ? (JSON.parse(customizerMeta) as PackCustomizerMeta)\n : null;\n\n previewContext = customizerMetaJson?.previewContext || null;\n } catch {\n customizerMetaJson = null;\n }\n\n // Store preview mode and environment\n pack.session.set(\"previewEnabled\", true);\n pack.session.set(\"environment\", environment);\n pack.session.set(\"customizerMeta\", customizerMetaJson);\n\n // Always reset preview context fields to prevent stale data from a previous\n // storefront session bleeding into the current one. This is critical when\n // switching between local storefronts on the same localhost origin, since\n // the __pack cookie persists across storefront switches.\n pack.session.set(\"locale\", previewContext?.locale ?? null);\n pack.session.set(\"releaseId\", previewContext?.releaseId ?? null);\n pack.session.set(\"pageDraft\", previewContext?.pageDraft ?? null);\n pack.session.set(\n \"siteSettingsDraft\",\n previewContext?.siteSettingsDraft ?? null,\n );\n pack.session.set(\"testHandle\", previewContext?.testHandle ?? null);\n pack.session.set(\n \"testVariantHandle\",\n previewContext?.testVariantHandle ?? null,\n );\n\n return redirect(redirectTo, {\n status: 307,\n });\n}\n\nclass MissingTokenError extends Response {\n constructor() {\n super(\"Missing token\", { status: 401, statusText: \"Unauthorized\" });\n }\n}\n\nclass InvalidTokenError extends Response {\n constructor() {\n super(\"Invalid token\", { status: 401, statusText: \"Unauthorized\" });\n }\n}\n","import { useLoaderData, useMatches, useRevalidator } from \"react-router\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\n\nimport { usePackTestContext } from \"./pack-test-context\";\nimport { Test } from \"./test\";\n\ntype TriggeredExposure = {\n packTestInfo: Test;\n exposureTime: number;\n};\n\ntype PackTestImpressionSelector =\n | string\n | string[]\n | ((packTestInfo: Test) => string | string[] | undefined);\n\nfunction getImpressionSectionSelectors(packTestInfo: Test): string[] {\n const sectionIds = packTestInfo.impression?.sectionIds || [];\n\n return [...new Set(sectionIds)].map(\n (sectionId) => `section[data-comp-id=\"${sectionId}\"]`,\n );\n}\n\nfunction getImpressionSelectors(\n packTestInfo: Test,\n impressionSelector?: PackTestImpressionSelector,\n): string[] {\n if (!impressionSelector) {\n return getImpressionSectionSelectors(packTestInfo);\n }\n\n const resolvedSelector =\n typeof impressionSelector === \"function\"\n ? impressionSelector(packTestInfo)\n : impressionSelector;\n\n if (!resolvedSelector) {\n return getImpressionSectionSelectors(packTestInfo);\n }\n\n return Array.isArray(resolvedSelector)\n ? resolvedSelector\n : [resolvedSelector];\n}\n\nfunction serializeExposedTestCookieValue(packTestInfo: Test): string {\n return JSON.stringify({\n id: packTestInfo.id,\n handle: packTestInfo.handle,\n testVariant: {\n id: packTestInfo.testVariant.id,\n handle: packTestInfo.testVariant.handle,\n },\n });\n}\n\nconst usePackLoaderData = <\n T extends {\n packTestInfo?: Test;\n },\n>(\n impressionSelector?: PackTestImpressionSelector,\n): void => {\n const [exposedTestInfo, setExposedTestInfo] = useState<Test | undefined>();\n const [triggeredExposure, setTriggeredExposure] = useState<\n TriggeredExposure | undefined\n >();\n\n let packTestInfo: Test | undefined;\n let packIsPreviewMode: boolean | undefined;\n let revalidator: ReturnType<typeof useRevalidator> | undefined;\n\n try {\n const loaderData = useLoaderData<T>();\n packTestInfo = loaderData?.packTestInfo;\n\n const [root] = useMatches();\n packIsPreviewMode =\n (\n root?.data as {\n packIsPreviewMode?: boolean;\n isPreviewModeEnabled?: boolean;\n }\n )?.packIsPreviewMode ||\n (\n root?.data as {\n packIsPreviewMode?: boolean;\n isPreviewModeEnabled?: boolean;\n }\n )?.isPreviewModeEnabled;\n\n revalidator = useRevalidator();\n } catch (error) {\n console.error(\"PackTestRoute router error:\", error);\n // Handle cases where router hooks are called outside of a data router\n packTestInfo = undefined;\n packIsPreviewMode = undefined;\n revalidator = undefined;\n }\n\n const {\n testExposureCallback,\n hasUserConsent,\n pendingExposureQueue,\n setPendingExposureQueue,\n } = usePackTestContext();\n\n const exposedTestCookieString = Cookies.get(\"exposedTest\");\n\n useEffect(() => {\n if (packTestInfo?.id !== triggeredExposure?.packTestInfo.id) {\n setTriggeredExposure(undefined);\n return;\n }\n\n if (\n packTestInfo?.testVariant?.id !==\n triggeredExposure?.packTestInfo.testVariant.id\n ) {\n setTriggeredExposure(undefined);\n }\n }, [triggeredExposure, packTestInfo]);\n\n useEffect(() => {\n if (\n !packTestInfo ||\n !!packIsPreviewMode ||\n !!exposedTestCookieString ||\n !!exposedTestInfo\n ) {\n return;\n }\n\n if (\n triggeredExposure?.packTestInfo.id === packTestInfo.id &&\n triggeredExposure.packTestInfo.testVariant.id ===\n packTestInfo.testVariant.id\n ) {\n return;\n }\n\n // If impressionTrigger is not ON_ELEMENT_VIEW (or is undefined), trigger\n // impression immediately on load for backward compatibility.\n if (\n packTestInfo.impressionTrigger !== \"ON_ELEMENT_VIEW\" ||\n typeof window === \"undefined\" ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n setTriggeredExposure({\n packTestInfo,\n exposureTime: Date.now(),\n });\n return;\n }\n\n const impressionSectionSelectors = getImpressionSelectors(\n packTestInfo,\n impressionSelector,\n );\n\n if (impressionSectionSelectors.length === 0) {\n console.warn(\n `[Pack Test] Test \"${packTestInfo.id}\" uses ON_ELEMENT_VIEW but has no selectors to observe. Impression will not be tracked.`,\n );\n return;\n }\n\n let isTriggered = false;\n const observedElements = new Set<Element>();\n let observer: IntersectionObserver | undefined;\n let mutationObserver: MutationObserver | undefined;\n let observerTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n observer?.disconnect();\n mutationObserver?.disconnect();\n if (observerTimeoutId) {\n clearTimeout(observerTimeoutId);\n }\n };\n\n const triggerImpression = () => {\n if (isTriggered) return;\n isTriggered = true;\n cleanup();\n setTriggeredExposure({\n packTestInfo,\n exposureTime: Date.now(),\n });\n };\n\n const observeMatchingElements = () => {\n if (!observer || isTriggered) return;\n\n impressionSectionSelectors.forEach((selector) => {\n document.querySelectorAll(selector).forEach((element) => {\n if (observedElements.has(element)) return;\n observedElements.add(element);\n observer?.observe(element);\n });\n });\n\n if (observedElements.size > 0) {\n mutationObserver?.disconnect();\n mutationObserver = undefined;\n if (observerTimeoutId) {\n clearTimeout(observerTimeoutId);\n observerTimeoutId = undefined;\n }\n }\n };\n\n observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n triggerImpression();\n }\n },\n { threshold: 0.1 },\n );\n\n observeMatchingElements();\n\n if (\n !isTriggered &&\n observedElements.size === 0 &&\n typeof MutationObserver !== \"undefined\"\n ) {\n mutationObserver = new MutationObserver(() => {\n observeMatchingElements();\n });\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n observerTimeoutId = setTimeout(() => {\n if (!isTriggered && observedElements.size === 0) {\n console.warn(\n `[Pack Test] Impression target not found within 30s for test \"${packTestInfo.id}\". Stopping observer.`,\n );\n cleanup();\n }\n }, 30000);\n }\n\n return cleanup;\n }, [\n triggeredExposure,\n exposedTestCookieString,\n exposedTestInfo,\n packIsPreviewMode,\n packTestInfo,\n impressionSelector,\n ]);\n\n useEffect(() => {\n if (\n triggeredExposure &&\n !packIsPreviewMode &&\n !hasUserConsent &&\n !exposedTestCookieString\n ) {\n // Add to the pending exposure queue if no user consent\n setPendingExposureQueue?.((prev) => {\n if (prev.has(triggeredExposure.packTestInfo.id)) return prev;\n const nextQueue = new Map(prev);\n nextQueue.set(triggeredExposure.packTestInfo.id, triggeredExposure);\n return nextQueue;\n });\n }\n }, [\n triggeredExposure,\n hasUserConsent,\n packIsPreviewMode,\n exposedTestCookieString,\n setPendingExposureQueue,\n ]);\n\n useEffect(() => {\n if (\n triggeredExposure &&\n hasUserConsent &&\n !exposedTestCookieString &&\n !packIsPreviewMode &&\n !exposedTestInfo\n ) {\n const { packTestInfo: activeTestInfo, exposureTime } = triggeredExposure;\n\n // Set exposedTest cookie used by server to determine if session has been exposed to test\n const expires = new Date();\n expires.setHours(expires.getHours() + 24);\n\n Cookies.set(\n \"exposedTest\",\n serializeExposedTestCookieValue(activeTestInfo),\n {\n expires,\n },\n );\n\n setExposedTestInfo(activeTestInfo);\n\n // Need to go through current exposure tracking callback queue\n // call tracking callbacks for previous exposures\n pendingExposureQueue?.forEach((data, key) => {\n if (key === activeTestInfo.id) return;\n try {\n testExposureCallback?.({\n ...data.packTestInfo,\n exposureTime: data.exposureTime,\n });\n } catch (error) {\n console.error(\"Failed to call testExposure after consent:\", error);\n }\n });\n\n testExposureCallback?.({ ...activeTestInfo, exposureTime });\n setPendingExposureQueue?.(new Map());\n\n // TODO: This results in flashing of UI driven by site settings data.\n // Need non-flashing solution.\n // Delay revalidation to avoid v3_lazyRouteDiscovery race condition bug\n // See: https://github.com/remix-run/remix/issues/10263\n setTimeout(() => {\n revalidator?.revalidate();\n }, 750);\n }\n }, [\n triggeredExposure,\n exposedTestCookieString,\n pendingExposureQueue,\n testExposureCallback,\n exposedTestInfo,\n hasUserConsent,\n packIsPreviewMode,\n setPendingExposureQueue,\n ]);\n\n useEffect(() => {\n if (\n !!triggeredExposure ||\n !hasUserConsent ||\n !!packIsPreviewMode ||\n !pendingExposureQueue?.size ||\n !!exposedTestCookieString\n ) {\n return;\n }\n\n let firstQueuedTest: Test | undefined;\n\n pendingExposureQueue.forEach((data) => {\n if (!firstQueuedTest) {\n firstQueuedTest = data.packTestInfo;\n }\n\n try {\n testExposureCallback?.({\n ...data.packTestInfo,\n exposureTime: data.exposureTime,\n });\n } catch (error) {\n console.error(\n \"Failed to call queued testExposure after consent:\",\n error,\n );\n }\n });\n\n if (firstQueuedTest) {\n const expires = new Date();\n expires.setHours(expires.getHours() + 24);\n\n Cookies.set(\n \"exposedTest\",\n serializeExposedTestCookieValue(firstQueuedTest),\n {\n expires,\n },\n );\n\n setExposedTestInfo(firstQueuedTest);\n }\n\n setPendingExposureQueue?.(new Map());\n }, [\n triggeredExposure,\n exposedTestCookieString,\n hasUserConsent,\n packIsPreviewMode,\n pendingExposureQueue,\n setPendingExposureQueue,\n testExposureCallback,\n ]);\n};\n\ntype PackTestRouteProps = {\n impressionSelector?: PackTestImpressionSelector;\n};\n\nexport const PackTestRoute = ({\n impressionSelector,\n}: PackTestRouteProps = {}) => {\n usePackLoaderData(impressionSelector);\n\n return null;\n};\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","import { createContext, useContext, Dispatch, SetStateAction } from \"react\";\n\nexport interface Test {\n id: string;\n handle: string;\n impressionTrigger?: string;\n testVariant: {\n id: string;\n handle: string;\n };\n impression?: {\n sectionIds?: string[];\n };\n}\n\ninterface TestExposureCallbackArg extends Test {\n exposureTime: number;\n}\n\ntype PackTestContextValue = {\n testExposureCallback?: (test: TestExposureCallbackArg) => void;\n hasUserConsent?: boolean | undefined;\n pendingExposureQueue?: Map<any, any>;\n setPendingExposureQueue?: Dispatch<SetStateAction<Map<any, any>>>;\n exposedExperiments?: Set<unknown>;\n};\n\nexport const PackTestContext = createContext<PackTestContextValue>({});\n\nexport const usePackTestContext = () => useContext(PackTestContext);\n","import React, { useState, PropsWithChildren } from \"react\";\nimport { PackTestContext, Test } from \"./pack-test-context\";\n\ninterface PackContentProps {\n testExposureCallback?: (test: Test) => void;\n hasUserConsent?: boolean;\n}\n\nexport function PackTestProvider({\n children,\n testExposureCallback,\n hasUserConsent = false,\n}: PropsWithChildren<PackContentProps>) {\n const [pendingExposureQueue, setPendingExposureQueue] = useState(new Map());\n const [exposedExperiments] = useState(new Set());\n\n return (\n <PackTestContext.Provider\n value={{\n testExposureCallback: (test) => {\n testExposureCallback && testExposureCallback(test);\n },\n hasUserConsent,\n pendingExposureQueue,\n setPendingExposureQueue,\n exposedExperiments,\n }}\n >\n {children}\n </PackTestContext.Provider>\n );\n}\n","import { Test } from \"./test\";\nimport { useRouteLoaderData } from \"react-router\";\n\nexport function useAbTest(): Test | null {\n // @ts-ignore\n const { abTest, packAbTest } = useRouteLoaderData(\"root\");\n\n if (abTest === undefined && packAbTest === undefined) {\n throw new Error(\n \"ERR_HY_MISSING_AB_TEST_CONTEXT: No A/B test found, are you sure you have call ...pack.getPackContextData() on root loader return? Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_AB_TEST_CONTEXT\"\n );\n }\n\n return abTest || packAbTest;\n}\n\nexport function useAbTestSessionId(): string {\n // @ts-ignore\n const { sessionId, packSessionId } = useRouteLoaderData(\"root\");\n\n if (!sessionId && !packSessionId) {\n throw new Error(\n \"ERR_HY_MISSING_SESSION_ID: No Session ID found, are you sure you have call ...pack.getPackContextData() on root loader return? Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_SESSION_ID\"\n );\n }\n\n return sessionId || packSessionId;\n}\n\nexport function useAbTestId(): string | undefined {\n const test = useAbTest();\n\n return test?.id;\n}\n\nexport function useAbTestHandle(): string | undefined {\n const test = useAbTest();\n\n return test?.handle;\n}\n\nexport function useAbTestVariantId(): string | undefined {\n const test = useAbTest();\n\n return test?.testVariant?.id;\n}\n\nexport function useAbTestVariantHandle(): string | undefined {\n const test = useAbTest();\n\n return test?.testVariant?.handle;\n}\n"],"mappings":"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","names":["parse","serialize","decode","window","undefined","regexes","ua","parser","parse","createDebug","hash","debug","self","curry","keys","Fact","getCacheKey","debug","Condition","stringify","clone","parent","depth","RuleResult","stringify","ReflectApply","ReflectOwnKeys","NumberIsNaN","once","keys","self","Rule","stringify","evaluateCondition","evaluateConditions","prioritizeAndRun","_loop","i","any","all","processResult","Operator","self","UndefinedFactError","i","self","toString","Almanac","factValue","SuccessEventFact","self","Engine","import_cookie","hash","defaultValidate","locale","parseAcceptLanguage","languageHeaderValue","options","ignoreWildcard","validate","split","map","lang","q","trimmedLocale","trim","numQ","Number","replace","isNaN","sort","q1","q2","flatMap","action","parser","sendEvent","cookie","hash","crypto","handleRequest","cookie","import_cookie","hasUserConsent","createCookie","createCookieSessionStorage","createDebug","createCookieSessionStorage","createCookie","cookie","cookie","import_debug","cookie","debug","createDebug","import_debug","debug","createDebug","URL","resp","_isFirstExposure","testDataWithoutFlag","result","import_debug","debug","createDebug","sha256","hash","URL","resp","handleRequest","request","token","init","converter","useEffect","hasUserConsent","useEffect","useState","hasUserConsent","useState"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/cookie/index.js","../../../node_modules/ua-parser-js/src/ua-parser.js","../../../node_modules/ms/index.js","../../../node_modules/debug/src/common.js","../../../node_modules/debug/src/browser.js","../src/handle-request.ts","../../packlytics/dist/utils/get-packlytics-id.js","../../../node_modules/intl-parse-accept-language/src/index.ts","../../packlytics/dist/utils/get-headers.js","../../packlytics/dist/utils/get-client-locales.js","../../packlytics/dist/utils/sanatize-payload.js","../../packlytics/dist/utils/send-event.js","../../packlytics/dist/utils/page-hit.js","../../packlytics/dist/utils/get-client-device.js","../../packlytics/dist/packlytics.js","../../packlytics/dist/utils/get-client-location.js","../src/session/consent.ts","../src/constants.ts","../src/session/cookies-utils.tsx","../src/session/consent-endpoint.ts","../src/audiences/visitor-recency.ts","../src/session/usePackCookies.ts","../src/session/session.ts","../src/session/test-session.ts","../src/create-pack-client.ts","../src/tests/test.ts","../src/tests/local-test-resolver.ts","../src/tests/impression.ts","../src/audiences/identity-bundle.ts","../src/audiences/safe-regex.ts","../src/audiences/conditions/cookie.ts","../src/audiences/conditions/builtin.ts","../src/audiences/condition-registry.ts","../src/audiences/capabilities.ts","../src/audiences/audience-resolver.ts","../src/tests/query-surfaces.ts","../src/tests/seeded-bucket.ts","../src/tests/rule-evaluator.ts","../src/tests/customer-context.ts","../src/tests/exposed-tests.ts","../src/preview/preview-mode.tsx","../src/tests/pack-test-route.tsx","../../../node_modules/js-cookie/dist/js.cookie.mjs","../src/tests/pack-test-context.ts","../src/tests/pack-test-provider.tsx","../src/tests/hooks.ts"],"sourcesContent":["/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar __toString = Object.prototype.toString\nvar __hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n * which has been replaced by the token definition in RFC 7230 appendix B.\n *\n * cookie-name = token\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n */\n\nvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n/**\n * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n *\n * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n * ; US-ASCII characters excluding CTLs,\n * ; whitespace DQUOTE, comma, semicolon,\n * ; and backslash\n */\n\nvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n/**\n * RegExp to match domain-value in RFC 6265 sec 4.1.1\n *\n * domain-value = <subdomain>\n * ; defined in [RFC1034], Section 3.5, as\n * ; enhanced by [RFC1123], Section 2.1\n * <subdomain> = <label> | <subdomain> \".\" <label>\n * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n * Labels must be 63 characters or less.\n * 'let-dig' not 'letter' in the first char, per RFC1123\n * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n * <let-dig-hyp> = <let-dig> | \"-\"\n * <let-dig> = <letter> | <digit>\n * <letter> = any one of the 52 alphabetic characters A through Z in\n * upper case and a through z in lower case\n * <digit> = any one of the ten digits 0 through 9\n *\n * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n *\n * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n * character is not permitted, but a trailing %x2E (\".\"), if present, will\n * cause the user agent to ignore the attribute.)\n */\n\nvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n/**\n * RegExp to match path-value in RFC 6265 sec 4.1.1\n *\n * path-value = <any CHAR except CTLs or \";\">\n * CHAR = %x01-7F\n * ; defined in RFC 5234 appendix B.1\n */\n\nvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [opt]\n * @return {object}\n * @public\n */\n\nfunction parse(str, opt) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {};\n var len = str.length;\n // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n if (len < 2) return obj;\n\n var dec = (opt && opt.decode) || decode;\n var index = 0;\n var eqIdx = 0;\n var endIdx = 0;\n\n do {\n eqIdx = str.indexOf('=', index);\n if (eqIdx === -1) break; // No more cookie pairs.\n\n endIdx = str.indexOf(';', index);\n\n if (endIdx === -1) {\n endIdx = len;\n } else if (eqIdx > endIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(';', eqIdx - 1) + 1;\n continue;\n }\n\n var keyStartIdx = startIndex(str, index, eqIdx);\n var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n var key = str.slice(keyStartIdx, keyEndIdx);\n\n // only assign once\n if (!__hasOwnProperty.call(obj, key)) {\n var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n valStartIdx++;\n valEndIdx--;\n }\n\n var val = str.slice(valStartIdx, valEndIdx);\n obj[key] = tryDecode(val, dec);\n }\n\n index = endIdx + 1\n } while (index < len);\n\n return obj;\n}\n\nfunction startIndex(str, index, max) {\n do {\n var code = str.charCodeAt(index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n } while (++index < max);\n return max;\n}\n\nfunction endIndex(str, index, min) {\n while (index > min) {\n var code = str.charCodeAt(--index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n }\n return min;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize a name value pair into a cookie string suitable for\n * http headers. An optional options object specifies cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [opt]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, opt) {\n var enc = (opt && opt.encode) || encodeURIComponent;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!cookieNameRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (!cookieValueRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n if (!opt) return str;\n\n if (null != opt.maxAge) {\n var maxAge = Math.floor(opt.maxAge);\n\n if (!isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + maxAge;\n }\n\n if (opt.domain) {\n if (!domainValueRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!pathValueRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n var expires = opt.expires\n\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + expires.toUTCString()\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.partitioned) {\n str += '; Partitioned'\n }\n\n if (opt.priority) {\n var priority = typeof opt.priority === 'string'\n ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case 'low':\n str += '; Priority=Low'\n break\n case 'medium':\n str += '; Priority=Medium'\n break\n case 'high':\n str += '; Priority=High'\n break\n default:\n throw new TypeError('option priority is invalid')\n }\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * URL-decode string value. Optimized to skip native call when no %.\n *\n * @param {string} str\n * @returns {string}\n */\n\nfunction decode (str) {\n return str.indexOf('%') !== -1\n ? decodeURIComponent(str)\n : str\n}\n\n/**\n * Determine if value is a Date.\n *\n * @param {*} val\n * @private\n */\n\nfunction isDate (val) {\n return __toString.call(val) === '[object Date]';\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.37\n Copyright © 2012-2021 Faisal Salman <f@faisalman.com>\n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.37',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 500;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook',\n CHROMIUM_OS = 'Chromium OS',\n MAC_OS = 'Mac OS';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant|iemobile|slim)\\s?(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(heytap|ovi)browser\\/([\\d\\.]+)/i, // Heytap/Ovi\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 ' + BROWSER]], [\n /(oculus|sailfish|huawei|vivo)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, 'Sogou Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, 'Sogou Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/2345 Browser\n ], [NAME, VERSION], [\n /(lbbrowser)/i, // LieBao Browser\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /(Klarna)\\/([\\w\\.]+)/i, // Klarna Shopping Browser for iOS & Android\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(chromium|instagram|snapchat)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram/Snapchat\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w(\\.|\\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i, // Links\n /panasonic;(viera)/i // Panasonic Viera\n ], [NAME, VERSION], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /master.|lts./, \"\"]]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)(?:\\/|;)/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /oid[^\\)]+; (2\\d{4}(283|rpbf)[cgl])( bui|\\))/i, // Redmi Pad\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mitv-\\w{5}) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2| pro)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n /\\b(libweb)/i\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i // Windows Phone\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /windows nt 6\\.2; (arm)/i, // Windows RT\n /windows[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i,\n /(?:win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv\\/|iphone.+ios[\\/ ])([\\d\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, CHROMIUM_OS], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;\n var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);\n var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n var _isSelfNav = _navigator && _navigator.userAgent == _ua;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser[MAJOR] = majorize(_browser[VERSION]);\n // Brave-specific detection\n if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {\n _browser[NAME] = 'Brave';\n }\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {\n _device[TYPE] = MOBILE;\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {\n _device[MODEL] = 'iPad';\n _device[TYPE] = TABLET;\n }\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {\n _os[NAME] = _uach.platform \n .replace(/chrome os/i, CHROMIUM_OS)\n .replace(/macos/i, MAC_OS); // backward compatibility\n }\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","import cookie from \"cookie\";\nimport { packlytics } from \"@pack/packlytics\";\nimport type { Pack } from \"./create-pack-client\";\nimport { isSafari } from \"./session/cookies-utils\";\nimport {\n handleConsentRequest,\n isConsentRequest,\n} from \"./session/consent-endpoint\";\nimport {\n sessionVerdict,\n sessionMarkerSetCookie,\n} from \"./audiences/visitor-recency\";\nimport createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:handle-request\");\n\n/**\n * Append a committed session cookie, or drop it rather than fail the request.\n *\n * React Router's cookie serializer throws once a cookie would exceed the ~4KB\n * browser maximum, and this runs on the response path — so an unguarded commit\n * turns an oversized cookie into a 500 for the whole page. It also repeats: the\n * failed commit writes nothing, so the next request rebuilds the same oversized\n * cookie and throws again, leaving that visitor stuck until their cookie expires.\n *\n * Dropping the write is the right degradation — a cookie that cannot serialize\n * must not cost the page.\n *\n * The assignment path can no longer be the cause: `setAssignment` refuses over\n * `MAX_SESSION_PAYLOAD_BYTES` before an assignment is ever made, so a test that\n * would not fit is never served and never owes an exposure. Reaching this catch\n * therefore means some *other* key outgrew the cookie — the `__pack` session,\n * `customizerMeta`, or anything else committed alongside. Look there rather\n * than at variant stability.\n */\nasync function appendSessionCookie(\n response: Response,\n label: string,\n commit: () => Promise<string>,\n): Promise<void> {\n try {\n response.headers.append(\"Set-Cookie\", await commit());\n } catch (error) {\n debug(`[Pack] Failed to commit the ${label} cookie:`, error);\n console.error(\n `[Pack] Failed to commit the ${label} cookie, continuing without it. The visitor keeps their previous cookie, so anything written on this response is missing from it. Test assignments are bounded before they are written, so this points at a different oversized key in the session rather than at the assignment map:`,\n error,\n );\n }\n}\n\nexport async function handleRequest(\n pack: Pack,\n request: Request,\n handleRequest: (request: Request) => Promise<Response>,\n): Promise<Response> {\n const packHandleResponse = await pack.handleRequest(request);\n const omitSecure =\n isSafari(request.headers.get(\"User-Agent\")) &&\n process.env.NODE_ENV === \"development\";\n\n let response: Response;\n\n if (isConsentRequest(request)) {\n response = await handleConsentRequest(pack.session, request, omitSecure);\n } else {\n response = await packlytics(pack, request, () => {\n return handleRequest(request);\n });\n }\n\n packHandleResponse(response);\n\n response.headers.append(\"powered-by\", \"Shopify, Hydrogen + Pack Digital\");\n await appendSessionCookie(response, \"pack session\", () => pack.session.commit());\n // Rolling session marker carrying the visitor's new/returning verdict for the\n // `visitor_recency` built-in. The verdict is decided once when a session\n // starts and preserved while the marker is present, refreshed every response\n // so the session lapses only after PACK_SESSION_MAX_AGE of inactivity (see\n // sessionVerdict / sessionMarkerSetCookie). Attributes mirror __pack so the\n // marker is visible wherever __pack is (incl. the cross-site customizer\n // iframe).\n const incoming = cookie.parse(request.headers.get(\"Cookie\") || \"\");\n response.headers.append(\n \"Set-Cookie\",\n sessionMarkerSetCookie(sessionVerdict(incoming), omitSecure),\n );\n\n if (pack.testSession && pack.testSession.hasChanges()) {\n const testSession = pack.testSession;\n await appendSessionCookie(response, \"test session\", () =>\n testSession.commit(),\n );\n }\n\n return response;\n}\n","function sha256(ascii) {\n function rightRotate(value, amount) {\n return (value >>> amount) | (value << (32 - amount));\n }\n const mathPow = Math.pow;\n const maxWord = mathPow(2, 32);\n const lengthProperty = \"length\";\n let i, j; // Used as a counter across the whole file\n let result = \"\";\n const words = [];\n const asciiBitLength = ascii[lengthProperty] * 8;\n //* caching results is optional - remove/add slash from front of this line to toggle\n // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\n // (we actually calculate the first 64, but extra values are just ignored)\n // @ts-ignore\n let hash = (sha256.h = sha256.h || []);\n // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\n // @ts-ignore\n const k = (sha256.k = sha256.k || []);\n let primeCounter = k[lengthProperty];\n /*/\n var hash = [], k = [];\n var primeCounter = 0;\n //*/\n const isComposite = {};\n for (let candidate = 2; primeCounter < 64; candidate++) {\n // @ts-ignore\n if (!isComposite[candidate]) {\n for (i = 0; i < 313; i += candidate) {\n // @ts-ignore\n isComposite[i] = candidate;\n }\n hash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0;\n k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0;\n }\n }\n ascii += \"\\x80\"; // Append Ƈ' bit (plus zero padding)\n while ((ascii[lengthProperty] % 64) - 56)\n ascii += \"\\x00\"; // More zero padding\n for (i = 0; i < ascii[lengthProperty]; i++) {\n j = ascii.charCodeAt(i);\n if (j >> 8)\n return; // ASCII check: only accept characters in range 0-255\n words[i >> 2] |= j << (((3 - i) % 4) * 8);\n }\n words[words[lengthProperty]] = (asciiBitLength / maxWord) | 0;\n words[words[lengthProperty]] = asciiBitLength;\n // process each chunk\n for (j = 0; j < words[lengthProperty];) {\n const w = words.slice(j, (j += 16)); // The message is expanded into 64 words as part of the iteration\n const oldHash = hash;\n // This is now the undefinedworking hash\", often labelled as variables a...g\n // (we have to truncate as well, otherwise extra entries at the end accumulate\n hash = hash.slice(0, 8);\n for (i = 0; i < 64; i++) {\n const i2 = i + j;\n // Expand the message into 64 words\n // Used below if\n const w15 = w[i - 15], w2 = w[i - 2];\n // Iterate\n const a = hash[0], e = hash[4];\n const temp1 = hash[7] +\n (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + // S1\n ((e & hash[5]) ^ (~e & hash[6])) + // ch\n k[i] +\n // Expand the message schedule if needed\n (w[i] =\n i < 16\n ? w[i]\n : (w[i - 16] +\n (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) + // s0\n w[i - 7] +\n (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10))) | // s1\n 0);\n // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\n const temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + // S0\n ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj\n hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\n hash[4] = (hash[4] + temp1) | 0;\n }\n for (i = 0; i < 8; i++) {\n hash[i] = (hash[i] + oldHash[i]) | 0;\n }\n }\n for (i = 0; i < 8; i++) {\n for (j = 3; j + 1; j--) {\n const b = (hash[i] >> (j * 8)) & 255;\n result += (b < 16 ? 0 : \"\") + b.toString(16);\n }\n }\n return result;\n}\nfunction createHash(data) {\n const hash = sha256(data);\n return [\n hash?.substring(0, 8),\n hash?.substring(8, 12),\n hash?.substring(12, 16),\n hash?.substring(16, 20),\n hash?.substring(20, 32),\n ].join(\"-\");\n}\n/**\n * Generates a UUID from the user data, such as user-agent and IP Address + Salt\n * The salt is generated on the currante date + a Secret from the StoreFront,\n * So this UUID will be regenerated every day.\n *\n * We can never use this id to trace back users for GDPR compliance.\n *\n * @param data\n * @param secret\n */\nexport function getPacklyticsId(data, secret) {\n const currentDate = new Date();\n const formattedDate = currentDate.toLocaleDateString(\"en-US\");\n const salt = sha256(formattedDate + secret);\n return createHash(data + salt);\n}\n","export type Options = {\n /**\n * A validate callback that is called for each `locale`. If the `locale` is valid, return the `locale` as a string.\n * Otherwise return `undefined`, `null`, or an empty Array.\n * Should the callback throw an error, the error will be caught and the `locale` will be ignored.\n */\n validate?: (locale: string) => string | string[] | null | undefined;\n\n /**\n * If set to `true`, the wildcard locale `*` will be returned in the array.\n * If set to `false`, the wildcard locale `*` will be ignored.\n * Defaults to `true`.\n */\n ignoreWildcard?: boolean;\n};\n\nconst defaultValidate = (locale: string) => locale;\n\nexport const parseAcceptLanguage = (\n /** The value from the `Accept-Language` header.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language\n */\n languageHeaderValue: string | null | undefined,\n options: Options = {}\n): string[] => {\n if (!languageHeaderValue) return [];\n const { ignoreWildcard = true, validate = defaultValidate } = options;\n\n return languageHeaderValue\n .split(',')\n .map((lang): [number, string] => {\n const [locale, q = 'q=1'] = lang.split(';');\n const trimmedLocale = locale.trim();\n const numQ = Number(q.replace(/q ?=/, ''));\n if (isNaN(numQ)) return [0, trimmedLocale];\n return [numQ, trimmedLocale];\n })\n .sort(([q1], [q2]) => q2 - q1)\n .flatMap(([_, locale]) => {\n if (locale === '*' && ignoreWildcard) return [];\n try {\n return validate(locale) || [];\n // return Intl.DateTimeFormat.supportedLocalesOf(locale);\n } catch {\n return [];\n }\n });\n};\n","export function getHeaders(requestOrHeaders) {\n if (requestOrHeaders instanceof Request) {\n return requestOrHeaders.headers;\n }\n return requestOrHeaders;\n}\n","import { parseAcceptLanguage } from \"intl-parse-accept-language\";\nimport { getHeaders } from \"./get-headers.js\";\nexport function getClientLocales(requestOrHeaders) {\n let headers = getHeaders(requestOrHeaders);\n let acceptLanguage = headers.get(\"Accept-Language\");\n // if the header is not defined, return undefined\n if (!acceptLanguage)\n return undefined;\n let locales = parseAcceptLanguage(acceptLanguage, {\n validate: Intl.DateTimeFormat.supportedLocalesOf,\n ignoreWildcard: true,\n });\n // if there are no locales found, return undefined\n if (locales.length === 0)\n return undefined;\n // if there are multiple locales, return the array\n return locales;\n}\n","// Generic list of potential sensitive payload data\nexport const sanitizePayload = (data) => {\n let dataStr = JSON.stringify(data);\n const sensitiveFields = [\n \"username\",\n \"user\",\n \"user_id\",\n \"userid\",\n \"password\",\n \"pass\",\n \"pin\",\n \"passcode\",\n \"token\",\n \"api_token\",\n \"email\",\n \"address\",\n \"phone\",\n \"sex\",\n \"gender\",\n \"order\",\n \"order_id\",\n \"orderid\",\n \"payment\",\n \"credit_card\",\n ];\n sensitiveFields.forEach((field) => {\n dataStr = dataStr.replaceAll(new RegExp(`(\"${field}\"):(\".+?\"|\\\\d+)`, \"mgi\"), '$1:\"********\"');\n });\n return dataStr;\n};\n","import { sanitizePayload } from \"./sanatize-payload\";\nlet metadata = null;\nconst getPacklyticsMetadata = async () => {\n if (metadata)\n return;\n try {\n const response = await fetch(\"https://cdn.packlytics.packdigital.com/metadata.json\", {\n headers: {\n \"User-Agent\": \"packlytics-js\",\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n });\n if (response.ok) {\n metadata = await response.json();\n }\n else {\n console.error(\"Error getting Packlytics metadata:\", response.statusText);\n }\n }\n catch (error) {\n // @ts-ignore\n console.error(\"Error getting Packlytics metadata:\", error.message);\n }\n};\nexport const sendEvent = (storefrontId, sessionId) => {\n return async (action, eventPayload) => {\n const sanitizedEventPayload = sanitizePayload({\n ...eventPayload,\n });\n await getPacklyticsMetadata();\n if (!metadata) {\n console.warn(\"Pack event not sent: packlytics medatada is missing\");\n return;\n }\n // implement localization and add EU\n const analyticsData = metadata[\"us\"] || metadata[\"default\"];\n if (!analyticsData.token) {\n console.warn(\"Pack event not sent: api token is missing\");\n return;\n }\n const dataSourceName = metadata[\"dataSourceName\"] || \"analytics_events\";\n const endpointUrl = `${analyticsData.endpoint}/${analyticsData.version}/events?name=${dataSourceName}`;\n // qualified event data with payload and session id\n const eventData = {\n timestamp: new Date().toISOString(),\n action,\n version: \"1\",\n storefront_id: storefrontId || \"unknown\",\n session_id: sessionId,\n payload: sanitizedEventPayload,\n };\n return fetch(endpointUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${analyticsData.token}`,\n },\n body: JSON.stringify(eventData),\n });\n };\n};\n","import { sendEvent } from \"./send-event\";\nexport const trackPageHit = (storefrontId, sessionId) => {\n return (eventPayload = {}) => {\n return sendEvent(storefrontId, sessionId)(\"page_hit\", eventPayload);\n };\n};\n","import parser from \"ua-parser-js\";\nexport function getDevice(userAgent) {\n const userAgentData = parser(userAgent);\n return {\n deviceType: userAgentData.device.type || \"desktop\",\n deviceModel: userAgentData.device.model || \"unknown\",\n deviceVendor: userAgentData.device.vendor || \"unknown\",\n os: userAgentData.os.name || \"unknown\",\n osVersion: userAgentData.os.version || \"unknown\",\n browser: userAgentData.browser.name || \"unknown\",\n browserVersion: userAgentData.browser.version || \"unknown\",\n engine: userAgentData.engine.name || \"unknown\",\n engineVersion: userAgentData.engine.version || \"unknown\",\n cpu: userAgentData.cpu.architecture || \"unknown\",\n };\n}\n","import { getPacklyticsId } from \"./utils/get-packlytics-id\";\nimport { getClientLocales } from \"./utils/get-client-locales\";\nimport { trackPageHit } from \"./utils/page-hit\";\nimport { getDevice } from \"./utils/get-client-device\";\nimport { getStorefrontHeaders } from \"@shopify/hydrogen/oxygen\";\nimport { getClientLocation } from \"./utils/get-client-location\";\nexport async function sendEvent(request, session, params) {\n if (process.env.NODE_ENV === \"development\") {\n return;\n }\n // Preview enabled\n if (!!session.get(\"previewEnabled\")) {\n return;\n }\n const payload = await request.json();\n const url = new URL(request.url);\n const ipaddress = getStorefrontHeaders(request)[\"buyerIp\"] || \"\";\n const dataToHash = `${request.headers.get(\"user-agent\")}${ipaddress}${url.hostname}`;\n const packlyticsId = getPacklyticsId(dataToHash, params.sessionSecret);\n const locale = getClientLocales(request) || [\"en-US\"];\n const location = getClientLocation(payload.locale || locale[0]);\n return trackPageHit(params.storefrontId, packlyticsId)({\n \"pack-session-id\": session.id, // This session ID is saved on the __pack cookie\n \"user-agent\": payload.userAgent || request.headers.get(\"user-agent\") || \"\",\n pathname: payload.pathname,\n query: payload.query,\n screen: payload.screen,\n referrer: payload.referrer,\n hostname: payload.hostname,\n ipaddress: ipaddress,\n userTimeZone: payload.userTimeZone,\n language: payload.language || getClientLocales(request) || \"\",\n locale: payload.locale || locale[0],\n location: location,\n connection: payload.connection || request.headers.get(\"connection\") || \"\",\n deviceCategory: payload.deviceCategory || \"\",\n href: payload.href || request.url,\n ...getDevice(request.headers.get(\"user-agent\") || \"\"),\n });\n}\nexport async function packlytics(pack, request, next) {\n const url = new URL(request.url);\n if (url.pathname.endsWith(\"/pack/track\") && request.method === \"POST\") {\n try {\n await sendEvent(request, pack.session, {\n storefrontId: pack.getPackSessionData().storeId,\n sessionSecret: pack.session.secret,\n });\n }\n catch (err) { }\n return new Response(JSON.stringify({ response: \"ok\" }));\n }\n return next();\n}\n","export function getClientLocation(locale) {\n const localeSplit = locale.split(\"-\");\n return localeSplit.length > 1 ? localeSplit[1].toLowerCase() : \"\";\n}\n","import cookie from \"cookie\";\nimport { PACK_COOKIE_MAX_AGE, PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\n\nexport type ConsentState = \"granted\" | \"denied\" | \"unknown\";\n\nexport const CONSENT_PURPOSES = [\n \"analytics\",\n \"marketing\",\n \"preferences\",\n \"saleOfData\",\n] as const;\n\nexport type ConsentPurpose = (typeof CONSENT_PURPOSES)[number];\n\n/** The visitor's consent for each purpose, as resolved for one request. */\nexport type PackConsent = Record<ConsentPurpose, ConsentState>;\n\n/** Whether each purpose may be used, after the unknown-consent policy. */\nexport type PackConsentAllowed = Record<ConsentPurpose, boolean>;\n\n/** A consent update: `true`/`false` or an explicit state, per purpose. */\nexport type ConsentInput = Partial<\n Record<ConsentPurpose, boolean | ConsentState | null | undefined>\n>;\n\n/**\n * Returns the visitor's consent from the theme's own consent tool (OneTrust,\n * Cookiebot, ...). Return `undefined` for a purpose the tool has no answer for;\n * the `__pack_user_consent` cookie is consulted next.\n *\n * Called on every request before anything renders, with no timeout: read the\n * tool's own cookie from `request` rather than calling an API.\n */\nexport type GetConsent = (\n request: Request,\n) => ConsentInput | undefined | Promise<ConsentInput | undefined>;\n\n/**\n * What an `unknown` purpose is treated as. `\"granted\"` keeps today's behaviour\n * for visitors who have not answered a banner.\n */\nexport type UnknownConsentPolicy =\n | \"granted\"\n | \"denied\"\n | ((request: Request) => \"granted\" | \"denied\");\n\nexport interface ConsentOptions {\n getConsent?: GetConsent;\n unknownConsent?: UnknownConsentPolicy;\n}\n\n// Cookie keys, kept short: the value rides on every request.\nconst COOKIE_KEYS: Record<ConsentPurpose, string> = {\n analytics: \"a\",\n marketing: \"m\",\n preferences: \"p\",\n saleOfData: \"s\",\n};\n\nexport function unknownConsent(): PackConsent {\n return {\n analytics: \"unknown\",\n marketing: \"unknown\",\n preferences: \"unknown\",\n saleOfData: \"unknown\",\n };\n}\n\nfunction toState(value: boolean | ConsentState | null | undefined): ConsentState {\n if (value === true || value === \"granted\") return \"granted\";\n if (value === false || value === \"denied\") return \"denied\";\n return \"unknown\";\n}\n\n/** Fill every purpose, keeping `base` wherever `input` has no answer. */\nexport function mergeConsent(\n base: PackConsent,\n input: ConsentInput | undefined,\n): PackConsent {\n const merged = { ...base };\n if (!input) return merged;\n\n for (const purpose of CONSENT_PURPOSES) {\n const state = toState(input[purpose]);\n if (state !== \"unknown\") merged[purpose] = state;\n }\n\n return merged;\n}\n\n/**\n * Parse the `__pack_user_consent` value.\n *\n * Current format: `a=1&m=0&p=&s=0` (1 granted, 0 denied, empty or missing\n * unknown). The pre-fix `\"true\"`/`\"false\"` written by `usePackCookies()` still\n * parses, as the analytics answer. Anything else is unknown.\n */\nexport function parseConsentCookie(value: string | undefined): PackConsent {\n const consent = unknownConsent();\n if (!value) return consent;\n\n if (value === \"true\" || value === \"false\") {\n consent.analytics = value === \"true\" ? \"granted\" : \"denied\";\n return consent;\n }\n\n const params = new URLSearchParams(value);\n for (const purpose of CONSENT_PURPOSES) {\n const raw = params.get(COOKIE_KEYS[purpose]);\n if (raw === \"1\") consent[purpose] = \"granted\";\n else if (raw === \"0\") consent[purpose] = \"denied\";\n }\n\n return consent;\n}\n\nexport function serializeConsentCookieValue(consent: PackConsent): string {\n return CONSENT_PURPOSES.map((purpose) => {\n const state = consent[purpose];\n const raw = state === \"granted\" ? \"1\" : state === \"denied\" ? \"0\" : \"\";\n return `${COOKIE_KEYS[purpose]}=${raw}`;\n }).join(\"&\");\n}\n\n/**\n * Set-Cookie for `__pack_user_consent`.\n *\n * Server-set so Safari's 7-day cap on script-written cookies does not apply.\n * Deliberately not HttpOnly: the browser bridge reads it to skip redundant\n * updates, and a theme or consent tool that still writes `\"true\"`/`\"false\"`\n * from script must be able to overwrite it.\n */\nexport function consentSetCookie(\n consent: PackConsent,\n omitSecure: boolean,\n): string {\n return cookie.serialize(\n PACK_USER_CONSENT_COOKIE_ID,\n serializeConsentCookieValue(consent),\n {\n maxAge: PACK_COOKIE_MAX_AGE,\n path: \"/\",\n sameSite: \"lax\",\n secure: !omitSecure,\n },\n );\n}\n\nexport function readConsentCookie(request: Request): PackConsent {\n const jar = cookie.parse(request.headers.get(\"Cookie\") || \"\");\n return parseConsentCookie(jar[PACK_USER_CONSENT_COOKIE_ID]);\n}\n\n/**\n * Resolve the visitor's consent for this request: the theme's `getConsent`\n * first, then the `__pack_user_consent` cookie, otherwise `unknown`.\n *\n * A throwing `getConsent` falls back to the cookie rather than failing the\n * request.\n */\nexport async function resolveConsent(\n request: Request,\n getConsent?: GetConsent,\n): Promise<PackConsent> {\n let fromTheme: ConsentInput | undefined;\n\n if (getConsent) {\n try {\n fromTheme = await getConsent(request);\n } catch (error) {\n console.error(\n \"[Pack] getConsent threw; falling back to the __pack_user_consent cookie:\",\n error,\n );\n }\n }\n\n return mergeConsent(readConsentCookie(request), fromTheme);\n}\n\nexport function resolveUnknownConsent(\n request: Request,\n policy: UnknownConsentPolicy = \"granted\",\n): \"granted\" | \"denied\" {\n if (typeof policy !== \"function\") return policy;\n\n try {\n return policy(request) === \"denied\" ? \"denied\" : \"granted\";\n } catch (error) {\n console.error(\n \"[Pack] unknownConsent threw; treating unknown consent as denied:\",\n error,\n );\n return \"denied\";\n }\n}\n\nexport function consentAllowed(\n consent: PackConsent,\n unknownAs: \"granted\" | \"denied\",\n): PackConsentAllowed {\n const allowed = {} as PackConsentAllowed;\n for (const purpose of CONSENT_PURPOSES) {\n const state = consent[purpose];\n allowed[purpose] =\n state === \"granted\" || (state === \"unknown\" && unknownAs === \"granted\");\n }\n return allowed;\n}\n","export const PACK_COOKIE_ID = \"__pack\";\nexport const PACK_USER_CONSENT_COOKIE_ID = \"__pack_user_consent\";\nexport const PACK_TEST_COOKIE_ID = \"__pack_test\";\nexport const PACK_COOKIE_MAX_AGE = 60 * 60 * 24 * 360; // 1 year\n// Short rolling session marker for new-vs-returning. Carries the verdict\n// decided when the session starts — \"r\" (returning) or \"n\" (new) — which the\n// persistent __pack cookie can't, since it lasts a year and can't tell a first\n// session from a later one. Refreshed on every response (GA-style inactivity\n// session), preserving its value so the verdict is stable across page views.\nexport const PACK_SESSION_COOKIE_ID = \"__pack_s\";\nexport const PACK_SESSION_MAX_AGE = 30 * 60; // 30 minutes\n","import { readConsentCookie } from \"./consent\";\n\n// Safari (incl. iOS) doesn't treat http://localhost as a secure context, so it\n// drops `Secure` cookies in local dev. The Pack cookies omit `Secure` for that\n// case; shared here so session.ts, test-session.ts, and handle-request use one\n// definition instead of separate copies.\nexport function isSafari(userAgent: string | null): boolean {\n if (!userAgent) return false;\n\n return (\n /Safari\\//.test(userAgent) &&\n !/Chrome\\//.test(userAgent) &&\n !/Chromium\\//.test(userAgent) &&\n !/Edg\\//.test(userAgent) &&\n !/Firefox\\//.test(userAgent)\n );\n}\n\n/**\n * @deprecated Reads only the cookie and treats unknown as consented. Use\n * `pack.session.consentAllowed`, which also applies `getConsent` and the\n * unknown-consent policy.\n */\nexport function hasUserConsent(request: Request) {\n return readConsentCookie(request).analytics !== \"denied\";\n}\n","import type { PackSession } from \"./session\";\nimport {\n consentSetCookie,\n mergeConsent,\n readConsentCookie,\n type ConsentInput,\n} from \"./consent\";\n\nexport const PACK_CONSENT_PATH = \"/pack/consent\";\n\nexport function isConsentRequest(request: Request): boolean {\n return (\n request.method === \"POST\" &&\n new URL(request.url).pathname.endsWith(PACK_CONSENT_PATH)\n );\n}\n\n/**\n * Record a consent update posted by the browser bridge or `setPackConsent()`.\n *\n * Purposes missing from the body keep their current state. The response sets\n * `__pack_user_consent` and applies the new consent to the Pack session, so a\n * withdrawal drops the persisted session id on this same response.\n */\nexport async function handleConsentRequest(\n session: PackSession,\n request: Request,\n omitSecure: boolean,\n): Promise<Response> {\n // Another site must not be able to grant consent for this visitor. JSON\n // forces a CORS preflight cross-origin, and fetch metadata catches the rest.\n const fetchSite = request.headers.get(\"Sec-Fetch-Site\");\n const isJson = request.headers\n .get(\"Content-Type\")\n ?.toLowerCase()\n .startsWith(\"application/json\");\n if (!isJson || (fetchSite && fetchSite !== \"same-origin\")) {\n return new Response(JSON.stringify({ error: \"forbidden\" }), {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n let body: ConsentInput;\n\n try {\n body = (await request.json()) as ConsentInput;\n } catch {\n return new Response(JSON.stringify({ error: \"invalid JSON\" }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const consent = mergeConsent(session.consent, body);\n session.setConsent(consent);\n\n // Persist only what the visitor answered through Pack. `session.consent`\n // also holds the theme's `getConsent` answers, which are re-read every\n // request and must not outlive the tool that gave them.\n const stored = mergeConsent(readConsentCookie(request), body);\n\n const response = new Response(JSON.stringify({ consent }), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n response.headers.append(\"Set-Cookie\", consentSetCookie(stored, omitSecure));\n\n return response;\n}\n","import {\n PACK_COOKIE_ID,\n PACK_TEST_COOKIE_ID,\n PACK_SESSION_COOKIE_ID,\n PACK_SESSION_MAX_AGE,\n} from \"../constants\";\n\n// Shared new-vs-returning (`visitor_recency`) logic. The verdict WRITER\n// (handle-request, which sets __pack_s on every response) and the READER (the\n// built-in evaluator) both import from here so the two halves can't drift on how\n// the marker is produced or interpreted. Conceptually mirrored in backpack's\n// built-in definitions.\n\n// Persistent \"seen before\" markers — Pack's own cookies (__pack lasts a year),\n// then GA4 / Shopify. Presence means a prior visit at some point.\nexport const PRIOR_VISIT_COOKIES = [\n PACK_COOKIE_ID,\n PACK_TEST_COOKIE_ID,\n \"_ga\",\n \"_shopify_y\",\n];\n\n// The verdict carried by __pack_s, decided once when a session starts.\nexport type SessionVerdict = \"r\" | \"n\"; // returning | new\n\n// Decide the session's verdict from the incoming cookies: preserve a valid\n// stored verdict (so it stays stable across a session's page views); otherwise\n// — a new session, or an unrecognized/tampered value — decide from the\n// prior-visit cookies.\nexport function sessionVerdict(\n incoming: Record<string, string | undefined>,\n): SessionVerdict {\n const stored = incoming[PACK_SESSION_COOKIE_ID];\n if (stored === \"r\" || stored === \"n\") return stored;\n return PRIOR_VISIT_COOKIES.some((name) => incoming[name]) ? \"r\" : \"n\";\n}\n\n// Set-Cookie for the rolling session marker. Mirrors __pack's cross-site\n// attributes (`SameSite=None`) so the marker has the SAME visibility as __pack:\n// otherwise it's dropped inside the cross-site customizer iframe while __pack\n// survives, and the reader — seeing no marker but a prior-visit cookie — falls\n// back to \"returning\" for every visitor. `omitSecure` matches __pack's Safari +\n// local-dev exception (Safari won't store `Secure` cookies on http://localhost).\nexport function sessionMarkerSetCookie(\n verdict: SessionVerdict,\n omitSecure: boolean,\n): string {\n return `${PACK_SESSION_COOKIE_ID}=${verdict}; Path=/; Max-Age=${PACK_SESSION_MAX_AGE}; SameSite=None${\n omitSecure ? \"\" : \"; Secure\"\n }`;\n}\n","import { useEffect } from \"react\";\nimport { PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\nimport { parseConsentCookie } from \"./consent\";\nimport { PACK_CONSENT_PATH } from \"./consent-endpoint\";\n\ntype UsePackCookiesOptions = {\n /**\n * The visitor's analytics consent. When omitted, nothing is recorded.\n **/\n hasUserConsent?: boolean;\n /**\n * @deprecated Ignored. `__pack_user_consent` is now set by the server for\n * the storefront's own host.\n **/\n domain?: string;\n};\n\nfunction readAnalyticsConsent() {\n try {\n const entry = document.cookie\n .split(\"; \")\n .find((part) => part.startsWith(`${PACK_USER_CONSENT_COOKIE_ID}=`));\n return parseConsentCookie(\n entry && decodeURIComponent(entry.slice(PACK_USER_CONSENT_COOKIE_ID.length + 1)),\n ).analytics;\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Record the visitor's analytics consent in `__pack_user_consent`.\n *\n * @deprecated Use `setPackConsent()` from `@pack/react`, called when the\n * visitor answers, which also covers marketing, preferences and sale of data.\n * Themes using Shopify's privacy banner need neither: `PackProvider` forwards\n * the banner's answer on its own.\n *\n * Posts only when `hasUserConsent` is given and differs from the recorded\n * answer, so a stale value cannot overwrite the banner's on every page load.\n */\nexport function usePackCookies(options?: UsePackCookiesOptions): void {\n const hasUserConsent = options?.hasUserConsent;\n\n useEffect(() => {\n if (typeof hasUserConsent !== \"boolean\") return;\n if (readAnalyticsConsent() === (hasUserConsent ? \"granted\" : \"denied\")) {\n return;\n }\n\n fetch(PACK_CONSENT_PATH, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ analytics: hasUserConsent }),\n credentials: \"same-origin\",\n keepalive: true,\n }).catch((error) => {\n console.error(\"[Pack] Failed to record consent:\", error);\n });\n }, [hasUserConsent]);\n}\n","import {\n createCookie,\n createCookieSessionStorage,\n type Session,\n type SessionStorage,\n} from \"react-router\";\nimport { PACK_COOKIE_ID, PACK_COOKIE_MAX_AGE } from \"../constants\";\nimport { isSafari } from \"./cookies-utils\";\nimport {\n consentAllowed,\n resolveConsent,\n resolveUnknownConsent,\n type ConsentOptions,\n type PackConsent,\n type PackConsentAllowed,\n} from \"./consent\";\n\nexport class PackSession {\n #id: string;\n\n readonly secret: string;\n\n readonly #session: Session;\n\n #sessionStorage: SessionStorage;\n\n #consent: PackConsent;\n\n #unknownAs: \"granted\" | \"denied\";\n\n constructor(\n id: string,\n secret: string,\n sessionStorage: SessionStorage,\n session: Session,\n consent: PackConsent,\n unknownAs: \"granted\" | \"denied\",\n ) {\n this.#id = id;\n this.secret = secret;\n this.#session = session;\n this.#sessionStorage = sessionStorage;\n this.#consent = consent;\n this.#unknownAs = unknownAs;\n }\n\n static async init(\n request: Request,\n secrets: string[],\n options: ConsentOptions = {},\n ): Promise<PackSession> {\n const userAgent = request.headers.get(\"User-Agent\");\n\n const storage = createCookieSessionStorage({\n cookie: createCookie(PACK_COOKIE_ID, {\n secure:\n isSafari(userAgent) && process.env.NODE_ENV === \"development\"\n ? false\n : true,\n secrets,\n sameSite: \"none\",\n maxAge: PACK_COOKIE_MAX_AGE,\n }),\n });\n\n const session = await storage.getSession(request.headers.get(\"Cookie\"));\n const consent = await resolveConsent(request, options.getConsent);\n const unknownAs = resolveUnknownConsent(request, options.unknownConsent);\n\n const packSession = new this(\n \"\",\n secrets[0],\n storage,\n session,\n consent,\n unknownAs,\n );\n packSession.#applyConsent();\n\n return packSession;\n }\n\n /**\n * The visitor's session id. Persistent only with analytics consent; otherwise\n * a fresh id on every request that is never written to the cookie.\n */\n get id(): string {\n return this.#id;\n }\n\n get consent(): PackConsent {\n return { ...this.#consent };\n }\n\n get consentAllowed(): PackConsentAllowed {\n return consentAllowed(this.#consent, this.#unknownAs);\n }\n\n /** Replace the consent for the rest of this request, e.g. after `/pack/consent`. */\n setConsent(consent: PackConsent): void {\n this.#consent = { ...consent };\n this.#applyConsent();\n }\n\n #applyConsent(): void {\n if (this.consentAllowed.analytics) {\n let sessionId = this.#session.get(\"session_id\");\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n this.#session.set(\"session_id\", sessionId);\n }\n this.#id = sessionId;\n return;\n }\n\n // Drop any id persisted before consent was withdrawn. The cookie itself\n // stays: it also carries the preview-mode flags.\n this.#session.unset(\"session_id\");\n this.#id = crypto.randomUUID();\n }\n\n has(key: string): boolean {\n return this.#session.has(key);\n }\n\n get(key: string) {\n return this.#session.get(key);\n }\n\n destroy(): Promise<string> {\n for (const key of Object.keys(this.#session.data)) {\n this.#session.unset(key);\n }\n\n return this.#sessionStorage.destroySession(this.#session);\n }\n\n set(key: string, value: any): void {\n this.#session.set(key, value);\n }\n\n commit(): Promise<string> {\n return this.#sessionStorage.commitSession(this.#session);\n }\n}\n","import {\n createCookie,\n createCookieSessionStorage,\n type Session,\n type SessionStorage,\n} from \"react-router\";\nimport { Test } from \"../tests/test\";\nimport { PACK_COOKIE_MAX_AGE, PACK_TEST_COOKIE_ID } from \"../constants\";\nimport { isSafari } from \"./cookies-utils\";\nimport createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:test-session\");\n\nconst ASSIGNMENTS_KEY = \"test_data_map\";\n// Pre-4.0 single-slot shape. Read once, migrated to ASSIGNMENTS_KEY, then unset.\nconst LEGACY_TEST_DATA_KEY = \"test_data\";\nconst EXPIRE_AT_KEY = \"test_expire_at\";\n\n// An ISO-8601 stamp, reserved in the budget whether or not one is set yet.\nconst RESERVED_EXPIRE_AT = new Date(0).toISOString();\n\n/**\n * Byte budget for the serialized session payload — the only bound on how many\n * assignments a visitor holds.\n *\n * A count cannot express the limit: an entry's cost is driven by handle length,\n * which the CMS bounds only at `VarChar(255)`. Measured, ten assignments fit\n * comfortably at 20-character handles and overflow at 70, and six overflow at\n * 255 — so a count alone either wastes capacity or permits the failure. That is\n * why `MAX_TEST_ASSIGNMENTS` was removed rather than raised.\n *\n * `capAssignments` and `setAssignment` must weigh the same thing, and it must be\n * the payload a commit will produce rather than the session as it stands —\n * `getTestInfo` slides the expiry after its assignment writes, so a read-time\n * trim measuring the current session can be stricter than the write-time check\n * that just accepted an assignment. See `#payloadBytesWith`.\n *\n * Refusing here is what makes the failure safe rather than merely rarer: the\n * test is never assigned, so it is never served, never carries a variant header\n * and never owes an exposure. A write that overflows instead gets dropped at\n * commit time, leaving the assignment unpersisted but already served — and\n * assigned again on the next request. See `appendSessionCookie` in\n * `handle-request.ts`.\n *\n * Over budget we refuse rather than evict. Evicting would let an already\n * bucketed test be assigned again later, the same flipping the no-re-roll rule\n * in `getTestInfo` exists to prevent.\n *\n * Calibrated against the committed cookie rather than derived: base64 and URL\n * encoding inflate the payload by roughly 1.41x, plus ~57 bytes of cookie name\n * and signature, so this leaves about 10% headroom under the ~4KB ceiling. The\n * guarantee is asserted directly — `commit()` must not throw for any sequence of\n * writes, at any handle length.\n */\nexport const MAX_SESSION_PAYLOAD_BYTES = 2600;\n\n/**\n * The sticky half of a bucketing decision — the only thing that has to survive\n * between requests.\n *\n * `impressionTrigger` and `impression.sectionIds` are deliberately NOT stored.\n * Every consumer of those two fields reads them off loader data produced from\n * the freshly-fetched test rules in that same request (see\n * `getImpressionSectionIdsForVariant`), so a stored copy is never read back — it\n * is pure cookie weight, and it goes stale the moment the merchant edits the\n * variant's sections.\n */\nexport interface TestAssignment {\n id: string;\n handle: string;\n testVariant: {\n id: string;\n handle: string;\n };\n assignedAt: number;\n}\n\nexport type TestAssignments = Record<string, TestAssignment>;\n\n/**\n * Copy an untrusted stored entry into the exact `TestAssignment` shape, or\n * reject it. Building the result field-by-field is what drops legacy baggage\n * (`impression`, `impressionTrigger`, and the `isFirstExposure` flag that older\n * versions leaked into the cookie) without needing to name it.\n *\n * An entry without both a test id and a variant id can't serve content or be\n * validated against rules, so it is rejected rather than repaired.\n */\nfunction normalizeAssignment(\n raw: unknown,\n fallbackAssignedAt: number,\n): TestAssignment | null {\n if (!raw || typeof raw !== \"object\") return null;\n\n const candidate = raw as {\n id?: unknown;\n handle?: unknown;\n testVariant?: { id?: unknown; handle?: unknown };\n assignedAt?: unknown;\n };\n\n const id = typeof candidate.id === \"string\" ? candidate.id : \"\";\n const variantId =\n typeof candidate.testVariant?.id === \"string\" ? candidate.testVariant.id : \"\";\n\n if (!id || !variantId) return null;\n\n return {\n id,\n handle: typeof candidate.handle === \"string\" ? candidate.handle : \"\",\n testVariant: {\n id: variantId,\n handle:\n typeof candidate.testVariant?.handle === \"string\"\n ? candidate.testVariant.handle\n : \"\",\n },\n assignedAt:\n typeof candidate.assignedAt === \"number\"\n ? candidate.assignedAt\n : fallbackAssignedAt,\n };\n}\n\n/**\n * Trim an incoming cookie (which we don't control) to the byte budget by keeping\n * the oldest assignments — the ones a visitor is most likely already exposed to.\n *\n * `measure` is the caller's full-payload measurement, not just this map. The two\n * used to differ: this trimmed the map alone while `setAssignment` weighed the\n * whole session, both against the same constant, so a cookie could pass here and\n * still be over budget once `test_session_id`, `test_expire_at` and the legacy\n * mirror were added. Sharing one measurement is what makes the budget mean one\n * thing.\n */\nfunction capAssignments(\n assignments: TestAssignments,\n measure: (assignments: TestAssignments) => number,\n): TestAssignments {\n const entries = [...Object.values(assignments)].sort(\n (a, b) => a.assignedAt - b.assignedAt || a.id.localeCompare(b.id),\n );\n\n // Oldest first, so trimming drops the newest — the ones least likely to have\n // been exposed yet.\n let keep = entries;\n\n while (\n keep.length > 1 &&\n measure(Object.fromEntries(keep.map((e) => [e.id, e]))) >\n MAX_SESSION_PAYLOAD_BYTES\n ) {\n keep = keep.slice(0, -1);\n }\n\n if (keep.length === entries.length) return assignments;\n\n debug(\"[capAssignments] Dropping assignments over the cap\", {\n stored: entries.length,\n kept: keep.length,\n });\n\n return Object.fromEntries(keep.map((entry) => [entry.id, entry]));\n}\n\n/**\n * The session's stable primary — oldest assignment, tie-broken by test id. Used\n * both for the single-test compatibility surface and for the legacy mirror, so\n * the two can never disagree.\n */\nfunction pickPrimary(\n assignments: TestAssignments,\n): TestAssignment | undefined {\n const entries = Object.values(assignments);\n if (!entries.length) return undefined;\n\n return entries.reduce((primary, entry) =>\n entry.assignedAt < primary.assignedAt ||\n (entry.assignedAt === primary.assignedAt &&\n entry.id.localeCompare(primary.id) < 0)\n ? entry\n : primary,\n );\n}\n\nfunction toTest(assignment: TestAssignment): Test {\n return {\n id: assignment.id,\n handle: assignment.handle,\n testVariant: {\n id: assignment.testVariant.id,\n handle: assignment.testVariant.handle,\n },\n };\n}\n\nexport class PackTestSession {\n readonly id: string;\n readonly #session: Session;\n #sessionStorage: SessionStorage;\n #isDirty: boolean = false;\n readonly #isNewId: boolean;\n #initialData: {\n test_data_map?: TestAssignments;\n test_expire_at?: string;\n test_rules_cache?: any[];\n test_rules_cache_timestamp?: number;\n } = {};\n\n constructor(\n id: string,\n sessionStorage: SessionStorage,\n session: Session,\n isNewId: boolean = false,\n ) {\n this.id = id;\n this.#isNewId = isNewId;\n this.#session = session;\n this.#sessionStorage = sessionStorage;\n\n // Store initial state to track changes\n this.#initialData = {\n test_data_map: this.#session.get(ASSIGNMENTS_KEY),\n test_expire_at: this.#session.get(\"test_expire_at\"),\n test_rules_cache: this.#session.get(\"test_rules_cache\"),\n test_rules_cache_timestamp: this.#session.get(\n \"test_rules_cache_timestamp\",\n ),\n };\n }\n\n static async init(\n request: Request,\n secrets: string[]\n ): Promise<PackTestSession> {\n const userAgent = request.headers.get(\"User-Agent\");\n debug(\"[PackTestSession.init] Initializing test session\", {\n hasSecrets: secrets.length > 0,\n userAgent: userAgent?.substring(0, 50),\n });\n\n const storage = createCookieSessionStorage({\n cookie: createCookie(PACK_TEST_COOKIE_ID, {\n secure:\n isSafari(userAgent) && process.env.NODE_ENV === \"development\"\n ? false\n : true,\n secrets,\n sameSite: \"lax\",\n maxAge: PACK_COOKIE_MAX_AGE,\n path: \"/\",\n }),\n });\n\n const session = await storage.getSession(request.headers.get(\"Cookie\"));\n let sessionId = session.get(\"test_session_id\");\n const isNewId = !sessionId;\n\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n session.set(\"test_session_id\", sessionId);\n debug(\"[PackTestSession.init] Generated new session ID\", { sessionId });\n } else {\n debug(\"[PackTestSession.init] Using existing session ID\", { sessionId });\n }\n\n return new this(sessionId, storage, session, isNewId);\n }\n\n /**\n * Keep a freshly generated id once a traffic draw has been made against it.\n *\n * A new id does not dirty the session on its own, so a visitor whose draw\n * missed every test was never written, got a new id on the next request, and\n * drew again until one hit. Called only after a draw rather than on creation,\n * so visitors matching no test still get no cookie.\n */\n persistId(): void {\n if (this.#isNewId) this.#isDirty = true;\n }\n\n /**\n * Every assignment on the session, keyed by test id.\n *\n * Normalizes and migrates on read, persisting only when the stored shape\n * actually differs — a plain read of an already-clean session must not mark\n * the session dirty, or `hasChanges()` would rewrite the cookie on every\n * response.\n */\n getAssignments(): TestAssignments {\n const stored = this.#session.get(ASSIGNMENTS_KEY);\n const legacy = this.#session.get(LEGACY_TEST_DATA_KEY);\n const now = Date.now();\n\n // The map is authoritative once present. `test_data` is only a migration\n // source for a genuinely pre-4.0 session — on a migrated session it is our\n // own rollback mirror (see #writeLegacyMirror) and must not be read back, or\n // clearing an assignment would resurrect it.\n const hasStoredMap = !!stored && typeof stored === \"object\";\n\n let normalized: TestAssignments = {};\n\n if (hasStoredMap) {\n for (const raw of Object.values(stored as Record<string, unknown>)) {\n const assignment = normalizeAssignment(raw, now);\n if (assignment) normalized[assignment.id] = assignment;\n }\n\n // Adopt an assignment an older package made while the storefront was\n // rolled back. `#writeLegacyMirror` always mirrors a test that is in the\n // map (or unsets the slot), so a legacy id the map doesn't know can only\n // have been written by a version that predates the map. Without this the\n // map would win on roll-forward and silently re-bucket the visitor away\n // from the variant they were just served.\n //\n // Deliberately narrow: a legacy id already in the map needs nothing, and\n // an *absent* legacy slot is indistinguishable from a normal migrated\n // session, so a test the old package cleared may briefly reappear — the\n // reconcile pass in `getTestInfo` drops it again on the same request.\n const adopted = normalizeAssignment(legacy, now);\n if (adopted && !normalized[adopted.id]) {\n debug(\"[getAssignments] Adopting a rolled-back package's assignment\", {\n sessionId: this.id,\n testId: adopted.id,\n });\n normalized[adopted.id] = adopted;\n }\n } else if (legacy !== undefined) {\n const assignment = normalizeAssignment(legacy, now);\n if (assignment) normalized[assignment.id] = assignment;\n debug(\"[getAssignments] Migrated legacy single-slot test data\", {\n sessionId: this.id,\n migrated: !!assignment,\n });\n }\n\n normalized = capAssignments(normalized, (a) => this.#payloadBytesWith(a));\n\n // Persist only on a real difference: a plain read of an already-clean\n // session must not dirty it, or every response would rewrite the cookie.\n // `stored !== undefined` on the miss branch covers a key holding something\n // unusable (a string, `null`); without it the junk would never be cleaned.\n const needsWrite = hasStoredMap\n ? JSON.stringify(normalized) !== JSON.stringify(stored)\n : Object.keys(normalized).length > 0 ||\n legacy !== undefined ||\n stored !== undefined;\n\n if (needsWrite) {\n this.#write(normalized);\n }\n\n return normalized;\n }\n\n getAssignmentIds(): string[] {\n return Object.keys(this.getAssignments());\n }\n\n getAssignment(testId: string): TestAssignment | undefined {\n return this.getAssignments()[testId];\n }\n\n hasAssignment(testId: string): boolean {\n return !!this.getAssignment(testId);\n }\n\n /**\n * The session's stable primary — the oldest assignment, tie-broken by test id.\n * Backs the single-test compatibility surface (`getTestData` -> `pack.abTest`),\n * so it must not change as further tests are assigned during a visit.\n */\n getPrimaryAssignment(): TestAssignment | undefined {\n return pickPrimary(this.getAssignments());\n }\n\n /**\n * Upsert one test's assignment. Returns false when the cap blocks a new\n * assignment; updating a test already on the session always succeeds.\n */\n setAssignment(\n assignment: Omit<TestAssignment, \"assignedAt\"> & { assignedAt?: number },\n ): boolean {\n const current = this.getAssignments();\n const existing = current[assignment.id];\n\n const next = normalizeAssignment(\n {\n ...assignment,\n assignedAt:\n assignment.assignedAt ?? existing?.assignedAt ?? Date.now(),\n },\n Date.now(),\n );\n\n if (!next) {\n debug(\"[setAssignment] Rejected malformed assignment\", {\n sessionId: this.id,\n testId: assignment?.id,\n });\n return false;\n }\n\n const prospective = { ...current, [next.id]: next };\n const payloadBytes = this.#payloadBytesWith(prospective);\n\n if (payloadBytes > MAX_SESSION_PAYLOAD_BYTES) {\n // Refuse rather than write-and-hope. A write that cannot serialize is\n // dropped at commit time, which leaves this assignment served but\n // unpersisted — and re-rolled with a different variant next request.\n // Updating an existing assignment is refused on the same basis: the stored\n // value stays stale but valid, which costs nothing.\n debug(\"[setAssignment] Over the cookie byte budget, refusing\", {\n sessionId: this.id,\n testId: next.id,\n testHandle: next.handle,\n payloadBytes,\n budget: MAX_SESSION_PAYLOAD_BYTES,\n held: Object.keys(current).length,\n });\n return false;\n }\n\n debug(\"[setAssignment] Storing assignment\", {\n sessionId: this.id,\n testId: next.id,\n testHandle: next.handle,\n variantId: next.testVariant.id,\n variantHandle: next.testVariant.handle,\n });\n\n this.#write(prospective);\n return true;\n }\n\n clearAssignment(testId: string): void {\n const current = this.getAssignments();\n if (!current[testId]) return;\n\n debug(\"[clearAssignment] Clearing assignment\", {\n sessionId: this.id,\n testId,\n });\n\n const { [testId]: _removed, ...rest } = current;\n this.#write(rest);\n }\n\n clearAllAssignments(): void {\n debug(\"[clearAllAssignments] Clearing every assignment\", {\n sessionId: this.id,\n });\n this.#write({});\n }\n\n /**\n * The payload a commit would produce, measured the same way at write time and\n * at read time, including the transitional `test_data` mirror since that is\n * committed too.\n *\n * `test_expire_at` is reserved rather than read, because `getTestInfo` slides\n * the expiry *after* its assignment writes. Measuring the session as it stands\n * would let a read-time trim be stricter than the write-time check that just\n * accepted an assignment — dropping one that was already served and had\n * already fired its exposure, which then re-fires on every later request.\n */\n #payloadBytesWith(assignments: TestAssignments): number {\n const primary = pickPrimary(assignments);\n\n return JSON.stringify({\n ...this.#session.data,\n [EXPIRE_AT_KEY]: this.getExpireAt() ?? RESERVED_EXPIRE_AT,\n [ASSIGNMENTS_KEY]: assignments,\n ...(primary ? { [LEGACY_TEST_DATA_KEY]: toTest(primary) } : {}),\n }).length;\n }\n\n #write(assignments: TestAssignments): void {\n this.#isDirty = true;\n this.#session.set(ASSIGNMENTS_KEY, assignments);\n this.#writeLegacyMirror(assignments);\n }\n\n /**\n * Transitional rollback insurance: mirror the primary assignment back into the\n * pre-4.0 `test_data` slot. Without it, rolling the SDK back after visitors\n * have migrated leaves the old code seeing no assignment at all, so it\n * re-buckets already-exposed visitors mid-test and flips their variant.\n *\n * Costs ~120 cookie bytes and is never read by this version (`getAssignments`\n * only consults `test_data` when the map is absent entirely).\n *\n * TODO(4.1): remove once no supported release reads `test_data`.\n */\n #writeLegacyMirror(assignments: TestAssignments): void {\n const primary = pickPrimary(assignments);\n\n if (primary) {\n this.#session.set(LEGACY_TEST_DATA_KEY, toTest(primary));\n } else if (this.#session.has(LEGACY_TEST_DATA_KEY)) {\n this.#session.unset(LEGACY_TEST_DATA_KEY);\n }\n }\n\n /**\n * @deprecated Reads only the primary assignment. Use `getAssignments()` —\n * a session can hold one assignment per concurrently eligible test.\n */\n getTestData(): Test | undefined {\n const primary = this.getPrimaryAssignment();\n return primary ? toTest(primary) : undefined;\n }\n\n /**\n * @deprecated Upserts a single test. Use `setAssignment()` /\n * `clearAllAssignments()`.\n */\n setTestData(testData: Test | undefined): void {\n if (!testData) {\n this.clearAllAssignments();\n return;\n }\n\n this.setAssignment({\n id: testData.id,\n handle: testData.handle ?? \"\",\n testVariant: {\n id: testData.testVariant?.id ?? \"\",\n handle: testData.testVariant?.handle ?? \"\",\n },\n });\n }\n\n getExpireAt(): string | undefined {\n return this.#session.get(\"test_expire_at\");\n }\n\n setExpireAt(expireAt: string | undefined): void {\n debug('[setExpireAt] Setting expiry', {\n sessionId: this.id,\n expireAt,\n });\n this.#isDirty = true;\n this.#session.set(\"test_expire_at\", expireAt);\n }\n\n clearTestData(): void {\n debug('[clearTestData] Clearing test data and expiry', {\n sessionId: this.id,\n });\n this.clearAllAssignments();\n this.#isDirty = true;\n this.#session.unset(\"test_expire_at\");\n }\n\n hasTestData(): boolean {\n return Object.keys(this.getAssignments()).length > 0;\n }\n\n // Test rules cache methods\n getTestRulesCache(): any[] | undefined {\n return this.#session.get(\"test_rules_cache\");\n }\n\n getTestRulesCacheTimestamp(): number | undefined {\n return this.#session.get(\"test_rules_cache_timestamp\");\n }\n\n setTestRulesCache(rules: any[], timestamp: number): void {\n debug('[setTestRulesCache] Caching test rules', {\n sessionId: this.id,\n rulesCount: rules.length,\n timestamp: new Date(timestamp).toISOString(),\n });\n this.#isDirty = true;\n this.#session.set(\"test_rules_cache\", rules);\n this.#session.set(\"test_rules_cache_timestamp\", timestamp);\n }\n\n clearTestRulesCache(): void {\n debug('[clearTestRulesCache] Clearing rules cache', {\n sessionId: this.id,\n });\n this.#isDirty = true;\n this.#session.unset(\"test_rules_cache\");\n this.#session.unset(\"test_rules_cache_timestamp\");\n }\n\n isTestRulesCacheValid(cacheDurationMs: number = 60 * 60 * 1000): boolean {\n const timestamp = this.getTestRulesCacheTimestamp();\n if (!timestamp) {\n debug('[isTestRulesCacheValid] No cache timestamp found', {\n sessionId: this.id,\n });\n return false;\n }\n\n const isValid = Date.now() - timestamp < cacheDurationMs;\n debug('[isTestRulesCacheValid] Cache validity check', {\n sessionId: this.id,\n isValid,\n cacheAge: Math.floor((Date.now() - timestamp) / 1000) + 's',\n maxAge: Math.floor(cacheDurationMs / 1000) + 's',\n });\n return isValid;\n }\n\n hasChanges(): boolean {\n // Check if data has actually changed\n const currentAssignments = this.getAssignments();\n const currentExpireAt = this.getExpireAt();\n const currentTestRulesCache = this.getTestRulesCache();\n const currentTestRulesCacheTimestamp = this.getTestRulesCacheTimestamp();\n\n // Compare with initial state\n // Compare against `{}`, not `undefined`: reading an untouched session\n // normalizes the absent key to an empty map, and treating that as a change\n // would commit the cookie on every response for every visitor.\n const assignmentsChanged =\n JSON.stringify(currentAssignments) !==\n JSON.stringify(this.#initialData.test_data_map ?? {});\n const expireAtChanged =\n currentExpireAt !== this.#initialData.test_expire_at;\n const testRulesCacheChanged =\n JSON.stringify(currentTestRulesCache) !==\n JSON.stringify(this.#initialData.test_rules_cache);\n const testRulesCacheTimestampChanged =\n currentTestRulesCacheTimestamp !== this.#initialData.test_rules_cache_timestamp;\n\n const hasChanges = assignmentsChanged || expireAtChanged || testRulesCacheChanged || testRulesCacheTimestampChanged || this.#isDirty;\n\n debug('[hasChanges] Checking for changes', {\n sessionId: this.id,\n hasChanges,\n assignmentsChanged,\n expireAtChanged,\n testRulesCacheChanged,\n testRulesCacheTimestampChanged,\n isDirty: this.#isDirty,\n });\n\n return hasChanges;\n }\n\n commit(): Promise<string> {\n // Read before clearing the dirty flag: normalizing/migrating on read can\n // itself dirty the session, and that write belongs to this commit.\n const assignments = this.getAssignments();\n\n debug('[commit] Committing session', {\n sessionId: this.id,\n isDirty: this.#isDirty,\n assignmentCount: Object.keys(assignments).length,\n });\n // Reset dirty flag after commit\n this.#isDirty = false;\n\n // Update initial data to current state\n this.#initialData = {\n test_data_map: assignments,\n test_expire_at: this.getExpireAt(),\n test_rules_cache: this.getTestRulesCache(),\n test_rules_cache_timestamp: this.getTestRulesCacheTimestamp(),\n };\n\n return this.#sessionStorage.commitSession(this.#session);\n }\n\n destroy(): Promise<string> {\n debug('[destroy] Destroying session', {\n sessionId: this.id,\n });\n this.#isDirty = true;\n this.#session.unset(ASSIGNMENTS_KEY);\n this.#session.unset(LEGACY_TEST_DATA_KEY);\n this.#session.unset(\"test_expire_at\");\n this.#session.unset(\"test_rules_cache\");\n this.#session.unset(\"test_rules_cache_timestamp\");\n return this.#sessionStorage.destroySession(this.#session);\n }\n}\n","import { PackClient } from \"@pack/client\";\nimport { CacheCustom, createWithCache } from \"@shopify/hydrogen\";\nimport * as cookie from \"cookie\";\nimport { PackSession } from \"./session/session\";\nimport { PackTestSession } from \"./session/test-session\";\nimport type { PackConsent, PackConsentAllowed } from \"./session/consent\";\nimport type { GetCustomerContext } from \"./tests/customer-context\";\nimport {\n getTestInfo,\n getTestFromQueryParams,\n getTestSession,\n getTestTargetingAttributesFromRequest,\n hasCompleteTestInput,\n setTestHeaders,\n Test,\n TestInput,\n TestInfo,\n TestInfoResult,\n} from \"./tests/test\";\nimport { classifyQuery } from \"./tests/query-surfaces\";\nimport {\n EXPOSED_TEST_COOKIE,\n LEGACY_EXPOSED_TEST_COOKIE,\n exposedCookieOptions,\n parseExposedTests,\n serializeExposedTests,\n toPackTestInfo,\n} from \"./tests/exposed-tests\";\nimport createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:create-pack-client\");\n\n/** @see https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/cache#caching-strategies */\ntype CachingStrategy = ReturnType<typeof CacheCustom>;\n\ninterface EnvironmentOptions {\n /**\n * A Cache API instance.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Cache\n */\n cache: Cache;\n /**\n * A runtime utility for serverless environments\n * @see https://developers.cloudflare.com/workers/runtime-apis/fetch-event/#waituntil\n */\n waitUntil: ExecutionContext[\"waitUntil\"];\n}\n\ninterface I18nOptions {\n language: string;\n country: string;\n}\n\nexport interface CreatePackClientOptions extends EnvironmentOptions {\n apiUrl?: string;\n token?: string;\n storeId?: string;\n session: PackSession;\n testSession: PackTestSession;\n contentEnvironment?: string;\n i18n?: I18nOptions;\n /** Default theme data to use when no token is provided */\n defaultThemeData?: DefaultThemeData;\n /**\n * Who is signed in, for audiences that ask (`auth_status`). Called at most\n * once per request, and only when an audience actually needs it.\n *\n * Return `{ isLoggedIn }` from a session check; add `shopifyCustomerId` only\n * where the id itself is needed, since that costs a Customer Account API\n * query. Omitting this option, throwing, or timing out all leave the answer\n * UNKNOWN, and audiences that need it are refused rather than being served as\n * if the visitor were a guest.\n */\n getCustomerContext?: GetCustomerContext;\n /**\n * Bound on `getCustomerContext`, in milliseconds. Defaults to 300 — enough for\n * a session read or a healthy token refresh. Raise it only if expiry warnings\n * show up; the hook sits on the SSR critical path, paid on any render where an\n * audience could depend on who is signed in.\n *\n * If the hook throws or times out, the answer is unknown and those audiences\n * are refused for that request: a visitor already seeing a signed-in\n * personalization gets default content on that one render.\n */\n customerContextTimeoutMs?: number;\n /**\n * Initial request to extract query parameters from.\n * If not provided, it will be captured from the first handleRequest call.\n * @deprecated Pass request to handleRequest instead of createPackClient\n */\n request?: Request;\n}\n\ntype Variables = Record<string, any>;\n\ninterface QueryOptions {\n variables?: Variables;\n cache?: CachingStrategy;\n test?: TestInput;\n}\n\ninterface QueryError {\n message: string;\n param?: string;\n code?: string;\n type: string;\n}\n\ninterface QueryResponse<T> {\n data: T | null;\n error: QueryError | null;\n /**\n * Tests newly assigned on this request, each owing one exposure.\n *\n * A list once a visitor can hold several tests. Deliberately the same key as\n * the single-test era rather than a new one: themes forward this value to\n * `PackTestRoute` without inspecting it, so widening it in place means an\n * existing theme reports every exposure with no change. A lone test is still\n * emitted unwrapped so anything that does read it keeps working.\n */\n packTestInfo?: Test | Test[];\n}\n\nexport interface PackCustomizerMeta {\n environment?: string;\n overlay?: {\n src?: string;\n version?: string;\n };\n previewContext?: {\n linkName?: string;\n locale?: string;\n releaseId?: string;\n releaseName?: string;\n pageDraft?: string;\n siteSettingsDraft?: string;\n testHandle?: string;\n testVariantHandle?: string;\n };\n [key: string]: any;\n}\n\nexport interface Pack {\n abTest: Test | null | undefined;\n /** Every test this visitor is bucketed into, including ones not serving here. */\n abTests: Test[];\n /**\n * @deprecated The method should not be used\n */\n getPackSessionData(): {\n storeId: string;\n sessionId: string;\n abTest: Test | null | undefined;\n abTests: Test[];\n isPreviewModeEnabled: boolean;\n customizerMeta: any;\n };\n getPackContextData(): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packAbTests: Test[];\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n packConsent: PackConsent;\n packConsentAllowed: PackConsentAllowed;\n };\n /** The visitor's consent per purpose, as resolved for this request. */\n consent: PackConsent;\n /** Whether each purpose may be used, after the unknown-consent policy. */\n consentAllowed: PackConsentAllowed;\n handleRequest(request: Request): Promise<(response: Response) => void>;\n isPreviewModeEnabled: () => boolean;\n isValidEditToken: PackClient[\"isValidEditToken\"];\n query: <T = any>(\n query: string,\n options: QueryOptions,\n ) => Promise<QueryResponse<T>>;\n session: PackSession;\n testSession: PackTestSession;\n}\n\ninterface DefaultThemeData {\n data: Record<string, any>;\n}\n\n/**\n * Create an SHA-256 hash as a hex string\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string\n */\nasync function sha256(message: string): Promise<string> {\n // encode as UTF-8\n const messageBuffer = new TextEncoder().encode(message);\n // hash the message\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", messageBuffer);\n // convert bytes to hex string\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Hash query and its parameters for use as cache key.\n * NOTE: Oxygen deployment will break if the cache key is long or contains `\\n`\n */\nfunction hashQuery(\n query: string,\n variables?: Variables,\n headers?: {},\n): Promise<string> {\n let hash = query;\n if (variables !== null) hash += JSON.stringify(variables);\n if (headers !== null) hash += JSON.stringify(headers);\n\n return sha256(hash);\n}\n\nasync function getCacheKey(\n withCache: ReturnType<typeof createWithCache>,\n query: string,\n token: string,\n options: {\n variables?: Variables;\n headers?: {};\n },\n) {\n let queryHash = await hashQuery(query, options?.variables, options?.headers);\n\n let publishedAt;\n try {\n const resp = await withCache.run<{ publishedAt?: string } | null>(\n {\n cacheKey: [\"pack:content:publishedAt\"],\n cacheStrategy: CacheCustom({\n maxAge: 15,\n staleWhileRevalidate: 15,\n }),\n shouldCacheResult: (value) => value !== null,\n },\n async ({ addDebugData }): Promise<{ publishedAt?: string } | null> => {\n const URL =\n \"https://cache-check-production.packdigital.workers.dev/published-at\";\n const resp = await fetch(URL, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n addDebugData?.({\n displayName: \"Pack Cache Check\",\n response: resp,\n });\n\n const { status } = resp;\n if (status !== 200) {\n let message;\n\n if (status === 401) {\n message =\n \"Pack error: Unauthorized request to cache check service. Please check your token.\";\n } else {\n message = `Pack error: Request to cache check service failed with status ${status}`;\n }\n\n debug(`Cache check error: ${message}`);\n console.error(message);\n return null;\n }\n\n return resp.json();\n },\n );\n\n publishedAt = resp?.publishedAt;\n } catch (err) {\n debug(`Error getting cache key: ${err}`);\n console.error(err);\n }\n\n if (publishedAt) {\n return `${queryHash}:${publishedAt}`;\n }\n\n return queryHash;\n}\n\n// Extends the CacheLong strategy with a stale-if-error policy\nconst cacheCustom = CacheCustom({\n maxAge: 3600,\n staleWhileRevalidate: 82800,\n staleIfError: 86400, // 1 day\n});\n\n/** Resolves the default data for a given query based on the theme config */\nfunction resolveQuery({\n query,\n variables,\n defaultThemeData,\n}: {\n query: string;\n variables?: Variables;\n defaultThemeData: DefaultThemeData;\n}): any {\n const queryField = extractTopLevelField(query);\n const identifier = variables?.handle || variables?.id;\n\n const defaultDataForField = defaultThemeData.data[queryField];\n if (!defaultDataForField) {\n return null;\n }\n\n return {\n [queryField]: identifier\n ? defaultDataForField[identifier]\n : defaultDataForField,\n };\n}\n\n/**\n * Extracts the top-level field from a GraphQL query string.\n *\n * The function assumes that the query follows the standard GraphQL syntax\n * and expects the top-level field to be the first field in the query.\n *\n * @example\n * const query = `\n * query GetProduct($id: ID!) {\n * product(id: $id) {\n * id\n * name\n * }\n * }\n * `;\n * const topLevelField = extractTopLevelField(query);\n * console.log(topLevelField); // Output: \"product\"\n */\nfunction extractTopLevelField(query: string): string {\n const match = query.match(/\\{[^{]*?\\w+(?=\\(|:|\\s*\\{)/);\n if (match) {\n return match[0].slice(1).trim();\n }\n return \"\";\n}\n\nexport function createPackClient(options: CreatePackClientOptions): Pack {\n const {\n cache,\n waitUntil,\n session,\n testSession,\n contentEnvironment,\n storeId,\n token,\n apiUrl,\n defaultThemeData,\n getCustomerContext,\n customerContextTimeoutMs,\n i18n,\n request,\n } = options;\n\n const previewEnabled = !!session.get(\"previewEnabled\");\n const previewEnvironment = session.get(\"environment\");\n const locale = session.get(\"locale\");\n const releaseId = session.get(\"releaseId\");\n const pageDraft = session.get(\"pageDraft\");\n const siteSettingsDraft = session.get(\"siteSettingsDraft\");\n const testHandle = session.get(\"testHandle\");\n const testVariantHandle = session.get(\"testVariantHandle\");\n\n const clientContentEnvironment = previewEnvironment || contentEnvironment;\n\n let packClient: PackClient;\n let testInfoForRequest: TestInfo | undefined = undefined;\n // Every assignment resolved for this request. Only the primary drives content\n // headers and the loader today; the full set is what multi-test exposure\n // tracking consumes.\n let testInfoResult: TestInfoResult | undefined = undefined;\n let testInfoPromise: Promise<TestInfoResult> | undefined = undefined;\n let currentRequest: Request | undefined = request;\n let testFromQueryParams: TestInput | null = request\n ? getTestFromQueryParams(request)\n : null;\n\n // In preview/customizer mode the selected A/B test is carried on the Pack\n // session (set by the preview loader from customizerMeta.previewContext) and\n // today only drives CMS content resolution. Surface it through pack.abTest as\n // well so code-driven storefront variants render the previewed variant —\n // matching the live site. Requires BOTH handles so a content-only or control\n // preview does not fabricate a fake test.\n const testFromPreviewSession: TestInput | null =\n previewEnabled && testHandle && testVariantHandle\n ? { testId: \"\", testHandle, testVariantId: \"\", testVariantHandle }\n : null;\n\n // Prefer a complete test from URL query params, otherwise fall back to the\n // selected preview-session test. Evaluated lazily so query params captured in\n // handleRequest are honored.\n const getExplicitTestForSession = (): TestInput | null =>\n hasCompleteTestInput(testFromQueryParams)\n ? testFromQueryParams\n : testFromPreviewSession;\n\n /**\n * Every test the visitor is bucketed into, including ones whose targeting\n * does not match this request. Themes spreading `getPackContextData()` in the\n * root loader get this without threading it through each route.\n *\n * Explicit query-param tests and preview mode surface as the single test they\n * name, matching `abTest`.\n *\n * Ordered like `pickPrimary` — oldest assignment first, ties broken on test id\n * — so `abTests[0]` is always the same test as `abTest`. Construction order\n * would agree only by luck: `getTestInfo` appends restored and newly assigned\n * tests after reconciled ones, and a cap event re-keys the stored map. The\n * tie-break carries the common case, because every test assigned in one request\n * shares an `assignedAt` millisecond.\n */\n const getCurrentAbTests = (): Test[] => {\n const explicit = getExplicitTestForSession();\n if (hasCompleteTestInput(explicit) || previewEnabled) {\n const current = getCurrentAbTest();\n return current ? [current] : [];\n }\n\n // `TestInfo` carries no `assignedAt`, so age comes from the session — the\n // same source `pickPrimary` reads.\n const assignments = testSession?.getAssignments() ?? {};\n const byAge = (a: Test, b: Test) =>\n (assignments[a.id]?.assignedAt ?? 0) -\n (assignments[b.id]?.assignedAt ?? 0) || a.id.localeCompare(b.id);\n\n if (testInfoResult) {\n return testInfoResult.tests\n .map(({ isFirstExposure: _isFirstExposure, ...test }) => test)\n .sort(byAge);\n }\n\n return Object.values(assignments)\n .map((assignment) => ({\n id: assignment.id,\n handle: assignment.handle,\n testVariant: { ...assignment.testVariant },\n }))\n .sort(byAge);\n };\n\n const getCurrentAbTest = (): Test | null | undefined =>\n getTestSession(testSession, getExplicitTestForSession(), previewEnabled);\n\n if (!token && !defaultThemeData) {\n throw new Error(\n \"ERR_HY_MISSING_TOKEN: The Pack client token is missing or empty. Please provide a valid token or default theme data. Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_TOKEN\",\n );\n }\n\n if (!storeId) {\n throw new Error(\n \"ERR_HY_MISSING_STORE_ID: The Pack Store ID is missing or empty. Please provide a valid Store ID. Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_STORE_ID\",\n );\n }\n\n const handleRequest = async (request: Request) => {\n // Store the request for use in query() if not already provided\n if (!currentRequest) {\n currentRequest = request;\n testFromQueryParams = getTestFromQueryParams(request);\n }\n\n return (response: Response) => {\n const jar = cookie.parse(request.headers.get(\"cookie\") || \"\");\n const legacy = jar[LEGACY_EXPOSED_TEST_COOKIE];\n\n if (!legacy) return;\n\n // Clear the legacy one-shot cookie. It was always consumed on read: the\n // client wrote one test, the server used it on the next request, and the\n // response expired it so a prefetch could not consume it twice.\n response.headers.append(\n \"Set-Cookie\",\n cookie.serialize(LEGACY_EXPOSED_TEST_COOKIE, \"\", {\n maxAge: 0,\n expires: new Date(0),\n path: \"/\",\n }),\n );\n\n // Carry it into the ledger, once. Migration has to happen here rather\n // than client-side: this same response clears the legacy cookie, so by\n // the time hydration runs there is nothing left to read. Skipped when a\n // ledger already exists, so it can never overwrite newer history.\n if (jar[EXPOSED_TEST_COOKIE]) return;\n\n const migrated = parseExposedTests(legacy);\n if (!Object.keys(migrated).length) return;\n\n const secure = new URL(request.url).protocol === \"https:\";\n const { expires, sameSite, path } = exposedCookieOptions(\n new Date(),\n secure,\n );\n\n response.headers.append(\n \"Set-Cookie\",\n cookie.serialize(EXPOSED_TEST_COOKIE, serializeExposedTests(migrated), {\n expires,\n sameSite,\n secure,\n path,\n }),\n );\n };\n };\n\n if (!token) {\n return {\n get abTest() {\n return getCurrentAbTest();\n },\n get abTests() {\n return getCurrentAbTests();\n },\n get consent() {\n return session.consent;\n },\n get consentAllowed() {\n return session.consentAllowed;\n },\n handleRequest,\n getPackSessionData: () => {\n return {\n storeId: storeId,\n sessionId: session.id,\n abTest: getCurrentAbTest(),\n abTests: getCurrentAbTests(),\n isPreviewModeEnabled: previewEnabled,\n customizerMeta: session.get(\"customizerMeta\"),\n };\n },\n getPackContextData: (): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packAbTests: Test[];\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n packConsent: PackConsent;\n packConsentAllowed: PackConsentAllowed;\n } => {\n return {\n packStoreId: storeId,\n packSessionId: session.id,\n packAbTest: getCurrentAbTest(),\n packAbTests: getCurrentAbTests(),\n packIsPreviewMode: previewEnabled,\n packCustomizerMeta: session.get(\"customizerMeta\"),\n packConsent: session.consent,\n packConsentAllowed: session.consentAllowed,\n };\n },\n isPreviewModeEnabled: () => previewEnabled,\n isValidEditToken: () => new Promise(() => false),\n async query<T = any>(\n query: string,\n { variables }: QueryOptions = {},\n ): Promise<QueryResponse<T>> {\n if (!defaultThemeData?.data) {\n debug(\"Warning: Invalid default theme data provided to Pack client\");\n console.warn(\"Invalid default theme data provided to Pack client.\");\n return { data: null, error: null };\n }\n\n const data = resolveQuery({ query, variables, defaultThemeData });\n\n return { data: data as T, error: null };\n },\n session,\n testSession,\n };\n }\n\n const resolvedApiUrl = apiUrl\n ? apiUrl\n : previewEnabled || process.env.NODE_ENV === \"development\"\n ? \"https://app.packdigital.com/graphql\"\n : undefined;\n\n packClient = new PackClient({\n // Use apiUrl, it is configured\n // Use active API URL if preview mode is enabled\n // Otherwise, Live PackClient uses its internal configuration\n apiUrl: resolvedApiUrl,\n storeId,\n token,\n contentEnvironment: clientContentEnvironment,\n sessionId: session.id,\n clientName: \"HydrogenClient\",\n locale,\n releaseId,\n pageDraft,\n siteSettingsDraft,\n testHandle,\n testVariantHandle,\n // When in preview mode, ignore test status to allow previewing draft tests\n ignoreTestStatus: previewEnabled,\n });\n\n return {\n get abTest() {\n return getCurrentAbTest();\n },\n get abTests() {\n return getCurrentAbTests();\n },\n get consent() {\n return session.consent;\n },\n get consentAllowed() {\n return session.consentAllowed;\n },\n getPackSessionData: () => {\n return {\n storeId: storeId,\n sessionId: session.id,\n abTest: getCurrentAbTest(),\n abTests: getCurrentAbTests(),\n isPreviewModeEnabled: previewEnabled,\n customizerMeta: session.get(\"customizerMeta\"),\n };\n },\n getPackContextData: (): {\n packStoreId: string;\n packSessionId: string;\n packAbTest: Test | null | undefined;\n packAbTests: Test[];\n packIsPreviewMode: boolean;\n packCustomizerMeta: PackCustomizerMeta | null;\n packConsent: PackConsent;\n packConsentAllowed: PackConsentAllowed;\n } => {\n return {\n packStoreId: storeId,\n packSessionId: session.id,\n packAbTest: getCurrentAbTest(),\n packAbTests: getCurrentAbTests(),\n packIsPreviewMode: previewEnabled,\n packCustomizerMeta: session.get(\"customizerMeta\"),\n packConsent: session.consent,\n packConsentAllowed: session.consentAllowed,\n };\n },\n handleRequest,\n isPreviewModeEnabled: () => previewEnabled,\n isValidEditToken: (token: string | null) =>\n packClient.isValidEditToken(token),\n async query<T = any>(\n query: string,\n { variables, cache: strategy = cacheCustom, test }: QueryOptions = {},\n ): Promise<QueryResponse<T>> {\n try {\n let headers: any = {};\n let testInfoForLoader: Test | Test[] | undefined = undefined;\n\n const withCache = createWithCache({\n cache,\n waitUntil,\n request: new Request(\"https://pack.local/cache\", { method: \"GET\" }),\n });\n\n const queryVariables = variables ? { ...variables } : {};\n if (previewEnabled) {\n queryVariables.version = \"CURRENT\";\n } else {\n queryVariables.version = \"PUBLISHED\";\n }\n\n // Add locale to variables if it exists\n if (i18n) {\n queryVariables.language = i18n.language;\n queryVariables.country = i18n.country;\n }\n\n const explicitTest = testFromQueryParams || test;\n const resolveTestInfo = !previewEnabled && !explicitTest;\n\n if (\n resolveTestInfo &&\n packClient &&\n token &&\n !testInfoForRequest &&\n currentRequest\n ) {\n try {\n if (!testInfoPromise) {\n debug(\n \"[Pack Test] Creating getTestInfo promise - first query for this request\",\n );\n testInfoPromise = getTestInfo({\n getCustomerContext,\n customerContextTimeoutMs,\n analyticsConsentAllowed: session.consentAllowed.analytics,\n request: currentRequest,\n testTargetAudienceAttributes:\n getTestTargetingAttributesFromRequest(currentRequest),\n packClient,\n testSession, // Use dedicated test session instead\n withCache,\n token,\n });\n } else {\n debug(\n \"[Pack Test] Reusing existing getTestInfo promise - concurrent query\",\n );\n }\n testInfoResult = await testInfoPromise;\n testInfoForRequest = testInfoResult?.primary;\n } catch (error) {\n debug(\n \"[Pack Test] Error getting test info, continuing without test:\",\n error,\n );\n console.error(\n \"[Pack Test] Error getting test info, continuing without test:\",\n error,\n );\n // Continue without test info to allow site to load\n testInfoForRequest = undefined;\n testInfoResult = undefined;\n testInfoPromise = undefined; // Reset promise so it can be retried on next query\n }\n } else if (\n resolveTestInfo &&\n packClient &&\n token &&\n testInfoForRequest\n ) {\n debug(\"[Pack Test] Using cached testInfo - subsequent query\");\n if (process.env.NODE_ENV === \"development\") {\n console.log(\"[Pack Test] Using cached testInfo - subsequent query\");\n }\n }\n\n if (resolveTestInfo && testInfoResult) {\n testInfoForLoader = toPackTestInfo(\n testInfoResult.tests\n .filter((test) => test.isFirstExposure)\n .map(({ isFirstExposure: _isFirstExposure, ...test }) => test),\n );\n }\n\n // Each query carries the variant of whichever assigned test can affect\n // that kind of content. Site settings and page content are separate\n // queries, so a site-settings test and a page test are both served on\n // one page rather than one starving the other.\n //\n // An unclassifiable query falls back to the request primary, preserving\n // the previous behavior rather than risking a variant being dropped.\n const queryClass = resolveTestInfo ? classifyQuery(query) : undefined;\n const testInfoForQuery = queryClass\n ? testInfoResult?.byQueryClass[queryClass]\n : testInfoForRequest;\n\n if (resolveTestInfo && queryClass) {\n debug(\n \"[Pack Test] Query class resolved to a test:\",\n JSON.stringify({\n queryClass,\n testId: testInfoForQuery?.id,\n variantId: testInfoForQuery?.testVariant?.id,\n }),\n );\n }\n\n headers = setTestHeaders(headers, {\n testInfoForRequest: testInfoForQuery,\n testFromQueryParams: explicitTest,\n });\n\n // Preview mode always bypasses the cache\n if (previewEnabled) {\n try {\n const result = await packClient.fetch(query, {\n variables: queryVariables,\n headers: headers,\n });\n\n return {\n ...result,\n packTestInfo: testInfoForLoader,\n };\n } catch (error) {\n return { error: error as QueryError, data: null };\n }\n }\n\n const queryHash = await getCacheKey(withCache, query, token, {\n variables: queryVariables,\n headers,\n });\n\n const response = await withCache.run(\n {\n cacheKey: [queryHash],\n cacheStrategy: strategy,\n shouldCacheResult: (value) => !value?.error,\n },\n async () => {\n try {\n const result = await packClient.fetch(query, {\n variables: queryVariables,\n headers: headers,\n });\n\n return result;\n } catch (error) {\n return { error, data: null };\n }\n },\n );\n\n return response.error\n ? response\n : {\n ...response,\n packTestInfo: testInfoForLoader,\n };\n } catch (error) {\n debug(\n \"[Pack Test] Critical error in query method, returning error:\",\n error,\n );\n console.error(\n \"[Pack Test] Critical error in query method, returning error:\",\n error,\n );\n const queryError: QueryError = {\n message: error instanceof Error ? error.message : String(error),\n type: \"NetworkError\",\n };\n return { error: queryError, data: null };\n }\n },\n session,\n testSession,\n };\n}\n","import { PackClient } from \"@pack/client\";\nimport {\n PackTestSession,\n} from \"../session/test-session\";\nimport * as cookie from \"cookie\";\nimport {\n LocalTestResolver,\n getContendedQueryClasses,\n isPersonalization,\n} from \"./local-test-resolver\";\nimport type { TestWithRules } from \"./local-test-resolver\";\nimport { QUERY_CLASSES, type QueryClass } from \"./query-surfaces\";\nimport createDebug from \"debug\";\nimport { getImpressionSectionIdsForVariant } from \"./impression\";\nimport { buildIdentityBundle } from \"../audiences\";\nimport {\n resolveCustomerContext,\n type GetCustomerContext,\n} from \"./customer-context\";\nimport {\n EXPOSED_TEST_COOKIE,\n LEGACY_EXPOSED_TEST_COOKIE,\n parseExposedTests,\n type ExposedTests,\n} from \"./exposed-tests\";\n\nconst debug = createDebug(\"pack:ab-testing:test\");\n\nexport interface TestInput {\n testId?: string;\n testHandle?: string;\n testVariantId?: string;\n testVariantHandle?: string;\n}\n\nexport interface Test {\n id: string;\n handle: string;\n impressionTrigger?: string;\n testVariant: {\n id: string;\n handle: string;\n };\n impression?: {\n sectionIds?: string[];\n };\n /**\n * Set on a personalization, so the exposure ledger records it compactly. It\n * is never stored in the session; see `getTestInfo`.\n */\n personalization?: true;\n}\n\nexport interface TestTargetAudienceAttributes {\n url?: string;\n query?: string;\n path?: string;\n utmCampaign?: string;\n utmContent?: string;\n utmMedium?: string;\n utmSource?: string;\n utmTerm?: string;\n}\n\n// Removed: QUERY_TEST_VARIANT_IS_RUNNING is no longer needed\n// Test validity is now checked via the test-cache-check system\n\n/**\n * Personalizations ride this cross-visitor response rather than being resolved\n * per visitor, so they cost no extra request. The operation name stays\n * TestsByRules because Stellate analytics keys off it.\n *\n * Requesting `overriddenSurfaces` and `personalizationsByRules` makes this a\n * hard dependency on a CMS that exposes both: GraphQL rejects the whole\n * document at validation rather than omitting an unknown field, so against an\n * older API the rules fetch fails and no test is served at all. Deploy the CMS\n * before publishing the SDK.\n */\nconst QUERY_TESTS_BY_RULES = `#graphql\n query TestsByRules($status: String) {\n personalizationsByRules {\n id\n handle\n experimentType\n rules {\n attribute\n operator\n value\n }\n impressionTrigger\n experimentAudience {\n pinnedVersion\n pinnedRules\n }\n testVariants {\n id\n handle\n trafficPercentage\n overriddenSurfaces\n sectionTestVariants {\n section {\n id\n }\n }\n }\n }\n testsByRulesV2(status: $status) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n handle\n experimentType\n rules {\n attribute\n operator\n value\n }\n impressionTrigger\n experimentAudience {\n pinnedVersion\n pinnedRules\n }\n testVariants {\n id\n handle\n trafficPercentage\n overriddenSurfaces\n sectionTestVariants {\n section {\n id\n }\n }\n }\n }\n }\n }\n }\n`;\n\n// Global instance of LocalTestResolver - no caching, just holds rules for request duration\nconst localTestResolver = new LocalTestResolver();\n\n// Generate cache key for shared test rules (same for all users)\nfunction generateTestRulesCacheKey(\n storeId: string,\n contentEnvironment?: string,\n): string {\n return `pack-tests:${storeId}:${contentEnvironment || \"default\"}`;\n}\n\n// Function to fetch test rules with shared caching (storefront-environment level)\nasync function fetchTestRulesShared(\n packClient: PackClient,\n withCache: any, // ReturnType<typeof createWithCache>\n token: string,\n): Promise<any[]> {\n const baseCacheKey = generateTestRulesCacheKey(\n packClient.storeId || \"\",\n packClient.contentEnvironment,\n );\n\n debug(\n \"[Pack Test] Fetching test rules with shared cache:\",\n JSON.stringify({\n baseCacheKey,\n storeId: packClient.storeId,\n contentEnvironment: packClient.contentEnvironment,\n }),\n );\n\n // Check test cache timestamp to include in cache key for automatic invalidation\n // This is the only place where test-cache-check should be called\n let testsUpdatedAt;\n try {\n const resp = await withCache.run(\n {\n cacheKey: [\"pack:tests:updatedAt\"],\n cacheStrategy: {\n maxAge: 15,\n staleWhileRevalidate: 15,\n },\n shouldCacheResult: (value: any) => value !== null,\n },\n async ({\n addDebugData,\n }: any): Promise<{ testsUpdatedAt?: string } | null> => {\n // Always use production endpoint for now\n // TODO: Add proper environment variable support for custom URLs\n const URL =\n \"https://test-cache-check-production.packdigital.workers.dev/tests-updated-at\";\n\n const resp = await fetch(URL, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n addDebugData?.({\n displayName: \"Pack Test Cache Check\",\n response: resp,\n });\n\n const { status } = resp;\n if (status !== 200) {\n let message;\n\n if (status === 401) {\n message =\n \"Pack error: Unauthorized request to test cache check service. Please check your token.\";\n } else {\n message = `Pack error: Request to test cache check service failed with status ${status}`;\n }\n\n debug(`[Pack Test] Cache check error: ${message}`);\n console.error(message);\n return null;\n }\n\n const data = await resp.json();\n debug(\"[Pack Test] Timestamp response:\", JSON.stringify(data));\n return data as { testsUpdatedAt?: string } | null;\n },\n );\n\n testsUpdatedAt = resp?.testsUpdatedAt;\n debug(\n \"[Pack Test] Using timestamp for cache key:\",\n JSON.stringify({\n testsUpdatedAt,\n hasTimestamp: !!testsUpdatedAt,\n }),\n );\n } catch (err) {\n debug(\n \"[Pack Test] Error checking test cache timestamp:\",\n JSON.stringify(err),\n );\n console.error(\"[Pack Test] Error checking test cache timestamp:\", err);\n }\n\n // Include testsUpdatedAt in cache key for cache invalidation\n const cacheKey = testsUpdatedAt\n ? `${baseCacheKey}:${testsUpdatedAt}`\n : baseCacheKey;\n\n debug(\"[Pack Test] Final cache key for test rules:\", cacheKey);\n\n return withCache.run(\n {\n cacheKey: [cacheKey],\n cacheStrategy: {\n maxAge: 3600, // 1 hour\n staleWhileRevalidate: 86400, // 24 hours\n staleIfError: 86400, // 24 hours\n },\n shouldCacheResult: (result: any) =>\n Array.isArray(result) && result.length >= 0,\n displayName: \"Pack Test Rules\",\n },\n async ({ addDebugData }: any): Promise<any[]> => {\n const startTime = Date.now();\n debug(\n \"[Pack Test] Cache miss - fetching test rules from Pack GraphQL API\",\n );\n\n try {\n // Fetch test rules from Pack API (only running tests)\n const { data, error } = await packClient.fetch(QUERY_TESTS_BY_RULES, {\n variables: { status: \"running\" },\n });\n\n const fetchDuration = Date.now() - startTime;\n debug(\n \"[Pack Test] GraphQL query completed:\",\n JSON.stringify({\n duration: `${fetchDuration}ms`,\n hasData: !!data,\n hasError: !!error,\n totalCount: data?.testsByRulesV2?.totalCount,\n edgesCount: data?.testsByRulesV2?.edges?.length || 0,\n personalizationCount: data?.personalizationsByRules?.length || 0,\n }),\n );\n\n addDebugData?.({\n displayName: \"Pack Test Rules Query\",\n });\n\n if (error) {\n debug(\n \"[Pack Test] Error fetching test rules:\",\n JSON.stringify({\n error,\n errorType: typeof error,\n errorMessage: error?.message || JSON.stringify(error),\n }),\n );\n throw new Error(`GraphQL error: ${JSON.stringify(error)}`);\n }\n\n // One array: a personalization is a single full-allocation variant\n // gated by an audience, which the A/B path already handles. Order is not\n // precedence — contention is settled during assignment.\n const tests =\n data?.testsByRulesV2?.edges?.map((edge: any) => edge.node) || [];\n const personalizations = data?.personalizationsByRules || [];\n const rules = [...tests, ...personalizations];\n\n debug(\n \"[Pack Test] Successfully fetched and cached test rules:\",\n JSON.stringify({\n rulesCount: rules.length,\n cacheKey,\n rules: rules.map((rule: any) => ({\n id: rule.id,\n handle: rule.handle,\n rulesCount: rule.rules?.length || 0,\n variantsCount: rule.testVariants?.length || 0,\n })),\n }),\n );\n\n return rules;\n } catch (error) {\n const fetchDuration = Date.now() - startTime;\n debug(\n \"[Pack Test] Exception fetching test rules:\",\n JSON.stringify({\n error: error instanceof Error ? error.message : error,\n duration: `${fetchDuration}ms`,\n stack: error instanceof Error ? error.stack : undefined,\n }),\n );\n throw error;\n }\n },\n );\n}\n\nexport interface GetTestInfoOptions {\n request: Request;\n testTargetAudienceAttributes: TestTargetAudienceAttributes | null;\n packClient: PackClient;\n testSession: PackTestSession;\n withCache?: any; // ReturnType<typeof createWithCache>\n token?: string; // Pack secret token for cache check service\n getCustomerContext?: GetCustomerContext;\n customerContextTimeoutMs?: number;\n /** Analytics consent as resolved for the Pack session. */\n analyticsConsentAllowed?: boolean;\n}\n\nexport interface TestInfo extends Test {\n isFirstExposure?: boolean;\n}\n\nfunction isPrefetchRequest(request: Request): boolean {\n const secPurpose = request.headers.get(\"sec-purpose\")?.toLowerCase();\n const purpose = request.headers.get(\"purpose\")?.toLowerCase();\n const xPurpose = request.headers.get(\"x-purpose\")?.toLowerCase();\n\n return [secPurpose, purpose, xPurpose].some((value) =>\n value\n ?.split(\",\")\n .map((part) => part.trim())\n .includes(\"prefetch\"),\n );\n}\n\n/**\n * Build the request-facing shape for a test + variant.\n *\n * Always derived from freshly fetched rules, never from the session, so\n * `impressionTrigger` and the impression section ids reflect the merchant's\n * current configuration.\n */\nfunction buildTestInfo(\n test: TestWithRules,\n variant: TestWithRules[\"testVariants\"][number],\n isFirstExposure: boolean | undefined,\n): TestInfo {\n const impressionSectionIds = getImpressionSectionIdsForVariant(test, variant);\n\n return {\n id: test.id,\n handle: test.handle,\n impressionTrigger: test.impressionTrigger,\n testVariant: {\n id: variant.id,\n handle: variant.handle,\n },\n impression:\n impressionSectionIds.length > 0\n ? { sectionIds: impressionSectionIds }\n : undefined,\n isFirstExposure,\n };\n}\n\n/**\n * Load the shared test rules into the resolver.\n *\n * Returns false only when this request has no usable rules at all. A transport\n * failure falls back to rules a previous request left in this isolate — dropping\n * every assignment because one fetch failed would unbucket live visitors.\n */\nasync function loadTestRules(\n packClient: PackClient,\n withCache?: any,\n token?: string,\n): Promise<boolean> {\n if (!withCache || !token) {\n debug(\n \"[Pack Test] No withCache or token available - cannot fetch test rules\",\n );\n return localTestResolver.hasRules();\n }\n\n try {\n const rules = await fetchTestRulesShared(packClient, withCache, token);\n localTestResolver.setTestRules(rules);\n debug(\"[Pack Test] Updated local resolver with rules from shared cache\");\n return true;\n } catch (error) {\n debug(\"[Pack Test] Failed to fetch test rules:\", JSON.stringify(error));\n console.error(\"[Pack Test] Failed to fetch test rules:\", error);\n return localTestResolver.hasRules();\n }\n}\n\n/**\n * Tests this visitor was already exposed to before the current session cookie\n * existed, written client-side once each impression fires.\n */\nfunction parseExposedTestCookie(request: Request): ExposedTests {\n const jar = cookie.parse(request.headers.get(\"cookie\") || \"\");\n // Ledger first; the legacy one-shot cookie only for a visitor mid-upgrade.\n const raw = jar?.[EXPOSED_TEST_COOKIE] ?? jar?.[LEGACY_EXPOSED_TEST_COOKIE];\n\n return parseExposedTests(raw);\n}\n\n/**\n * Find a stored assignment's test and variant in the current rules. A missing\n * test means it was paused or deleted; a missing variant means it was removed\n * from the test. Either way the assignment can no longer be served.\n */\nfunction resolveAgainstRules(\n rules: LocalTestResolver,\n testId: string,\n variantId: string | undefined,\n):\n | {\n test: TestWithRules;\n variant: TestWithRules[\"testVariants\"][number];\n }\n | null {\n const test = rules.getTestById(testId);\n if (!test) return null;\n\n const variant = test.testVariants?.find((v) => v.id === variantId);\n if (!variant) return null;\n\n return { test, variant };\n}\n\n// Slid forward on each reconcile but display/debug only — it does not gate\n// assignment. A valid assignment is sticky until its test or variant goes away.\nfunction getExpireAtDate() {\n const expireAt = new Date();\n expireAt.setHours(expireAt.getHours() + 4); // 4 hours\n return expireAt;\n}\n\nexport interface TestInfoResult {\n /**\n * Every assignment live on the session after reconciliation, including ones\n * whose targeting does not match this request. A visitor stays bucketed into\n * a homepage test while browsing a PDP.\n */\n tests: TestInfo[];\n /**\n * The assignment driving CMS content resolution for this request, or\n * undefined when none of the visitor's tests target it.\n *\n * Used for queries whose class cannot be determined; classified queries read\n * `byQueryClass` instead.\n */\n primary: TestInfo | undefined;\n /**\n * The assignment that supplies content for each kind of CMS query.\n *\n * Site settings, pages and products are fetched by separate queries, each\n * carrying its own variant header, so several tests can be served on one page\n * as long as no single query is affected by two of them — which assignment\n * already guarantees.\n */\n byQueryClass: Partial<Record<QueryClass, TestInfo>>;\n}\n\n/** An assignment plus when it was made, for stable primary selection. */\ntype LiveAssignment = { test: TestInfo; assignedAt: number };\n\n/** `assignedAt` for a personalization, which is resolved per request, not stored. */\nconst PERSONALIZATION_ASSIGNED_AT = 0;\n\n/** A candidate for a surface, with what `outranks` compares. */\ntype Contender = LiveAssignment & { isPersonalization: boolean };\n\n/**\n * Whether `challenger` serves instead of `incumbent`.\n *\n * Type outranks age. A personalization is a deliberate experience for a known\n * audience, so it takes the surface from an A/B arm however long that arm has\n * held it. Between two of the same type, oldest first, ties on test id.\n * Determinism matters because the winner's variant id becomes part of the CMS\n * cache key.\n *\n * Shared by `mapByQueryClass` and `pickRequestPrimary` so a classified query\n * and an unclassified one on the same request cannot pick different winners.\n */\nfunction outranks(challenger: Contender, incumbent: Contender): boolean {\n if (challenger.isPersonalization !== incumbent.isPersonalization) {\n return challenger.isPersonalization;\n }\n\n return (\n challenger.assignedAt < incumbent.assignedAt ||\n (challenger.assignedAt === incumbent.assignedAt &&\n challenger.test.id.localeCompare(incumbent.test.id) < 0)\n );\n}\n\nfunction emptyResult(): TestInfoResult {\n return { tests: [], primary: undefined, byQueryClass: {} };\n}\n\n/**\n * Map each query class to the assignment that supplies its content.\n *\n * Only assignments whose targeting matches this request are candidates, so a\n * test scoped to `/products/` does not supply content on the homepage.\n *\n * Assignment refuses a test that contends for a class an existing assignment\n * claims *on that request*, so two assignments can still reach one class here:\n *\n * - A held test only claims where its targeting matches. One scoped to `/`\n * blocks nothing on `/products/x`, so a broad test contending for the same\n * class joins there, and back on `/` both apply. Accepted so tests on\n * different pages can each enroll the visitor; the broad test's arms both see\n * the older test's content here, which dilutes its result without biasing it.\n * - A merchant editing a running variant to override content another test\n * already covers widens that test's footprint retroactively.\n *\n * Either way the older assignment keeps the class and the younger stops\n * supplying content while remaining assigned — so the collision is logged rather\n * than passed over, since nothing else makes it visible.\n */\nfunction mapByQueryClass(\n live: LiveAssignment[],\n matchesRequest: ReadonlySet<string>,\n rulesSnapshot: LocalTestResolver,\n): Partial<Record<QueryClass, TestInfo>> {\n const winners: Partial<Record<QueryClass, Contender>> = {};\n\n for (const entry of live) {\n if (!matchesRequest.has(entry.test.id)) continue;\n\n const rules = rulesSnapshot.getTestById(entry.test.id);\n if (!rules) continue;\n\n const challenger: Contender = {\n ...entry,\n isPersonalization: isPersonalization(rules),\n };\n\n for (const queryClass of getContendedQueryClasses(rules)) {\n const incumbent = winners[queryClass];\n\n if (incumbent) {\n const challengerWins = outranks(challenger, incumbent);\n\n debug(\n \"[Pack Test] Two assignments reach one query class:\",\n JSON.stringify({\n queryClass,\n servingTestId: challengerWins ? entry.test.id : incumbent.test.id,\n starvedTestId: challengerWins ? incumbent.test.id : entry.test.id,\n reason:\n challenger.isPersonalization !== incumbent.isPersonalization\n ? \"personalization outranks test\"\n : \"older assignment\",\n }),\n );\n\n if (!challengerWins) continue;\n }\n\n winners[queryClass] = challenger;\n }\n }\n\n return Object.fromEntries(\n Object.entries(winners).map(([queryClass, winner]) => [\n queryClass,\n winner.test,\n ]),\n ) as Partial<Record<QueryClass, TestInfo>>;\n}\n\n/**\n * Pick the one assignment whose variant this request serves.\n *\n * Only tests whose targeting matches the request are candidates, so a test\n * scoped to `/` stops supplying its variant on `/products/`. Among those the\n * same rule as `mapByQueryClass` applies (see `outranks`): a personalization\n * beats an A/B test, then the oldest assignment wins — the visitor keeps being\n * served the first test they were bucketed into whenever it applies, instead\n * of the served variant shifting as later tests are assigned.\n *\n * Determinism matters beyond tidiness: this choice becomes the\n * `X-Pack-Test-Variant-Id` header, which is part of the query cache key and the\n * Stellate surrogate keys.\n */\nfunction pickRequestPrimary(\n live: LiveAssignment[],\n matchesRequest: ReadonlySet<string>,\n rulesSnapshot: LocalTestResolver,\n): TestInfo | undefined {\n return live\n .filter((entry) => matchesRequest.has(entry.test.id))\n .map<Contender>((entry) => {\n const rules = rulesSnapshot.getTestById(entry.test.id);\n return { ...entry, isPersonalization: !!rules && isPersonalization(rules) };\n })\n .reduce<Contender | undefined>(\n (best, entry) => (!best || outranks(entry, best) ? entry : best),\n undefined,\n )?.test;\n}\n\n/**\n * Serve what the session already holds, without validating it.\n *\n * Used when the rules are unavailable or the pass throws: the storefront still\n * renders and the visitor keeps the variant they were already served. Nothing\n * is cleared, because a transport failure is not evidence a test ended. No\n * assignment is first exposure here, so no impression fires off stale data.\n */\nfunction resultFromSession(testSession: PackTestSession): TestInfoResult {\n const tests = Object.values(testSession.getAssignments()).map(\n (assignment) =>\n ({\n id: assignment.id,\n handle: assignment.handle,\n testVariant: { ...assignment.testVariant },\n isFirstExposure: undefined,\n }) as TestInfo,\n );\n\n // Rules are unavailable here, so targeting cannot be evaluated. Fall back to\n // the session's own primary rather than serving nothing. Only A/B tests are\n // stored, so no personalization serves without its audience being checked.\n const primaryId = testSession.getPrimaryAssignment()?.id;\n const primary = tests.find((test) => test.id === primaryId) ?? tests[0];\n\n return {\n tests,\n primary,\n // Every class maps to the primary, rather than an empty map.\n //\n // Without rules there are no footprints to be more precise with, and the\n // caller only falls back to the request primary when `classifyQuery` returns\n // undefined (`create-pack-client.ts`). An empty map therefore strips the\n // variant header from every *classified* query — which is every query a test\n // can change — serving a bucketed visitor control content while `useAbTest`\n // still reports their variant and their impression has already fired.\n byQueryClass: primary\n ? Object.fromEntries(QUERY_CLASSES.map((c) => [c, primary]))\n : {},\n };\n}\n\n/**\n * Resolve every test this visitor is bucketed into for this request.\n *\n * One linear pass — reconcile what the session holds against current rules,\n * restore anything the exposure cookie proves they already saw, then assign\n * whatever they are newly eligible for. This replaced a four-branch cascade\n * whose session branch returned early after validating a single test, so a\n * visitor bucketed into any test was never evaluated for another one for the\n * rest of their session (PLT-3844).\n *\n * A valid assignment stays put. Only a paused/removed test or a removed variant\n * ends one, and expiry is deliberately not a trigger: re-rolling on expiry\n * flipped returning visitors between variants and corrupted results.\n */\nexport async function getTestInfo({\n request,\n testTargetAudienceAttributes,\n packClient,\n testSession,\n withCache,\n token,\n getCustomerContext,\n customerContextTimeoutMs,\n analyticsConsentAllowed,\n}: GetTestInfoOptions): Promise<TestInfoResult> {\n debug(\n \"[Pack Test] Getting test info:\",\n JSON.stringify({\n hasTestSession: !!testSession,\n targetingAttributes: testTargetAudienceAttributes,\n requestUrl: request.url,\n }),\n );\n\n if (isPrefetchRequest(request)) {\n debug(\"[Pack Test] Skipping test assignment for prefetch request.\");\n return emptyResult();\n }\n\n if (!testSession) {\n debug(\"[Pack Test] No test session available, returning undefined\");\n return emptyResult();\n }\n\n if (!packClient.storeId) {\n debug(\"[Pack Test] Store ID is required to fetch a test.\");\n console.error(\"[Pack Test] Store ID is required to fetch a test.\");\n return emptyResult();\n }\n\n try {\n if (!(await loadTestRules(packClient, withCache, token))) {\n debug(\"[Pack Test] No rules available - serving stored assignments\");\n return resultFromSession(testSession);\n }\n\n // One snapshot for the whole pass: a concurrent request in this isolate can\n // swap the singleton's rules under either await below.\n const rules = localTestResolver.snapshot();\n\n const live: LiveAssignment[] = [];\n\n // 1. Reconcile what the session holds against the current rules.\n for (const assignment of Object.values(testSession.getAssignments())) {\n const resolved = resolveAgainstRules(\n rules,\n assignment.id,\n assignment.testVariant.id,\n );\n\n if (!resolved) {\n debug(\n \"[Pack Test] Assignment is no longer serveable, clearing:\",\n JSON.stringify({\n testId: assignment.id,\n variantId: assignment.testVariant.id,\n }),\n );\n testSession.clearAssignment(assignment.id);\n continue;\n }\n\n const { test, variant } = resolved;\n\n // Only write when a handle actually moved. An unconditional refresh would\n // dirty the session on every request and rewrite the cookie each response.\n if (\n assignment.handle !== test.handle ||\n assignment.testVariant.handle !== variant.handle\n ) {\n testSession.setAssignment({\n id: test.id,\n handle: test.handle,\n testVariant: { id: variant.id, handle: variant.handle },\n });\n }\n\n live.push({\n test: buildTestInfo(test, variant, undefined),\n assignedAt: assignment.assignedAt,\n });\n }\n\n // 2. Restore a test the visitor was already exposed to, for a session whose\n // cookie was lost but whose exposure cookie survived.\n // Oldest exposure first, and that time stands in for the lost\n // assignedAt: overlapping tests resolve to the older one, and restoring\n // both on one request would otherwise tie and fall to test id order,\n // swapping which test supplies the shared content.\n const exposedTests = Object.values(parseExposedTestCookie(request)).sort(\n (a, b) =>\n (a.exposureTime ?? Infinity) - (b.exposureTime ?? Infinity) ||\n a.id.localeCompare(b.id),\n );\n\n for (const exposedTest of exposedTests) {\n if (live.some((entry) => entry.test.id === exposedTest.id)) continue;\n\n const resolved = resolveAgainstRules(\n rules,\n exposedTest.id,\n exposedTest.testVariant?.id,\n );\n\n if (!resolved) {\n debug(\n \"[Pack Test] Exposed test is no longer active:\",\n JSON.stringify({ testId: exposedTest.id }),\n );\n continue;\n }\n\n const { test, variant } = resolved;\n\n // A personalization is resolved from its audience on every request, so\n // there is no lost assignment to restore.\n if (isPersonalization(test)) continue;\n\n const stored = testSession.setAssignment({\n id: test.id,\n handle: test.handle,\n testVariant: { id: variant.id, handle: variant.handle },\n assignedAt: exposedTest.exposureTime,\n });\n\n if (!stored) {\n // The cap refuses new assignments rather than evicting. Logged here\n // because nothing else records *which* test was dropped on *which*\n // request — the visitor simply never joins it.\n debug(\n \"[Pack Test] Over the cookie byte budget, cannot restore exposed test:\",\n JSON.stringify({ testId: test.id }),\n );\n continue;\n }\n\n debug(\n \"[Pack Test] Restored exposed test from cookie:\",\n JSON.stringify({ testId: test.id, variantId: variant.id }),\n );\n // Already exposed by definition — must not re-fire an impression.\n live.push({\n test: buildTestInfo(test, variant, undefined),\n assignedAt:\n testSession.getAssignment(test.id)?.assignedAt ?? Date.now(),\n });\n }\n\n // 3. Evaluate targeting once. It answers both which tests to assign and\n // which of the visitor's assignments actually apply to this request.\n const identity = buildIdentityBundle(request, {\n hasConsent: analyticsConsentAllowed,\n });\n\n // Only ask the theme who is signed in when an audience on this request\n // could depend on it — the hook sits on the critical path. Left unresolved\n // the identity keeps no auth signal, and `unmetRequirements` refuses those\n // audiences rather than reading the absence as \"anonymous\".\n if (\n getCustomerContext &&\n (await rules.needsCustomerContext(\n testTargetAudienceAttributes || {},\n identity,\n ))\n ) {\n const customer = await resolveCustomerContext(\n getCustomerContext,\n request,\n customerContextTimeoutMs,\n );\n if (customer) {\n identity.isLoggedIn = customer.isLoggedIn;\n if (customer.shopifyCustomerId) {\n identity.shopifyCustomerId = customer.shopifyCustomerId;\n }\n }\n }\n\n const eligible = await rules.getEligibleTests(\n testTargetAudienceAttributes || {},\n identity,\n );\n const matchesRequest = new Set(eligible.map((test) => test.id));\n\n // 4. Assign every test the visitor is newly eligible for. Passing the ids\n // already held keeps sticky assignments from being re-rolled.\n const held = new Set(live.map((entry) => entry.test.id));\n const newlyAssigned = rules.assignVariants(testSession.id, eligible, held);\n\n // The draw is derived from the id, so it only stays fixed per visitor if\n // the id outlives a draw that assigned nothing. A personalization is never\n // stored and has no draw unless it has a holdout (a second variant) or\n // partial traffic, which is re-derived from the id on every request and so\n // needs it kept too.\n if (\n eligible.some(\n (test) =>\n !held.has(test.id) &&\n (!isPersonalization(test) ||\n test.testVariants.length > 1 ||\n (test.testVariants[0]?.trafficPercentage ?? 1) < 1),\n )\n ) {\n testSession.persistId();\n }\n\n // Already reported, per the exposure cookie. For a personalization this is\n // the whole record of having been seen: it is never stored.\n const exposedIds = new Set(exposedTests.map((test) => test.id));\n const unstored = new Set<string>();\n\n for (const assigned of newlyAssigned) {\n const assignedRules = rules.getTestById(assigned.id);\n\n // Not stored: a personalization is re-derived on every request from its\n // audience and, with a holdout or partial traffic, from the kept id.\n // Storing it only cost cookie space that A/B assignments need.\n if (assignedRules && isPersonalization(assignedRules)) {\n unstored.add(assigned.id);\n live.push({\n test: {\n ...assigned,\n personalization: true,\n isFirstExposure: exposedIds.has(assigned.id) ? undefined : true,\n },\n // Constant, so two personalizations on one surface fall to test id\n // order (see `outranks`) rather than to request timing.\n assignedAt: PERSONALIZATION_ASSIGNED_AT,\n });\n continue;\n }\n\n const stored = testSession.setAssignment({\n id: assigned.id,\n handle: assigned.handle,\n testVariant: {\n id: assigned.testVariant.id,\n handle: assigned.testVariant.handle,\n },\n });\n\n if (!stored) {\n // Not a contention loss: this test's classes were free, the visitor is\n // simply holding the maximum. Without this the drop is invisible.\n debug(\n \"[Pack Test] Over the cookie byte budget, dropping a newly eligible test:\",\n JSON.stringify({\n testId: assigned.id,\n testHandle: assigned.handle,\n }),\n );\n continue;\n }\n\n live.push({\n test: { ...assigned, isFirstExposure: true },\n assignedAt:\n testSession.getAssignment(assigned.id)?.assignedAt ?? Date.now(),\n });\n }\n\n // Only when something is actually stored. Sliding expiry unconditionally\n // would dirty the session on every request for the majority of visitors —\n // the ones matching no test at all — and rewrite the cookie each response.\n if (live.some((entry) => !unstored.has(entry.test.id))) {\n testSession.setExpireAt(getExpireAtDate().toISOString());\n }\n\n const byQueryClass = mapByQueryClass(live, matchesRequest, rules);\n\n // Personalizations are never refused at assignment, so one can lose every\n // surface it contends for to another. It then shows nothing and must not\n // report an exposure; it is owed one once it actually serves.\n for (const entry of live) {\n if (!unstored.has(entry.test.id) || !entry.test.isFirstExposure) continue;\n\n const entryRules = rules.getTestById(entry.test.id);\n const contended = entryRules\n ? [...getContendedQueryClasses(entryRules)]\n : [];\n if (\n contended.length &&\n !contended.some((queryClass) => byQueryClass[queryClass]?.id === entry.test.id)\n ) {\n entry.test = { ...entry.test, isFirstExposure: undefined };\n }\n }\n\n const result: TestInfoResult = {\n tests: live.map((entry) => entry.test),\n primary: pickRequestPrimary(live, matchesRequest, rules),\n byQueryClass,\n };\n\n debug(\n \"[Pack Test] Final test info result:\",\n JSON.stringify({\n assignmentCount: result.tests.length,\n firstExposures: result.tests\n .filter((test) => test.isFirstExposure)\n .map((test) => test.id),\n primaryId: result.primary?.id,\n byQueryClass: Object.fromEntries(\n Object.entries(result.byQueryClass).map(([key, test]) => [\n key,\n test?.id,\n ]),\n ),\n }),\n );\n\n return result;\n } catch (error) {\n debug(\n \"[Pack Test] Error resolving test info, serving stored assignments:\",\n JSON.stringify(error),\n );\n console.error(\n \"[Pack Test] Error resolving test info, serving stored assignments:\",\n error,\n );\n return resultFromSession(testSession);\n }\n}\n\n/**\n * An explicit A/B test input is only usable when it identifies BOTH a test\n * (id or handle) AND a variant (id or handle). This prevents partial or\n * control-only preview context from fabricating a bogus test on `pack.abTest`.\n */\nexport function hasCompleteTestInput(\n testInput: TestInput | null | undefined,\n): testInput is TestInput {\n if (!testInput) return false;\n\n const hasTest = Boolean(testInput.testId || testInput.testHandle);\n const hasVariant = Boolean(\n testInput.testVariantId || testInput.testVariantHandle,\n );\n\n return hasTest && hasVariant;\n}\n\n/**\n * The test to surface on `pack.abTest`.\n *\n * This is the visitor's stable assignment, NOT whichever assignment is serving\n * the current page. Those differ once a visitor holds several tests, and the\n * page-dependent answer cannot be delivered here: these hooks read root loader\n * data, and a root loader does not re-run on every client-side navigation\n * (Hydrogen themes routinely opt out via `shouldRevalidate`), so a per-page\n * value goes stale the moment the visitor navigates without revalidating.\n *\n * Content resolution does not depend on this — that is decided per request from\n * the page's targeting rules, server-side. See `pickRequestPrimary`.\n */\nexport function getTestSession(\n testSession?: PackTestSession,\n explicitTest: TestInput | null = null,\n previewEnabled: boolean = false,\n): Test | null | undefined {\n debug(\n \"[Pack Test] Getting test session:\",\n JSON.stringify({\n hasTestSession: !!testSession,\n hasExplicitTest: hasCompleteTestInput(explicitTest),\n previewEnabled,\n }),\n );\n\n // An explicit test (from URL query params or the selected preview-session\n // test) wins. This is what surfaces the previewed variant on `pack.abTest`,\n // so code-driven storefront variants render in the customizer and preview\n // links exactly as they do on the live site.\n if (hasCompleteTestInput(explicitTest)) {\n const result = {\n id: explicitTest.testId || \"\",\n handle: explicitTest.testHandle || \"\",\n testVariant: {\n id: explicitTest.testVariantId || \"\",\n handle: explicitTest.testVariantHandle || \"\",\n },\n };\n debug(\"[Pack Test] Using explicit test input:\", JSON.stringify(result));\n return result;\n }\n\n if (previewEnabled) {\n const result = {\n id: \"\",\n handle: \"isPreview\",\n testVariant: {\n id: \"\",\n handle: \"isPreview\",\n },\n };\n debug(\n \"[Pack Test] Using preview mode test session:\",\n JSON.stringify(result),\n );\n return result;\n }\n\n if (!testSession) {\n debug(\"[Pack Test] No test session available\");\n return undefined;\n }\n\n // Read simplified test data from the dedicated test session\n const testSessionData: Test | undefined = testSession.getTestData();\n debug(\n \"[Pack Test] Retrieved test session data:\",\n JSON.stringify({\n hasData: !!testSessionData,\n testId: testSessionData?.id,\n testHandle: testSessionData?.handle,\n variantId: testSessionData?.testVariant?.id,\n variantHandle: testSessionData?.testVariant?.handle,\n }),\n );\n\n return testSessionData || null;\n}\n\n/**\n * React Router requests a route's data for the same document at `<path>.data`\n * (`/_root.data` for the root), and adds its own `_routes` / `index` params.\n *\n * Targeting has to be evaluated against the document the visitor is on, not the\n * transport URL. Otherwise a revalidation — which `PackTestRoute` triggers right\n * after an exposure fires — evaluates a rule like `path equals /` against\n * `/_root.data`, matches nothing, and serves control content over the variant\n * the visitor was just shown.\n */\nconst ROUTER_INTERNAL_PARAMS = [\"_routes\", \"index\"];\n\nfunction documentPathname(pathname: string): string {\n if (pathname === \"/_root.data\") return \"/\";\n if (!pathname.endsWith(\".data\")) return pathname;\n\n return pathname.slice(0, -\".data\".length) || \"/\";\n}\n\nexport function getTestTargetingAttributesFromRequest(\n request: Request,\n): TestTargetAudienceAttributes {\n let testTargetingAttributes: TestTargetAudienceAttributes = {};\n\n const requestUrl = new URL(request.url);\n for (const param of ROUTER_INTERNAL_PARAMS) {\n requestUrl.searchParams.delete(param);\n }\n\n const pathname = documentPathname(requestUrl.pathname);\n const searchParams = requestUrl.searchParams;\n\n testTargetingAttributes.url = requestUrl.origin + pathname;\n testTargetingAttributes.query = requestUrl.search;\n testTargetingAttributes.path = pathname;\n searchParams.has(\"utm_campaign\") &&\n (testTargetingAttributes.utmCampaign =\n searchParams.get(\"utm_campaign\") || undefined);\n searchParams.has(\"utm_content\") &&\n (testTargetingAttributes.utmContent =\n searchParams.get(\"utm_content\") || undefined);\n searchParams.has(\"utm_medium\") &&\n (testTargetingAttributes.utmMedium =\n searchParams.get(\"utm_medium\") || undefined);\n searchParams.has(\"utm_source\") &&\n (testTargetingAttributes.utmSource =\n searchParams.get(\"utm_source\") || undefined);\n searchParams.has(\"utm_term\") &&\n (testTargetingAttributes.utmTerm =\n searchParams.get(\"utm_term\") || undefined);\n\n return testTargetingAttributes;\n}\n\nexport function getTestFromQueryParams(request: Request): TestInput | null {\n const requestUrl = new URL(request.url);\n const params = requestUrl.searchParams;\n\n if (\n params.has(\"testId\") ||\n params.has(\"test_id\") ||\n params.has(\"test-id\") ||\n params.has(\"testHandle\") ||\n params.has(\"test_handle\") ||\n params.has(\"test-handle\") ||\n params.has(\"testVariantId\") ||\n params.has(\"test_variant_id\") ||\n params.has(\"test-variant-id\") ||\n params.has(\"testVariantHandle\") ||\n params.has(\"test_variant_handle\") ||\n params.has(\"test-variant-handle\")\n ) {\n return {\n testId:\n params.get(\"testId\") ||\n params.get(\"test_id\") ||\n params.get(\"test-id\") ||\n \"\",\n testHandle:\n params.get(\"testHandle\") ||\n params.get(\"test_handle\") ||\n params.get(\"test-handle\") ||\n \"\",\n testVariantId:\n params.get(\"testVariantId\") ||\n params.get(\"test_variant_id\") ||\n params.get(\"test-variant-id\") ||\n \"\",\n testVariantHandle:\n params.get(\"testVariantHandle\") ||\n params.get(\"test_variant_handle\") ||\n params.get(\"test-variant-handle\") ||\n \"\",\n };\n }\n\n return null;\n}\n\nexport function setTestHeaders(\n headers: any,\n options: {\n testInfoForRequest?: TestInfo;\n testFromQueryParams?: TestInput;\n },\n) {\n const { testFromQueryParams, testInfoForRequest } = options;\n\n if (testFromQueryParams) {\n headers[\"X-Pack-Test-Ignore-Test-Status\"] = true;\n\n if (testFromQueryParams.testId) {\n headers[\"X-Pack-Test-Id\"] = testFromQueryParams.testId;\n }\n\n if (testFromQueryParams.testHandle) {\n headers[\"X-Pack-Test-Handle\"] = testFromQueryParams.testHandle;\n }\n\n if (testFromQueryParams.testVariantId) {\n headers[\"X-Pack-Test-Variant-Id\"] = testFromQueryParams.testVariantId;\n }\n\n if (testFromQueryParams.testVariantHandle) {\n headers[\"X-Pack-Test-Variant-Handle\"] =\n testFromQueryParams.testVariantHandle;\n }\n } else if (testInfoForRequest) {\n headers[\"X-Pack-Test-Id\"] = testInfoForRequest?.id;\n headers[\"X-Pack-Test-Variant-Id\"] = testInfoForRequest?.testVariant?.id;\n }\n\n return headers;\n}\n","import { Test, TestTargetAudienceAttributes } from \"./test\";\nimport createDebug from \"debug\";\nimport { getImpressionSectionIdsForVariant } from \"./impression\";\nimport {\n AudienceRulesTree,\n decideWithoutCustomerContext,\n IdentityBundle,\n resolveRulesTree,\n rulesRequireCustomerContext,\n unmetRequirements,\n} from \"../audiences\";\nimport {\n QUERY_CLASSES,\n queryClassesForSurface,\n type QueryClass,\n} from \"./query-surfaces\";\nimport { hash32, variantSpot } from \"./seeded-bucket\";\nimport { matchesTargeting } from \"./rule-evaluator\";\n\nconst debug = createDebug(\"pack:ab-testing:local-resolver\");\n\nexport interface TestWithRules {\n id: string;\n handle: string;\n /**\n * `ab_test` or `personalization`. A personalization outranks a test for a\n * contested query class, so an absent value must read as `ab_test` — the\n * lower-precedence side — rather than granting precedence by omission.\n */\n experimentType?: string;\n impressionTrigger?: string;\n rules: Array<{\n attribute: string;\n operator: string;\n value: string;\n }>;\n // Attached audience (XOR with inline rules). The pinned snapshot the SSR\n // resolver evaluates; absent for inline-targeted or untargeted tests.\n experimentAudience?: {\n pinnedVersion?: number | null;\n pinnedRules?: AudienceRulesTree | null;\n } | null;\n testVariants: Array<{\n id: string;\n handle: string;\n trafficPercentage: number;\n /**\n * Content surfaces this variant overrides (`siteSettings`, `page`,\n * `section`, ...). Non-null in the schema; optional here only so a\n * malformed payload degrades safely — see `getContendedQueryClasses`.\n */\n overriddenSurfaces?: string[] | null;\n sectionTestVariants?: Array<{\n section?: {\n id?: string | null;\n } | null;\n }> | null;\n }>;\n}\n\n/**\n * The query classes a test could influence, unioned across its variants.\n *\n * Unioned rather than per-variant because contention belongs to the test:\n * whichever arm a visitor lands in, the test occupies those queries for them.\n *\n * An empty set means the test changes no CMS content — a code-driven test that\n * the theme branches on — so it contends with nothing.\n *\n * A variant with no `overriddenSurfaces` at all is treated as reaching every\n * class, so an unreadable footprint costs concurrency rather than correctness.\n * This is a guard against a malformed payload, not version tolerance: the field\n * is non-null in the schema, and a CMS that lacks it rejects the rules query\n * outright rather than omitting the field, so the SDK cannot talk to one. See\n * the release note on `fetchTestRulesShared`.\n */\nexport function getContendedQueryClasses(test: TestWithRules): Set<QueryClass> {\n const classes = new Set<QueryClass>();\n\n for (const variant of test.testVariants ?? []) {\n if (variant.overriddenSurfaces == null) {\n for (const queryClass of QUERY_CLASSES) classes.add(queryClass);\n continue;\n }\n\n for (const surface of variant.overriddenSurfaces) {\n for (const queryClass of queryClassesForSurface(surface)) {\n classes.add(queryClass);\n }\n }\n }\n\n return classes;\n}\n\n/**\n * A personalization is a targeted experience for a known audience, not one arm\n * of a split, so it takes a contested surface ahead of an A/B test. Contention\n * exists to stop two tests corrupting each other's measurement; a\n * personalization is not measuring a split and is not competing for one.\n */\nexport function isPersonalization(test: { experimentType?: string }): boolean {\n return test.experimentType === \"personalization\";\n}\n\nfunction contendsWithClaimed(\n classes: ReadonlySet<QueryClass>,\n claimed: ReadonlySet<QueryClass>,\n): boolean {\n for (const queryClass of classes) {\n if (claimed.has(queryClass)) return true;\n }\n\n return false;\n}\n\n/**\n * Claim order for one visitor, stable across their requests.\n *\n * Namespaced under `claim:` so this and the variant draw stay independent by\n * construction. They already are — `variantSpot` reduces modulo 100, which\n * discards the magnitude this sorts on — but the namespace keeps that true if\n * the reduction ever changes to one that preserves ordering.\n */\nfunction claimOrder<T extends { id: string }>(items: T[], seed: string): T[] {\n return [...items].sort((a, b) => {\n const difference = hash32(seed, `claim:${a.id}`) - hash32(seed, `claim:${b.id}`);\n return difference !== 0 ? difference : a.id.localeCompare(b.id);\n });\n}\n\n/**\n * Local test resolver that evaluates test rules without external API calls\n * Rules are stored in memory for the request duration only - caching is handled by fetchTestRulesShared\n */\nexport class LocalTestResolver {\n private testRules: TestWithRules[] = [];\n\n constructor() {\n // No caching logic - rules are managed by fetchTestRulesShared with proper cache invalidation\n }\n\n /**\n * Set test rules (from the shared cache)\n */\n setTestRules(rules: TestWithRules[]) {\n this.testRules = rules;\n }\n\n /**\n * A resolver bound to the rules as they stand now.\n *\n * `setTestRules` replaces the array rather than mutating it, so the reference\n * is already a stable snapshot. `getTestInfo` takes one at the top of its pass\n * and threads it: this is a module-level singleton, and a concurrent request\n * can swap the rules under any `await`. The singleton keeps holding them\n * between requests, which is what `loadTestRules` falls back on.\n */\n snapshot(): LocalTestResolver {\n const bound = new LocalTestResolver();\n bound.setTestRules(this.testRules);\n return bound;\n }\n\n /** The rules this resolver holds. Readonly: `setTestRules` is the only writer. */\n getTestRules(): readonly TestWithRules[] {\n return this.testRules;\n }\n\n /**\n * Check if rules are loaded\n */\n hasRules(): boolean {\n return this.testRules.length > 0;\n }\n\n /**\n * Check if a specific test is still active in the current rules\n */\n isTestActive(testId: string): boolean {\n return this.testRules.some((test) => test.id === testId);\n }\n\n /**\n * Whether this request needs the theme's customer context: some test whose\n * inline rules match has an audience that the customer could decide.\n *\n * Asked before calling `getCustomerContext`, which sits on the SSR critical\n * path. An audience that other conditions already settle (\"US AND signed in\"\n * for a visitor outside the US) does not count. Personalizations have no\n * inline rules, so the audience check is what saves the call for them.\n */\n async needsCustomerContext(\n attributes: TestTargetAudienceAttributes,\n identity: IdentityBundle,\n ): Promise<boolean> {\n for (const test of this.testRules) {\n const pinnedRules = test.experimentAudience?.pinnedRules;\n if (!pinnedRules || !rulesRequireCustomerContext(pinnedRules)) continue;\n if (!matchesTargeting(test.rules, attributes)) continue;\n\n try {\n if (\n (await decideWithoutCustomerContext(pinnedRules, identity)) ===\n \"depends\"\n ) {\n return true;\n }\n } catch {\n // Undecidable without the customer: ask rather than guess.\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get fresh test data by ID from current rules\n */\n getTestById(testId: string): TestWithRules | null {\n return this.testRules.find((test) => test.id === testId) || null;\n }\n\n /**\n * Assign every test the visitor is eligible for on this request.\n *\n * Previously a visitor was assigned to at most one test: this picked a single\n * eligible test at random and rolled a variant for that one, so eligibility\n * for one test consumed their chance at every other. Independent bucketing is\n * the industry default (Optimizely, VWO, GrowthBook, Statsig), with mutual\n * exclusion opt-in rather than the baseline.\n *\n * Tests in `alreadyAssigned` are skipped, so a sticky assignment held on the\n * session is never re-rolled.\n */\n async assignTests(\n seed: string,\n attributes: TestTargetAudienceAttributes,\n identity?: IdentityBundle,\n alreadyAssigned: ReadonlySet<string> = new Set<string>(),\n ): Promise<Test[]> {\n const eligibleTests = await this.getEligibleTests(attributes, identity);\n return this.assignVariants(seed, eligibleTests, alreadyAssigned);\n }\n\n /**\n * Every test whose targeting matches this request — inline rules plus audience\n * gating.\n *\n * Split out from assignment because eligibility answers two questions per\n * request: which tests to assign, and which of the visitor's existing\n * assignments actually apply here. Evaluating once and passing the result to\n * `assignVariants` keeps the rules engine from running twice.\n */\n async getEligibleTests(\n attributes: TestTargetAudienceAttributes,\n identity?: IdentityBundle,\n ): Promise<TestWithRules[]> {\n debug(\n \"[Pack Test LocalResolver] Evaluating eligibility:\",\n JSON.stringify({ totalRules: this.testRules.length, attributes }),\n );\n\n if (!this.testRules.length) {\n debug(\"[Pack Test LocalResolver] No test rules available\");\n return [];\n }\n\n const eligibleTests = await this.evaluateRules(\n this.testRules,\n attributes,\n identity,\n );\n\n debug(\n \"[Pack Test LocalResolver] Rule evaluation result:\",\n JSON.stringify({\n totalTests: this.testRules.length,\n eligibleTests: eligibleTests.length,\n eligibleTestIds: eligibleTests.map((t) => ({\n id: t.id,\n handle: t.handle,\n })),\n }),\n );\n\n return eligibleTests;\n }\n\n /**\n * Derive a variant for each eligible test not already assigned. Pure — callers\n * pass in eligibility so it is never recomputed, and `seed` rather than\n * instance state because the resolver is a module-level singleton shared by\n * every concurrent request.\n */\n assignVariants(\n seed: string,\n eligibleTests: TestWithRules[],\n alreadyAssigned: ReadonlySet<string> = new Set<string>(),\n ): Test[] {\n const candidates = eligibleTests.filter(\n (test) => !alreadyAssigned.has(test.id),\n );\n\n if (!candidates.length) {\n debug(\"[Pack Test LocalResolver] No tests need a new assignment\");\n return [];\n }\n\n // Query classes the visitor's sticky assignments occupy *on this request*.\n // Only an assignment whose targeting applies here can collide here: one\n // scoped to `/about` holds nothing on `/contact`, and treating it as a\n // holder there denies the class to the only test that could serve it while\n // the holder cannot. `eligibleTests` is already the request-matching set,\n // so intersecting with it is the whole filter.\n //\n // Note `candidates` above still uses the unfiltered `alreadyAssigned` — a\n // held test must never re-enter assignment, or a returning visitor gets\n // re-rolled into a different variant.\n const matchesRequest = new Set(eligibleTests.map((test) => test.id));\n\n const claimed = new Set<QueryClass>();\n for (const id of alreadyAssigned) {\n if (!matchesRequest.has(id)) continue;\n\n const assignedTest = this.getTestById(id);\n if (!assignedTest) continue;\n for (const queryClass of getContendedQueryClasses(assignedTest)) {\n claimed.add(queryClass);\n }\n }\n\n const assigned = new Map<string, Test>();\n\n // Personalizations first, so they claim before any test is considered. A\n // test that then wants the same class is refused as it always was; the\n // precedence is applied here rather than by starving it later.\n const claimOrdered = this.orderForClaiming(candidates, claimed, seed);\n const byPrecedence = [\n ...claimOrdered.filter(isPersonalization),\n ...claimOrdered.filter((test) => !isPersonalization(test)),\n ];\n\n for (const test of byPrecedence) {\n const classes = getContendedQueryClasses(test);\n\n // A personalization is never refused for contention — not even against a\n // class an existing assignment already holds. The held test keeps its\n // assignment and stops supplying content, which `mapByQueryClass` decides.\n if (!isPersonalization(test) && contendsWithClaimed(classes, claimed)) {\n debug(\n \"[Pack Test LocalResolver] Skipping a test that contends for a claimed surface:\",\n JSON.stringify({ testId: test.id, queryClasses: [...classes] }),\n );\n continue;\n }\n\n // Keyed per test, deliberately. Deriving from the seed alone would\n // correlate variant selection — a visitor would land in the same arm of\n // every concurrent test, which is not independent bucketing.\n const result = this.assignVariant(test, seed);\n if (!result) continue;\n\n for (const queryClass of classes) claimed.add(queryClass);\n assigned.set(test.id, result);\n }\n\n // Emit in the caller's order, not the claim order, so the contention\n // tie-break cannot leak into the shape of the result.\n const ordered = candidates\n .filter((test) => assigned.has(test.id))\n .map((test) => assigned.get(test.id) as Test);\n\n debug(\n \"[Pack Test LocalResolver] Assignment complete:\",\n JSON.stringify({\n assignedCount: ordered.length,\n claimedQueryClasses: [...claimed],\n assigned: ordered.map((t) => ({\n testId: t.id,\n variantId: t.testVariant.id,\n })),\n }),\n );\n\n return ordered;\n }\n\n /**\n * Claim order only matters when two candidates want the same surface. In that\n * case order by the visitor's claim hash, so contending tests split traffic\n * across the population while any one visitor gets the same winner on every\n * request. Without contention the order is irrelevant, so leave it alone.\n */\n private orderForClaiming(\n candidates: TestWithRules[],\n claimed: ReadonlySet<QueryClass>,\n seed: string,\n ): TestWithRules[] {\n const projected = new Set(claimed);\n\n for (const test of candidates) {\n const classes = getContendedQueryClasses(test);\n if (contendsWithClaimed(classes, projected)) {\n return claimOrder(candidates, seed);\n }\n for (const queryClass of classes) projected.add(queryClass);\n }\n\n return candidates;\n }\n\n /**\n * Derive this test's variant by traffic percentage. Returns null when the\n * variants' percentages do not cover the draw, which leaves the visitor\n * unassigned for this test only.\n */\n private assignVariant(test: TestWithRules, seed: string): Test | null {\n const variantPercentage = variantSpot(seed, test.id);\n let accumulatedPercentage = 0;\n\n debug(\n \"[Pack Test LocalResolver] Starting variant assignment:\",\n JSON.stringify({\n testId: test.id,\n testHandle: test.handle,\n variantPercentage,\n variants: test.testVariants.map((v) => ({\n id: v.id,\n handle: v.handle,\n trafficPercentage: v.trafficPercentage,\n })),\n }),\n );\n\n for (const variant of test.testVariants) {\n accumulatedPercentage += variant.trafficPercentage * 100;\n\n debug(\n \"[Pack Test LocalResolver] Checking variant:\",\n JSON.stringify({\n variantId: variant.id,\n variantHandle: variant.handle,\n trafficPercentage: variant.trafficPercentage,\n accumulatedPercentage,\n variantPercentage,\n isSelected: accumulatedPercentage >= variantPercentage,\n }),\n );\n\n if (accumulatedPercentage >= variantPercentage) {\n const impressionSectionIds = getImpressionSectionIdsForVariant(\n test,\n variant,\n );\n const result = {\n id: test.id,\n handle: test.handle,\n impressionTrigger: test.impressionTrigger,\n testVariant: {\n id: variant.id,\n handle: variant.handle,\n },\n impression:\n impressionSectionIds.length > 0\n ? { sectionIds: impressionSectionIds }\n : undefined,\n };\n debug(\n \"[Pack Test LocalResolver] Variant selected:\",\n JSON.stringify(result),\n );\n return result;\n }\n }\n\n debug(\n \"[Pack Test LocalResolver] No variant selected — traffic percentages do not cover the roll:\",\n JSON.stringify({ testId: test.id, variantPercentage }),\n );\n return null;\n }\n\n /**\n * Inline targeting, then audience gating.\n *\n * Synchronous per test and identical wherever it runs. It used to short-circuit\n * with `if (typeof window !== \"undefined\") return tests`, handing a browser\n * every test with no rule evaluated at all — so inline targeting had never run\n * outside a server context. PLT-3844 needs assignment to reach the same answer\n * in a loader and on the client, and that guard was the reason it could not.\n */\n private async evaluateRules(\n tests: TestWithRules[],\n attributes: TestTargetAudienceAttributes,\n identity?: IdentityBundle,\n ): Promise<TestWithRules[]> {\n debug(\n \"[Pack Test LocalResolver] Starting rule evaluation:\",\n JSON.stringify({ totalTests: tests.length, attributes }),\n );\n\n const eligibleTests = tests.filter((test) => {\n const eligible = matchesTargeting(test.rules, attributes);\n\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} targeting:`,\n JSON.stringify({\n testId: test.id,\n rulesCount: Array.isArray(test.rules) ? test.rules.length : null,\n rules: test.rules,\n eligible,\n }),\n );\n\n return eligible;\n });\n\n debug(\n \"[Pack Test LocalResolver] Inline-eligible tests:\",\n JSON.stringify({\n eligibleCount: eligibleTests.length,\n eligibleTests: eligibleTests.map((t) => ({\n id: t.id,\n handle: t.handle,\n })),\n }),\n );\n\n return this.applyAudienceGating(eligibleTests, identity);\n }\n\n /**\n * Audience gating (XOR with inline rules): a test attached to an audience is\n * only eligible when the visitor matches the pinned audience snapshot. Tests\n * without an audience pass through unchanged. Fails closed (excludes the test)\n * when the audience can't be evaluated — no identity, or an evaluator error —\n * so audience-targeted tests never leak to unintended traffic.\n */\n private async applyAudienceGating(\n eligibleTests: TestWithRules[],\n identity?: IdentityBundle,\n ): Promise<TestWithRules[]> {\n const hasAudience = eligibleTests.some(\n (test) => test.experimentAudience?.pinnedRules,\n );\n if (!hasAudience) return eligibleTests;\n\n const gated = await Promise.all(\n eligibleTests.map(async (test) => {\n const pinnedRules = test.experimentAudience?.pinnedRules;\n if (!pinnedRules) return test; // inline-targeted or untargeted\n\n if (!identity) {\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} has an audience but no identity — excluding`,\n );\n return null;\n }\n\n // Don't evaluate a missing signal as false: auth_status \"anonymous\"\n // MATCHES when no customer is known, so that would serve guest content\n // to everyone. Only an answer the customer cannot change is used;\n // anything that depends on it is refused.\n const unmet = unmetRequirements(pinnedRules, identity);\n if (unmet.length) {\n const decision = await decideWithoutCustomerContext(\n pinnedRules,\n identity,\n );\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} lacks signals it names:`,\n JSON.stringify({ testId: test.id, unmet, decision }),\n );\n return decision === \"match\" ? test : null;\n }\n\n try {\n const { matches } = await resolveRulesTree(pinnedRules, identity);\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} audience match:`,\n JSON.stringify({ matches }),\n );\n return matches ? test : null;\n } catch (err) {\n debug(\n `[Pack Test LocalResolver] Test ${test.handle} audience eval error — excluding:`,\n String(err),\n );\n return null;\n }\n }),\n );\n\n return gated.filter((test): test is TestWithRules => test !== null);\n }\n\n /**\n * Resolve test and variant IDs from their handles\n */\n resolveTestIdsFromHandles(\n testHandle: string,\n variantHandle: string,\n ): {\n testId?: string;\n variantId?: string;\n } | null {\n const test = this.testRules.find((t) => t.handle === testHandle);\n if (!test) {\n return null;\n }\n\n const variant = test.testVariants?.find((v) => v.handle === variantHandle);\n if (!variant) {\n return null;\n }\n\n return {\n testId: test.id,\n variantId: variant.id,\n };\n }\n}\n","type SectionTestVariant = {\n section?: {\n id?: string | null;\n } | null;\n};\n\nexport type TestVariantWithImpression = {\n handle: string;\n sectionTestVariants?: SectionTestVariant[] | null;\n};\n\nexport type TestWithImpressionVariants = {\n testVariants?: TestVariantWithImpression[] | null;\n};\n\nexport function getVariantImpressionSectionIds(\n testVariant?: TestVariantWithImpression | null,\n): string[] {\n const sectionIds =\n testVariant?.sectionTestVariants\n ?.map((variant) => variant?.section?.id)\n .filter((id): id is string => Boolean(id)) || [];\n\n return [...new Set(sectionIds)];\n}\n\nexport function getImpressionSectionIdsForVariant(\n test?: TestWithImpressionVariants | null,\n testVariant?: TestVariantWithImpression | null,\n): string[] {\n const selectedVariantSectionIds = getVariantImpressionSectionIds(testVariant);\n\n if (selectedVariantSectionIds.length > 0) {\n return selectedVariantSectionIds;\n }\n\n if (testVariant?.handle !== \"control\") {\n return [];\n }\n\n const fallbackSectionIds =\n test?.testVariants\n ?.filter((variant) => variant.handle !== \"control\")\n .flatMap((variant) => getVariantImpressionSectionIds(variant)) || [];\n\n return [...new Set(fallbackSectionIds)];\n}\n","import * as cookie from \"cookie\";\nimport { PACK_USER_CONSENT_COOKIE_ID } from \"../constants\";\nimport { parseConsentCookie } from \"../session/consent\";\n\n/**\n * The identity signals audience conditions evaluate against. Built once per SSR\n * request and passed to the resolver; every condition reads from this bundle\n * rather than re-parsing the request.\n *\n * Every field is optional, and absence is not \"no\": a condition needing a\n * signal that is missing is REFUSED by `unmetRequirements`, not evaluated\n * against a default. Several conditions' documented fallback for a missing\n * signal is to match — `auth_status: \"anonymous\"` matches precisely when no\n * customer is known — so evaluating without one would serve to everybody.\n *\n * This used to describe two population levels, request-only for A/B in\n * handleRequest and request-plus-customer for Personalization in the root\n * loader. That split was never implemented: `handleRequest` performs no\n * assignment, and both experiment types resolve in `getTestInfo` on the first\n * CMS query of a request. The customer signal is therefore not a property of\n * WHERE evaluation happens; it is supplied to it by the theme through\n * `getCustomerContext`.\n */\nexport interface IdentityBundle {\n // Supplied by the theme via `getCustomerContext`; costs a Customer Account\n // API query, so most themes answer `isLoggedIn` alone.\n shopifyCustomerId?: string;\n\n /**\n * Tri-state: `undefined` means the theme did not tell us, and\n * `unmetRequirements` refuses on it. Defaulting to `false` would make\n * `auth_status: \"anonymous\"` match signed-in visitors too.\n *\n * Separate from `shopifyCustomerId`, which costs a Customer Account API query;\n * `auth_status` only needs the boolean.\n */\n isLoggedIn?: boolean;\n\n // Provider identifiers. Only `ga4ClientId` is populated today (the `_ga`\n // format is stable + verified). The rest are declared to keep the bundle\n // shape stable, but are populated by the condition tasks that own each\n // provider once their real cookie/storage formats are verified (several\n // encode base64/JSON, or live in localStorage and aren't readable at SSR).\n // Until then, conditions should read the raw `cookies` jar.\n ga4ClientId?: string; // _ga cookie (GA1.1.<id>.<ts>)\n amplitudeDeviceId?: string;\n amplitudeUserId?: string;\n klaviyoProfileId?: string;\n segmentAnonymousId?: string;\n\n // Raw cookie jar — the reliable source for cookie conditions.\n cookies: Record<string, string>;\n\n // Analytics consent after the unknown-consent policy, as resolved for the\n // Pack session. Consent-sensitive conditions fail closed without it.\n hasConsent: boolean;\n\n userAgent?: string;\n deviceType: \"mobile\" | \"tablet\" | \"desktop\";\n geo: { country?: string; region?: string };\n url: { path: string; query: Record<string, string>; host?: string };\n referrer?: string;\n}\n\nexport interface BuildIdentityBundleOptions {\n /** Shopify customer id, when the theme supplied one. */\n shopifyCustomerId?: string;\n /**\n * Analytics consent as resolved for the Pack session (`getConsent`, the\n * cookie, and the unknown-consent policy). Without it, only the cookie is\n * read and an unanswered visitor counts as consented.\n */\n hasConsent?: boolean;\n}\n\nfunction detectDeviceType(userAgent: string): IdentityBundle[\"deviceType\"] {\n const ua = userAgent.toLowerCase();\n if (/ipad|tablet|(android(?!.*mobile))/.test(ua)) return \"tablet\";\n if (/mobi|iphone|android|ipod|phone/.test(ua)) return \"mobile\";\n return \"desktop\";\n}\n\n// GA4 client id is the last two dot-segments of the `_ga` cookie\n// (e.g. \"GA1.1.1234567890.1600000000\" -> \"1234567890.1600000000\").\nfunction extractGa4ClientId(\n cookies: Record<string, string>,\n): string | undefined {\n const ga = cookies[\"_ga\"];\n if (!ga) return undefined;\n const parts = ga.split(\".\");\n return parts.length >= 4 ? parts.slice(-2).join(\".\") : undefined;\n}\n\nfunction firstHeader(request: Request, ...names: string[]): string | undefined {\n for (const name of names) {\n const value = request.headers.get(name);\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * Builds an IdentityBundle from an SSR request (headers + cookies) and, when\n * available, the resolved Shopify customer. Pure and synchronous — safe to call\n * once per request and memoize.\n */\nexport function buildIdentityBundle(\n request: Request,\n options: BuildIdentityBundleOptions = {},\n): IdentityBundle {\n const parsedCookies = cookie.parse(request.headers.get(\"cookie\") || \"\");\n const cookies: Record<string, string> = {};\n for (const [name, value] of Object.entries(parsedCookies)) {\n if (typeof value === \"string\") cookies[name] = value;\n }\n\n const userAgent = request.headers.get(\"user-agent\") || undefined;\n\n const hasConsent =\n options.hasConsent ??\n parseConsentCookie(cookies[PACK_USER_CONSENT_COOKIE_ID]).analytics !==\n \"denied\";\n\n const requestUrl = new URL(request.url);\n const query: Record<string, string> = {};\n requestUrl.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return {\n shopifyCustomerId: options.shopifyCustomerId,\n // Only GA4 is populated today; other provider ids are filled in by the\n // condition tasks that own them (see the type declaration).\n ga4ClientId: extractGa4ClientId(cookies),\n cookies,\n hasConsent,\n userAgent,\n deviceType: userAgent ? detectDeviceType(userAgent) : \"desktop\",\n // Host-provided geo-IP, first header present wins. Every name here is one\n // the host defines, and they must carry the same FORMAT across hosts:\n // country as ISO 3166-1 alpha-2, region as an ISO 3166-2 subdivision code.\n //\n // Defined is not the same as delivered. Only `oxygen-buyer-*` and\n // `cf-ipcountry` arrive unconditionally; `cf-region-code` needs\n // Cloudflare's \"Add visitor location headers\" managed transform, which is\n // off by default, so a Workers deployment behind plain Cloudflare has no\n // region and its region audiences match nobody. That is fine while\n // storefronts are on Oxygen (which sets it from request.cf) — revisit if a\n // storefront ever fronts an origin with Cloudflare directly.\n // Oxygen also exposes `oxygen-buyer-region`, but that is the full name\n // (\"California\") — mixing it in would make an audience configured as \"CA\"\n // match on Cloudflare/Vercel and never on Oxygen, since matchGeo compares\n // the whole string.\n geo: {\n country: firstHeader(\n request,\n \"oxygen-buyer-country\",\n \"cf-ipcountry\",\n \"x-vercel-ip-country\",\n ),\n region: firstHeader(\n request,\n \"oxygen-buyer-region-code\",\n \"cf-region-code\",\n \"x-vercel-ip-country-region\",\n ),\n },\n url: {\n path: requestUrl.pathname,\n query,\n // Public host — prefer the forwarded host over the received one so\n // self-referral detection works behind a proxy / preview domain, where\n // request.url carries the internal host (e.g. *.vercel.app) while the\n // browser typed the storefront domain. x-forwarded-host may be a comma\n // list and may carry a port.\n host: (\n firstHeader(request, \"x-forwarded-host\", \"host\") ?? requestUrl.hostname\n )\n .split(\",\")[0]\n .trim()\n .split(\":\")[0]\n .toLowerCase(),\n },\n referrer: request.headers.get(\"referer\") || undefined,\n };\n}\n","// Bounded regex matching for user-supplied cookie `matches_regex` patterns.\n// Mirrors backpack's server/app/services/audiences/safe-regex.ts — keep in sync.\n//\n// A true timeout on a synchronous regex isn't available at SSR without a worker,\n// so we bound the blast radius: cap the pattern and input lengths, and treat an\n// invalid pattern as \"no match\". Patterns are authored by admins (not end\n// users), so a catastrophic pattern would only affect the author's own tenant.\nexport const MAX_REGEX_PATTERN_LENGTH = 200;\nexport const MAX_REGEX_INPUT_LENGTH = 4096;\n\nexport function safeRegexMatch(\n pattern: string | undefined,\n input: string | undefined,\n): boolean {\n // Absent input (undefined) fails closed; a present-but-empty value (\"\") is a\n // valid regex target, so let it through — e.g. `^$` / `.*` can match it.\n if (!pattern || input === undefined) return false;\n if (\n pattern.length > MAX_REGEX_PATTERN_LENGTH ||\n input.length > MAX_REGEX_INPUT_LENGTH\n ) {\n return false;\n }\n\n try {\n return new RegExp(pattern).test(input);\n } catch {\n return false;\n }\n}\n","import { IdentityBundle } from \"../identity-bundle\";\nimport { safeRegexMatch } from \"../safe-regex\";\n\n// SSR evaluator for the \"cookie\" condition. Mirrors backpack's\n// server/app/services/audiences/conditions/cookie.ts — keep the operator\n// semantics in lockstep. Pure over the identity bundle's cookie jar (+ the\n// binary consent signal); no I/O.\n\n// Negation is expressed once, via the leaf-level `negate` toggle, so there are\n// no not_* operators here.\nexport const COOKIE_OPERATORS = [\n \"exists\",\n \"equals\",\n \"contains\",\n \"starts_with\",\n \"ends_with\",\n \"matches_regex\",\n] as const;\n\nexport type CookieOperator = (typeof COOKIE_OPERATORS)[number];\n\nexport interface CookieConfig {\n name?: string;\n op?: CookieOperator;\n value?: string;\n requireConsent?: boolean;\n}\n\nexport function evaluateCookie(\n config: CookieConfig | null | undefined,\n identity: IdentityBundle,\n): boolean {\n const name = config?.name;\n const op = config?.op;\n if (!name || !op) return false;\n\n // Consent gate: fail closed when consent is required but not granted.\n if (config?.requireConsent && !identity.hasConsent) return false;\n\n const value = identity.cookies?.[name]; // string | undefined\n const target = config?.value ?? \"\";\n\n switch (op) {\n case \"exists\":\n return value !== undefined && value !== \"\";\n case \"equals\":\n return value === target;\n case \"contains\":\n return value !== undefined && value.includes(target);\n case \"starts_with\":\n return value !== undefined && value.startsWith(target);\n case \"ends_with\":\n return value !== undefined && value.endsWith(target);\n case \"matches_regex\":\n return safeRegexMatch(target, value);\n default:\n return false;\n }\n}\n","import { PACK_SESSION_COOKIE_ID } from \"../../constants\";\nimport { PRIOR_VISIT_COOKIES } from \"../visitor-recency\";\nimport { IdentityBundle } from \"../identity-bundle\";\n\n// SDK-side evaluators for the `builtin` condition type, dispatched by\n// `config.key`. MIRRORS backpack's built-in definitions\n// (server/app/services/audiences/builtins/) — evaluation only; the admin\n// metadata + save-time validation live server-side. Keep the two in lockstep.\n// Missing signals resolve to the documented fallback; never throw.\n\ninterface BuiltinConfig {\n key?: string;\n value?: string;\n op?: string;\n param?: string;\n}\n\ntype BuiltinEvaluator = (\n config: BuiltinConfig,\n identity: IdentityBundle,\n) => boolean;\n\n// referrer_source implements GA4's Default Channel Group, collapsed to six\n// buckets. Medium rules are VERBATIM from GA4's published channel definitions\n// (https://support.google.com/analytics/answer/9756891); the SOURCE lists are a\n// curated subset of Google's source categories. Keep in lockstep with backpack's\n// built-in definitions.\nconst PAID_MEDIUM = /^(.*cp.*|ppc|retargeting|paid.*)$/;\nconst DISPLAY_MEDIUM = [\"display\", \"banner\", \"expandable\", \"interstitial\", \"cpm\"];\nconst SOCIAL_MEDIUM = [\"social\", \"social-network\", \"social-media\", \"sm\", \"social network\", \"social media\"];\nconst ORGANIC_VIDEO_MEDIUM = /^.*video.*$/;\nconst EMAIL_MEDIUM = /^(email|e-mail|e_mail|e mail)$/;\nconst REFERRAL_MEDIUM = [\"referral\", \"app\", \"link\"];\nconst SEARCH_SOURCES = [\n \"google\", \"bing\", \"yahoo\", \"duckduckgo\", \"baidu\", \"yandex\", \"ecosia\", \"ask.\",\n \"aol.\", \"naver\", \"daum\", \"brave\", \"startpage\", \"qwant\", \"sogou\", \"seznam\",\n];\nconst SOCIAL_SOURCES = [\n \"facebook\", \"fb.\", \"instagram\", \"tiktok\", \"pinterest\", \"pin.it\", \"linkedin\",\n \"lnkd.in\", \"reddit\", \"snapchat\", \"twitter\", \"x.com\", \"t.co\", \"tumblr\",\n \"threads\", \"whatsapp\", \"wechat\", \"weibo\", \"vk.\", \"quora\",\n];\n\nfunction hostFromReferrer(referrer: string | undefined): string {\n if (!referrer) return \"\";\n try {\n return new URL(referrer).hostname.toLowerCase();\n } catch {\n return \"\";\n }\n}\n\n// in_list / not_in_list values are a comma-delimited string — the shape the\n// audience builder's text field emits and backpack's evaluator/validator assume.\n// If this ever becomes a JSON array, update the UI field and both evaluators in\n// lockstep: a shape mismatch here degrades not_in_list to matching nobody\n// (the resolver swallows the thrown .split), silently.\nconst parseList = (value: string | undefined): string[] =>\n (value ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n// Geo match; a missing signal fails closed for every operator. An empty parsed\n// list also fails closed for not_in_list — otherwise a value that trims to\n// nothing (e.g. \",\" or \" \") would match EVERY geo-known visitor\n// (!list.includes ⇒ true), turning an \"exclude these\" audience into \"match\n// everyone\". The backend blocks such a value on save; this is the SDK's own\n// guard for any config that predates that validation. Mirrors backpack.\nfunction matchGeo(\n code: string | undefined,\n op: string | undefined,\n value: string | undefined,\n): boolean {\n if (!code) return false;\n const c = code.toUpperCase();\n const list = parseList(value).map((s) => s.toUpperCase());\n switch (op) {\n case \"equals\":\n return c === (value ?? \"\").trim().toUpperCase();\n case \"in_list\":\n return list.includes(c);\n case \"not_in_list\":\n return list.length > 0 && !list.includes(c);\n default:\n return false;\n }\n}\n\nfunction classifyReferrerSource(\n query: Record<string, string> | undefined,\n referrer: string | undefined,\n currentHost: string | undefined,\n): string {\n const medium = (query?.[\"utm_medium\"] ?? \"\").toLowerCase();\n const source = (query?.[\"utm_source\"] ?? \"\").toLowerCase();\n const stripWww = (h: string) => h.replace(/^www\\./, \"\");\n let host = hostFromReferrer(referrer);\n // A same-site (self) referrer isn't an external referral. Browsers send a\n // full same-origin Referer by default, so without this a \"Direct traffic\"\n // audience stops matching after the first page and a \"Referral traffic\"\n // audience matches nearly all internal navigation. Treat as self when the\n // hosts are equal or one is a subdomain of the other (www↔apex,\n // shop.example.com↔example.com). Label-anchored so \"evil-example.com\" isn't a\n // subdomain of \"example.com\"; sibling subdomains would need an eTLD+1 list.\n if (host && currentHost) {\n const a = stripWww(host);\n const b = stripWww(currentHost.toLowerCase());\n if (a === b || a.endsWith(\".\" + b) || b.endsWith(\".\" + a)) host = \"\";\n }\n // Match a host against category keys on domain-label boundaries — a plain\n // substring test put e.g. \"target.com\" in social (contains \"t.co\") and\n // \"flask.io\" in organic (contains \"ask.\"). Keys are brand labels\n // (\"facebook\"), short domains (\"t.co\"), or brand prefixes (\"fb.\"). The same\n // anchoring applies to utm_source below (a raw substring put full domains like\n // \"target.com\" in social, and the dot-strip widened \"ask.\" into \"flask\").\n const bareHost = stripWww(host);\n // Category keys may carry a trailing \".\" (brand prefixes like \"fb.\") — strip\n // it consistently for both the host and utm_source paths.\n const bareKey = (k: string) => (k.endsWith(\".\") ? k.slice(0, -1) : k);\n const hostInList = (list: string[]) =>\n !!bareHost &&\n list.some((k) => {\n const key = bareKey(k);\n return key.includes(\".\")\n ? bareHost === key || bareHost.endsWith(\".\" + key)\n : bareHost.split(\".\").includes(key);\n });\n // utm_source, token-matched on the same boundaries as the host: split on\n // domain/word separators so a bare key (\"fb\") matches a whole token but not a\n // substring (\"target.com\" no longer hits \"t.co\", \"flask\" no longer \"ask\"),\n // and a dotted key (\"t.co\") matches as a domain.\n const sourceInList = (list: string[]) => {\n if (!source) return false;\n const tokens = source.split(/[.\\-_ ]/);\n return list.some((k) => {\n const key = bareKey(k);\n return key.includes(\".\")\n ? source === key || source.endsWith(\".\" + key)\n : tokens.includes(key);\n });\n };\n const inCategory = (list: string[]) =>\n sourceInList(list) || hostInList(list);\n\n if (PAID_MEDIUM.test(medium) || DISPLAY_MEDIUM.includes(medium)) return \"paid\";\n if (SOCIAL_MEDIUM.includes(medium) || inCategory(SOCIAL_SOURCES)) return \"social\";\n if (medium === \"organic\" || ORGANIC_VIDEO_MEDIUM.test(medium) || inCategory(SEARCH_SOURCES)) return \"organic\";\n if (EMAIL_MEDIUM.test(medium) || EMAIL_MEDIUM.test(source)) return \"email\";\n // An external referrer, or any present-but-unrecognized medium OR source (sms,\n // push, newsletter, a custom utm_source, … — campaign traffic our six buckets\n // can't place) → referral, not direct. Deviates from GA4's \"Unassigned\";\n // direct is reserved for NO medium, NO source, and no referrer.\n if (\n medium === \"affiliate\" ||\n REFERRAL_MEDIUM.includes(medium) ||\n host ||\n medium ||\n source\n )\n return \"referral\";\n return \"direct\";\n}\n\nconst BUILTINS: Record<string, BuiltinEvaluator> = {\n // Logged in vs. guest — Shopify customer session presence.\n auth_status: (config, identity) => {\n // isLoggedIn first — a theme can supply it without a Customer Account API\n // query. With neither signal \"anonymous\" matches everyone; unmetRequirements\n // refuses the tree upstream rather than defaulting here, since either default\n // is wrong in one direction.\n const loggedIn = identity.isLoggedIn ?? !!identity.shopifyCustomerId;\n if (config?.value === \"logged_in\") return loggedIn;\n if (config?.value === \"anonymous\") return !loggedIn;\n return false; // unrecognized value fails closed (backend blocks on save)\n },\n\n // Device type from the User-Agent; unknown falls back to desktop.\n device: (config, identity) =>\n (identity.deviceType ?? \"desktop\") === config?.value,\n\n // New vs. returning. The persistent prior-visit cookies say the visitor has\n // been here at some point, not whether THIS session is their first. The\n // rolling __pack_s marker carries that verdict (\"r\"/\"n\"), decided once at\n // session start in handle-request (see sessionVerdict in ../visitor-recency).\n // Mirror that writer's tri-state: \"r\"/\"n\" are authoritative; anything else (a\n // new session with no marker, or a tampered value) falls back to prior visits.\n // Missing signal → new.\n //\n // Consent note: this is the only built-in that reads cookies, and it does NOT\n // enforce a consent gate. _ga / _shopify_y only exist when analytics consent\n // was given, but Pack's own __pack / __pack_s are written on every response\n // regardless of consent (see handle-request), so a visitor who declined can\n // still be classified from them. Whether that is acceptable is a system-wide\n // consent-posture decision for the resolver/identity layer — flagged, not\n // enforced.\n visitor_recency: (config, identity) => {\n const cookies = identity.cookies ?? {};\n const priorVisit = PRIOR_VISIT_COOKIES.some((name) => !!cookies[name]);\n const session = cookies[PACK_SESSION_COOKIE_ID];\n const returning =\n session === \"r\" ? true : session === \"n\" ? false : priorVisit;\n if (config?.value === \"returning\") return returning;\n if (config?.value === \"new\") return !returning;\n return false; // unrecognized value fails closed (backend blocks on save)\n },\n\n // Country / region from the CDN geo signal; missing → no match.\n geo_country: (config, identity) =>\n matchGeo(identity.geo?.country, config?.op, config?.value),\n geo_region: (config, identity) =>\n matchGeo(identity.geo?.region, config?.op, config?.value),\n\n // Traffic source from utm_medium, then Referer host; else direct.\n referrer_source: (config, identity) =>\n classifyReferrerSource(\n identity.url?.query,\n identity.referrer,\n identity.url?.host,\n ) ===\n config?.value,\n\n // A specific UTM parameter on the current URL.\n utm_param: (config, identity) => {\n if (!config?.param) return false;\n // Tolerate a \"utm_\"-prefixed param, and compare case-insensitively — UTM\n // values are merchant/ad-platform authored and inconsistently cased\n // (utm_source=TikTok vs tiktok).\n const name = config.param.replace(/^utm_/, \"\");\n const v = identity.url?.query?.[`utm_${name}`]?.toLowerCase();\n switch (config?.op) {\n case \"exists\":\n return v !== undefined && v !== \"\";\n case \"equals\":\n // Guard the param exists — otherwise an equals with no configured value\n // matches every URL that LACKS the param (undefined === undefined).\n return v !== undefined && v === config?.value?.toLowerCase();\n case \"in_list\":\n return (\n v !== undefined &&\n parseList(config?.value)\n .map((s) => s.toLowerCase())\n .includes(v)\n );\n default:\n return false;\n }\n },\n};\n\nexport function evaluateBuiltin(\n config: BuiltinConfig | null | undefined,\n identity: IdentityBundle,\n): boolean {\n const evaluator = config?.key ? BUILTINS[config.key] : undefined;\n // Unknown key fails closed (the backend blocks it on save).\n return evaluator ? evaluator(config ?? {}, identity) : false;\n}\n","import { IdentityBundle } from \"./identity-bundle\";\nimport { evaluateCookie } from \"./conditions/cookie\";\nimport { evaluateBuiltin } from \"./conditions/builtin\";\n\n// SDK-side evaluator registry. Unlike backpack's registry (which also owns\n// metadata + config-schema validation for the builder), the SDK only needs to\n// evaluate: map a condition `type` to a function over the IdentityBundle.\n// Pure types (cookie/built-in) evaluate in-process.\nexport type ConditionEvaluator = (\n config: Record<string, any> | null | undefined,\n identity: IdentityBundle,\n) => boolean | Promise<boolean>;\n\nconst evaluators = new Map<string, ConditionEvaluator>();\n\nexport function registerConditionEvaluator(\n type: string,\n evaluate: ConditionEvaluator,\n): void {\n if (evaluators.has(type)) {\n throw new Error(`Condition evaluator \"${type}\" is already registered.`);\n }\n evaluators.set(type, evaluate);\n}\n\nexport function getConditionEvaluator(\n type: string,\n): ConditionEvaluator | undefined {\n return evaluators.get(type);\n}\n\nexport function isConditionRegistered(type: string): boolean {\n return evaluators.has(type);\n}\n\n// Cookie: stateless name/op/value match over the identity bundle's cookie jar.\nregisterConditionEvaluator(\"cookie\", evaluateCookie);\n\n// Built-in: curated signals (device, auth, recency, …) dispatched by key.\nregisterConditionEvaluator(\"builtin\", evaluateBuiltin);\n","import type { IdentityBundle } from \"./identity-bundle\";\n\n/**\n * A missing signal is not the same as a condition answering false, and must not\n * be evaluated as one: `auth_status: \"anonymous\"` MATCHES precisely when no\n * customer signal is present, so it would serve guest content to everyone.\n */\nexport type AudienceRequirement = \"customerContext\";\n\n// Mirrors requiresCustomerContext in backpack's builtins/definitions.ts, as a\n// set because the SDK's registry holds evaluators only. Keep in lockstep.\nconst CUSTOMER_CONTEXT_BUILTINS = new Set([\"auth_status\"]);\n\n// Mirrored in backpack (audiences/customer-context.ts) and the admin\n// (web/src/components/audiences/audience-rules.ts) — no shared module, so all\n// three must agree on the tree shape.\nexport function collectBuiltinKeys(node: unknown): string[] {\n return collectLeaves(node)\n .filter((leaf) => leaf.type === \"builtin\")\n .map((leaf) => leaf.config?.key)\n .filter((key): key is string => typeof key === \"string\" && !!key);\n}\n\ntype Leaf = { type?: unknown; config?: { key?: unknown } | null };\n\nfunction collectLeaves(node: unknown): Leaf[] {\n if (!node || typeof node !== \"object\") return [];\n\n const candidate = node as { op?: unknown; children?: unknown };\n\n if (candidate.op) {\n return Array.isArray(candidate.children)\n ? candidate.children.flatMap((child) => collectLeaves(child))\n : [];\n }\n\n return [node as Leaf];\n}\n\n/** Whether one rule leaf reads the Shopify customer (`auth_status`). */\nexport function isCustomerContextLeaf(leaf: unknown): boolean {\n const candidate = leaf as Leaf | null;\n return (\n candidate?.type === \"builtin\" &&\n typeof candidate.config?.key === \"string\" &&\n CUSTOMER_CONTEXT_BUILTINS.has(candidate.config.key)\n );\n}\n\n/** Whether evaluating this tree honestly needs a resolved Shopify customer. */\nexport function rulesRequireCustomerContext(rules: unknown): boolean {\n return collectBuiltinKeys(rules).some((key) =>\n CUSTOMER_CONTEXT_BUILTINS.has(key),\n );\n}\n\n/**\n * Empty means safe to evaluate; anything else means exclude the tree.\n *\n * `isLoggedIn` is a tri-state: `undefined` means the theme did not tell us, and\n * is the case this refuses. Defaulting it to `false` reads as \"known guest\" and\n * re-opens the fail-open path.\n */\nexport function unmetRequirements(\n rules: unknown,\n identity: IdentityBundle | undefined,\n): AudienceRequirement[] {\n const unmet: AudienceRequirement[] = [];\n\n const hasAuthSignal =\n identity?.isLoggedIn !== undefined || !!identity?.shopifyCustomerId;\n if (!hasAuthSignal && rulesRequireCustomerContext(rules)) {\n unmet.push(\"customerContext\");\n }\n\n return unmet;\n}\n","import { isCustomerContextLeaf } from \"./capabilities\";\nimport { getConditionEvaluator } from \"./condition-registry\";\nimport { IdentityBundle } from \"./identity-bundle\";\nimport {\n AudienceRulesTree,\n RuleConditionNode,\n RuleGroupNode,\n} from \"./types\";\n\nexport interface MatchedCondition {\n type: string;\n provider?: string | null;\n // The leaf's config — lets debug surfaces distinguish same-type conditions.\n config?: Record<string, any> | null;\n // Whether the leaf was negated (matched because it did NOT apply).\n negate?: boolean | null;\n}\n\nexport interface AudienceResolution {\n matches: boolean;\n matchedConditions: MatchedCondition[];\n}\n\nfunction isEmptyRules(rules: unknown): boolean {\n return (\n rules == null ||\n (typeof rules === \"object\" &&\n !Array.isArray(rules) &&\n Object.keys(rules as object).length === 0)\n );\n}\n\nfunction isGroupNode(node: unknown): node is RuleGroupNode {\n return (\n !!node && typeof node === \"object\" && typeof (node as any).op === \"string\"\n );\n}\n\n/**\n * Evaluates an audience rules tree against an IdentityBundle at SSR. AND/OR\n * short-circuit; NOT (\"none of these\") matches when none of its children match;\n * leaves dispatch to their registered evaluator (with leaf `negate` applied). An\n * empty tree matches everyone. Unknown types + evaluator errors fail closed.\n */\nexport async function resolveRulesTree(\n rules: AudienceRulesTree | null | undefined,\n identity: IdentityBundle,\n): Promise<AudienceResolution> {\n const matchedConditions: MatchedCondition[] = [];\n\n if (isEmptyRules(rules)) {\n return { matches: true, matchedConditions };\n }\n\n const matches = await evaluateNode(rules, identity, matchedConditions);\n // Only surface matched conditions when the audience actually matched —\n // otherwise a `matches: false` result contradicts a populated list. Even on a\n // match the list is raw per-leaf truthiness: a leaf inside a NOT group that\n // the group then excludes can still appear.\n return { matches, matchedConditions: matches ? matchedConditions : [] };\n}\n\nasync function evaluateNode(\n node: unknown,\n identity: IdentityBundle,\n matched: MatchedCondition[],\n): Promise<boolean> {\n if (isGroupNode(node)) {\n const { op, children } = node;\n\n if (op === \"AND\") {\n for (const child of children) {\n if (!(await evaluateNode(child, identity, matched))) return false;\n }\n return true;\n }\n\n if (op === \"OR\") {\n for (const child of children) {\n if (await evaluateNode(child, identity, matched)) return true;\n }\n return false;\n }\n\n // NOT (\"none of these\") — matches iff none of the children match, i.e.\n // !(OR of children). A single child reduces to plain negation. Short-circuit\n // on the first match; an empty group fails closed. Mirrors backpack.\n if (!children?.length) return false;\n for (const child of children) {\n if (await evaluateNode(child, identity, matched)) return false;\n }\n return true;\n }\n\n return evaluateLeaf(node as RuleConditionNode, identity, matched);\n}\n\nasync function evaluateLeaf(\n leaf: RuleConditionNode,\n identity: IdentityBundle,\n matched: MatchedCondition[],\n): Promise<boolean> {\n const evaluate = getConditionEvaluator(leaf.type);\n\n // Unknown type at eval time (validation blocks this on save) → fail closed.\n if (!evaluate) return false;\n\n let result: boolean;\n try {\n result = await evaluate(leaf.config ?? {}, identity);\n } catch {\n result = false;\n }\n\n if (leaf.negate) result = !result;\n\n if (result) {\n matched.push({\n type: leaf.type,\n provider: leaf.provider ?? null,\n config: leaf.config ?? null,\n negate: leaf.negate ?? null,\n });\n }\n\n return result;\n}\n\n/** An audience's answer before the customer is known. */\nexport type CustomerlessDecision = \"match\" | \"no-match\" | \"depends\";\n\n/**\n * Evaluate an audience with the customer unknown, to learn whether asking the\n * theme who is signed in could change the answer.\n *\n * Three-valued: customer leaves are unknown, every other leaf evaluates as\n * usual, and groups combine as AND/OR/NOT over true/false/unknown. \"US AND\n * signed in\" is therefore a no-match for a visitor outside the US without\n * calling the hook. Only a \"depends\" answer needs it; the result is used to\n * decide that, never to serve.\n */\nexport async function decideWithoutCustomerContext(\n rules: AudienceRulesTree | null | undefined,\n identity: IdentityBundle,\n): Promise<CustomerlessDecision> {\n if (isEmptyRules(rules)) return \"match\";\n\n const value = await evaluateThreeValued(rules, identity);\n return value === undefined ? \"depends\" : value ? \"match\" : \"no-match\";\n}\n\nasync function evaluateThreeValued(\n node: unknown,\n identity: IdentityBundle,\n): Promise<boolean | undefined> {\n if (isGroupNode(node)) {\n const { op, children } = node;\n const values: (boolean | undefined)[] = [];\n\n for (const child of children ?? []) {\n const value = await evaluateThreeValued(child, identity);\n if (op === \"AND\" && value === false) return false;\n if (op !== \"AND\" && value === true) return op === \"OR\";\n values.push(value);\n }\n\n if (op === \"AND\") return values.includes(undefined) ? undefined : true;\n if (op === \"OR\") return values.includes(undefined) ? undefined : false;\n\n // NOT: none of the children match. An empty group fails closed, as above.\n if (!children?.length) return false;\n return values.includes(undefined) ? undefined : true;\n }\n\n if (isCustomerContextLeaf(node)) return undefined;\n\n return evaluateLeaf(node as RuleConditionNode, identity, []);\n}\n","// Parser only, not the `graphql` barrel: the barrel bundles to 97.7KB gzipped\n// against 19.3KB for this path, since graphql does not tree-shake from its index.\n//\n// NOT v16-only, contrary to what this said until 2026-08-27. v17 ships an\n// `exports` map, but its `./*.js` wildcard still matches this path — verified\n// against a real 17.0.2 install.\n//\n// Rollup keeps it out of client chunks (0 of 86 in a starter production build),\n// but the package declares no `sideEffects`, so that is the consumer's build\n// doing the work rather than a guarantee of this package.\nimport { parse } from \"graphql/language/parser.js\";\n\n/**\n * Which kind of CMS query a test can influence.\n *\n * The unit that matters is the query, not the content surface. A request\n * resolves one test variant, and site settings, pages, products and so on are\n * fetched by separate queries — so two tests can both be served as long as no\n * single query is affected by both.\n */\nexport const CONTENT_QUERY_CLASSES = [\n \"page\",\n \"product\",\n \"collection\",\n \"article\",\n \"blog\",\n] as const;\n\nexport const QUERY_CLASSES = [\"siteSettings\", ...CONTENT_QUERY_CLASSES] as const;\n\nexport type QueryClass = (typeof QUERY_CLASSES)[number];\n\n/**\n * The query classes a variant's overridden content surface can reach.\n *\n * `section` and `template` are the interesting cases: neither is fetched on its\n * own by a storefront — sections come back inside whichever content query owns\n * them, and templates back content pages. So a test touching either can affect\n * every content query, and contends with all of them.\n *\n * An unrecognized surface is treated as reaching everything. A content type\n * added to the CMS later should cost concurrency, never correctness.\n */\nexport function queryClassesForSurface(surface: string): QueryClass[] {\n switch (surface) {\n case \"siteSettings\":\n return [\"siteSettings\"];\n case \"page\":\n case \"product\":\n case \"collection\":\n case \"article\":\n case \"blog\":\n return [surface];\n case \"section\":\n case \"template\":\n return [...CONTENT_QUERY_CLASSES];\n default:\n return [...QUERY_CLASSES];\n }\n}\n\n/**\n * Backpack root fields, mapped to the query class they belong to.\n *\n * Keyed on the API's own field names rather than the alias a theme happens to\n * use, so renaming an alias cannot silently stop a test from being served.\n */\nconst ROOT_FIELD_CLASSES: Record<string, QueryClass> = {\n siteSettings: \"siteSettings\",\n\n page: \"page\",\n pageByHandle: \"page\",\n pages: \"page\",\n\n productPage: \"product\",\n productPageByHandle: \"product\",\n productPages: \"product\",\n\n collectionPage: \"collection\",\n collectionPageByHandle: \"collection\",\n collectionPages: \"collection\",\n\n article: \"article\",\n articleByHandle: \"article\",\n articles: \"article\",\n\n blog: \"blog\",\n blogByHandle: \"blog\",\n blogs: \"blog\",\n};\n\n/**\n * The root selection field names of the document's query operation, with\n * `alias: field` resolved to `field`.\n *\n * Parsed rather than pattern-matched: the variant header this decides is part of\n * the CMS cache key, so a comment or string that happens to contain a field name\n * must not be able to move it.\n *\n * Reads the first `query` operation only. A root selection that is a fragment\n * spread yields nothing, classifying as unknown, which falls back to the\n * request primary.\n */\nexport function getRootFieldNames(query: string): string[] {\n let document;\n\n try {\n document = parse(query, { noLocation: true });\n } catch {\n // An unparseable document is the CMS's to reject, not ours to throw on:\n // classifying it as unknown leaves the request to fail on its own terms.\n return [];\n }\n\n for (const definition of document.definitions) {\n if (definition.kind !== \"OperationDefinition\") continue;\n if (definition.operation !== \"query\") continue;\n\n const fields: string[] = [];\n\n for (const selection of definition.selectionSet.selections) {\n if (selection.kind === \"Field\") fields.push(selection.name.value);\n }\n\n return fields;\n }\n\n return [];\n}\n\n// Themes hold queries as module constants, so a storefront has a handful. The\n// cap only stops a caller that builds query strings dynamically from growing an\n// unbounded map.\nconst MAX_CACHED_CLASSIFICATIONS = 100;\n\nconst classifications = new Map<string, QueryClass | undefined>();\n\nfunction resolveQueryClass(query: string): QueryClass | undefined {\n const classes = new Set<QueryClass>();\n\n for (const field of getRootFieldNames(query)) {\n const queryClass = ROOT_FIELD_CLASSES[field];\n if (queryClass) classes.add(queryClass);\n }\n\n if (classes.size !== 1) return undefined;\n\n return [...classes][0];\n}\n\n/**\n * Which query class this document belongs to, or undefined when it selects no\n * field a test could influence (product groupings, for instance) or nothing\n * recognizable.\n *\n * Returns undefined rather than guessing when a document spans more than one\n * class, since a single request carries one variant and picking arbitrarily\n * would silently serve the wrong content.\n *\n * Memoized on the query text, so the parse runs once per distinct query per\n * isolate rather than once per request.\n */\nexport function classifyQuery(query: string): QueryClass | undefined {\n if (classifications.has(query)) return classifications.get(query);\n\n const resolved = resolveQueryClass(query);\n\n if (classifications.size < MAX_CACHED_CLASSIFICATIONS) {\n classifications.set(query, resolved);\n }\n\n return resolved;\n}\n","/**\n * Deterministic bucketing: a visitor's variant is derived from their session id\n * rather than rolled and stored, so the same inputs resolve the same way in a\n * loader, in a browser, or in any evaluator implementing the same two functions.\n */\n\nconst FNV_OFFSET_BASIS = 0x811c9dc5;\nconst FNV_PRIME = 0x01000193;\n\nconst encoder = new TextEncoder();\n\n// UTF-8 bytes rather than `charCodeAt`, so a port to a non-JavaScript evaluator\n// hashes the same input. The two agree for ASCII and diverge above it.\nfunction fnv1a(input: string): number {\n let hash = FNV_OFFSET_BASIS;\n\n for (const byte of encoder.encode(input)) {\n hash ^= byte;\n hash = Math.imul(hash, FNV_PRIME) >>> 0;\n }\n\n return hash >>> 0;\n}\n\n/**\n * murmur3's fmix32. Load-bearing, not decoration: two tests differ only in the\n * trailing id, so without it their hashes differ only in the low bits `% 100`\n * reads, and a visitor's arm in one test predicts their arm in another. The\n * independence assertion in the tests is what holds this.\n */\nfunction fmix32(hash: number): number {\n let h = hash >>> 0;\n\n h ^= h >>> 16;\n h = Math.imul(h, 0x85ebca6b) >>> 0;\n h ^= h >>> 13;\n h = Math.imul(h, 0xc2b2ae35) >>> 0;\n h ^= h >>> 16;\n\n return h >>> 0;\n}\n\n/**\n * A stable 32-bit value for this seed and key. `seed` identifies the visitor,\n * `key` what is being decided — a test id when deriving a variant, a namespaced\n * test id when settling contention.\n */\nexport function hash32(seed: string, key: string): number {\n return fmix32(fnv1a(`${seed}:${key}`));\n}\n\n/** A bucket in `[0, buckets)`. Modulo bias is ~1 in 42M at `buckets = 100`. */\nexport function bucket(seed: string, key: string, buckets: number): number {\n if (!Number.isInteger(buckets) || buckets < 1) {\n throw new RangeError(`bucket() needs a positive integer, got ${buckets}`);\n }\n\n return hash32(seed, key) % buckets;\n}\n\n/** The 1-100 draw the variant roll compares against accumulated percentages. */\nexport function variantSpot(seed: string, testId: string): number {\n return bucket(seed, testId, 100) + 1;\n}\n","import type { TestTargetAudienceAttributes } from \"./test\";\n\n/**\n * Inline targeting rules — the URL and UTM conditions authored in the\n * customizer. A flat conjunction over eight string operators; the customizer\n * offers no way to express an OR.\n */\nexport interface TargetingRule {\n attribute: string;\n operator: string;\n value: string;\n}\n\n// Rules arrive as JSON from the CMS, so a malformed entry is possible. Dropping\n// them loosens targeting rather than tightening it — preserved from the engine\n// this replaced, which was handed only the well-formed ones.\nfunction isTargetingRule(rule: unknown): rule is TargetingRule {\n return (\n rule !== null &&\n typeof rule === \"object\" &&\n Object.hasOwn(rule, \"attribute\") &&\n Object.hasOwn(rule, \"operator\") &&\n Object.hasOwn(rule, \"value\")\n );\n}\n\n/**\n * Null means the pattern would not compile, which is not the same answer as\n * \"did not match\" — `matchesRule` fails the rule in both polarities.\n *\n * Unbounded, matching the previous behaviour. Audience conditions cap pattern\n * and input length (`audiences/safe-regex.ts`); aligning them would change which\n * visitors match, so it stays a separate change.\n */\nfunction testPattern(pattern: string, input: string): boolean | null {\n try {\n return new RegExp(pattern).test(input);\n } catch {\n return null;\n }\n}\n\n// Own properties only. A rule naming `toString` or `constructor` would otherwise\n// resolve to an inherited function, pass the `!!fact` check, and throw on\n// `fact.includes` — failing the whole request, which is the behaviour this\n// evaluator exists to stop. The engine looked facts up in a Map and had no\n// prototype to reach.\nfunction attributeValue(\n attributes: TestTargetAudienceAttributes,\n attribute: string,\n): string | undefined {\n if (!Object.hasOwn(attributes, attribute)) return undefined;\n\n const value = (attributes as Record<string, unknown>)[attribute];\n\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * One rule against one request.\n *\n * Semantics are the engine's, including the asymmetries: `notEqual` matches a\n * visitor who lacks the attribute entirely, while `stringDoesNotContain` and\n * `doesNotMatchRegex` require it to be present. The truth table is pinned in\n * `rule-evaluator.test.ts`, checked against both v4 and backpack's v7.3.1.\n *\n * A rule the evaluator cannot answer — unknown operator, uncompilable pattern —\n * excludes its own test. The engine threw, which excluded every test on the\n * request instead.\n */\nexport function matchesRule(\n rule: TargetingRule,\n attributes: TestTargetAudienceAttributes,\n): boolean {\n const fact = attributeValue(attributes, rule.attribute);\n const { value } = rule;\n\n switch (rule.operator) {\n case \"equal\":\n return fact === value;\n case \"notEqual\":\n return fact !== value;\n case \"stringContains\":\n return !!fact && fact.includes(value);\n case \"stringDoesNotContain\":\n return !!fact && !fact.includes(value);\n case \"matchesRegex\":\n return !!fact && testPattern(value, fact) === true;\n case \"doesNotMatchRegex\":\n return !!fact && testPattern(value, fact) === false;\n case \"isSet\":\n return !!fact;\n case \"isNotSet\":\n return !fact;\n default:\n return false;\n }\n}\n\n/**\n * An empty array means no targeting, so every request matches. A non-array means\n * the payload is unusable, which excludes the test.\n */\nexport function matchesTargeting(\n rules: unknown,\n attributes: TestTargetAudienceAttributes,\n): boolean {\n if (!Array.isArray(rules)) return false;\n\n return rules\n .filter(isTargetingRule)\n .every((rule) => matchesRule(rule, attributes));\n}\n","import createDebug from \"debug\";\n\nconst debug = createDebug(\"pack:ab-testing:customer\");\n\n/**\n * What the theme tells us about who is signed in.\n *\n * `isLoggedIn` alone is enough for `auth_status`, and it is the cheap half: a\n * session check rather than a Customer Account API query. Supply\n * `shopifyCustomerId` only where the id itself is needed.\n */\nexport interface CustomerContext {\n isLoggedIn: boolean;\n shopifyCustomerId?: string;\n}\n\n/**\n * Asked only when an audience on this request could depend on who is signed\n * in, at most once per request. Make it a local session read (Hydrogen's\n * `customerAccount.isLoggedIn()`), not a Customer Account API query: it sits\n * on the SSR critical path, bounded by `customerContextTimeoutMs`.\n */\nexport type GetCustomerContext = (context: {\n request: Request;\n}) => Promise<CustomerContext | undefined> | CustomerContext | undefined;\n\n/**\n * Default bound on the hook, which sits on the SSR critical path.\n *\n * Sized against the work: the common path is a session read, and even a token\n * refresh to Shopify should land well inside this. The asymmetry sets it rather\n * than the mean — expiring costs one audience its answer for one request, while\n * waiting costs every render on the store, so the bound is deliberately closer\n * to the expected cost than to the worst case.\n *\n * Raise it via `customerContextTimeoutMs` on a store whose customer account\n * responses are genuinely slower; expiry is logged as a warning precisely so\n * that shows up rather than reading as \"personalization does not work\".\n */\nexport const DEFAULT_CUSTOMER_CONTEXT_TIMEOUT_MS = 300;\n\n/**\n * Resolve the theme's customer context, or undefined when it cannot be\n * established.\n *\n * Undefined is the important return: it leaves `isLoggedIn` unset, which\n * `unmetRequirements` refuses on. Returning `{ isLoggedIn: false }` instead\n * would assert a KNOWN guest, and `auth_status: \"anonymous\"` would then match\n * every visitor the hook failed for.\n */\nexport async function resolveCustomerContext(\n getCustomerContext: GetCustomerContext | undefined,\n request: Request,\n timeoutMs: number = DEFAULT_CUSTOMER_CONTEXT_TIMEOUT_MS,\n): Promise<CustomerContext | undefined> {\n if (!getCustomerContext) return undefined;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n const timeout = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => {\n // Warned, not just debugged. Refusal is silent by design, so without\n // this a store whose customer account is slower than the bound sees its\n // audiences quietly never serve and nothing says why.\n console.warn(\n `[Pack Test] getCustomerContext exceeded ${timeoutMs}ms; audiences that need a customer signal will not serve on this request. Raise customerContextTimeoutMs if this is expected.`,\n );\n resolve(undefined);\n }, timeoutMs);\n });\n\n const resolved = await Promise.race([\n Promise.resolve(getCustomerContext({ request })),\n timeout,\n ]);\n\n if (!resolved || typeof resolved.isLoggedIn !== \"boolean\") {\n debug(\"[Pack Customer] No usable customer context returned\");\n return undefined;\n }\n\n return {\n isLoggedIn: resolved.isLoggedIn,\n ...(resolved.shopifyCustomerId\n ? { shopifyCustomerId: resolved.shopifyCustomerId }\n : {}),\n };\n } catch (error) {\n // Unknown, not anonymous — see the doc comment.\n debug(\"[Pack Customer] getCustomerContext threw:\", String(error));\n console.error(\"[Pack Test] getCustomerContext failed:\", error);\n return undefined;\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n","import { Test } from \"./test\";\n\n/**\n * The `exposedTest` cookie: which tests this visitor has already had an\n * impression fired for, keyed by test id.\n *\n * Written client-side once an impression triggers, read server-side to restore\n * assignments for a visitor whose session cookie was lost but whose exposure\n * cookie survived — and to keep a restored test from re-firing its impression.\n *\n * Before 4.0 this held a single test object. Both shapes are accepted on read;\n * only the map is written. The written map may also carry personalizations\n * compactly under `PERSONALIZATIONS_KEY`; parsing expands them into id-only\n * entries.\n */\nexport type ExposedTests = Record<string, ExposedTest>;\n\n/**\n * `exposureTime` is what the cap orders by; an entry written before it was\n * stored has none and sorts last.\n */\nexport type ExposedTest = Test & { exposureTime?: number };\n\n/**\n * Legacy one-shot handoff, still written by pre-4.0 SDKs.\n *\n * `createPackClient`'s request handler CLEARS this on every response whose\n * request carried it, which is correct for what it was: the client wrote one\n * test, the server consumed it on the next request, and the response expired it\n * so a prefetch could not consume it twice.\n *\n * Read for migration, never written. A durable ledger cannot live here — the\n * clear would wipe it after one round trip, and an older SDK still in the wild\n * both clears it and overwrites it with the single-test shape.\n */\nexport const LEGACY_EXPOSED_TEST_COOKIE = \"exposedTest\";\n\n/**\n * The exposure ledger: which tests this visitor has already been exposed to.\n *\n * Its own cookie precisely so the legacy one-shot clear does not apply to it.\n * Named into the `__pack*` family alongside `__pack`, `__pack_s` and\n * `__pack_test`.\n */\nexport const EXPOSED_TEST_COOKIE = \"__pack_exposed\";\n\n/**\n * Most entries the ledger keeps, newest first by exposure time.\n *\n * Bounded because it is now durable. The legacy cookie was one-shot, so its\n * unbounded growth was self-limiting; a ledger that persists is not, and an\n * oversized cookie is dropped by the browser silently — losing every entry\n * rather than the oldest.\n */\nexport const MAX_EXPOSED_TESTS = 12;\n\n/**\n * Personalizations are recorded apart from A/B tests, as id and exposure time\n * only, under this key.\n *\n * A personalization is never stored in the session, so this ledger is the only\n * record that its exposure was reported. At the A/B cap, a visitor matching\n * more personalizations than the cap rotated them out and re-reported them on\n * every page load. Nothing restores a personalization from here, so the id is\n * all it needs, and a compact entry fits many more under the same cookie.\n */\nconst PERSONALIZATIONS_KEY = \"__p\";\n\n/**\n * Byte ceiling for the whole ledger, measured as the fully URL-encoded value\n * (what the server's `cookie.serialize` writes; the client's js-cookie encodes\n * less). Leaves room for the name and attributes under the 4096-byte browser\n * limit.\n *\n * The count cap alone never guaranteed this: twelve A/B entries with 60-char\n * handles already encode past 4KB, and a cookie over the limit is dropped\n * whole. A/B entries are kept first, newest first; personalizations fill what\n * is left.\n */\nexport const MAX_EXPOSED_COOKIE_BYTES = 3800;\n\n/**\n * Held back from A/B entries whenever there are personalizations to record,\n * about ten compact entries' worth. Without it, A/B entries near the budget\n * left no room at all, and a personalization — recorded nowhere else — was\n * reported again on every load.\n */\nexport const PERSONALIZATION_RESERVE_BYTES = 650;\n\nfunction isUsableTest(value: unknown): value is Test {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Test;\n return Boolean(candidate.id && candidate.testVariant?.id);\n}\n\n/** Reduce to the fields the server needs, so the cookie stays small. */\nfunction toExposedTest(test: Test, exposureTime?: number): ExposedTest {\n return {\n id: test.id,\n handle: test.handle,\n testVariant: {\n id: test.testVariant.id,\n handle: test.testVariant.handle,\n },\n ...(Number.isFinite(exposureTime) ? { exposureTime } : {}),\n ...(test.personalization ? { personalization: true as const } : {}),\n };\n}\n\n/** A compact personalization entry, expanded to the map's shape. Id only. */\nfunction fromCompactPersonalization(\n id: string,\n exposureTime: unknown,\n): ExposedTest {\n return {\n id,\n handle: \"\",\n testVariant: { id: \"\", handle: \"\" },\n ...(Number.isFinite(exposureTime) ? { exposureTime: exposureTime as number } : {}),\n personalization: true,\n };\n}\n\nfunction readExposureTime(value: unknown): number | undefined {\n const time = (value as ExposedTest).exposureTime;\n return Number.isFinite(time) ? time : undefined;\n}\n\n/**\n * Attributes for the exposure ledger cookie, matching the signed session cookie\n * beside it — the server reads this one to restore an assignment, so it should\n * be no less protected than the cookie it restores into.\n *\n * `secure` is passed in rather than assumed: a local `http://` dev server drops\n * a Secure cookie silently, and with it every exposure in development.\n */\nexport function exposedCookieOptions(now: Date, isSecureOrigin: boolean) {\n const expires = new Date(now);\n expires.setHours(expires.getHours() + 24);\n\n return { expires, sameSite: \"lax\" as const, secure: isSecureOrigin, path: \"/\" };\n}\n\nexport function parseExposedTests(raw: string | undefined | null): ExposedTests {\n if (!raw) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return {};\n }\n\n if (!parsed || typeof parsed !== \"object\") return {};\n\n // Pre-4.0 single-test shape.\n if (isUsableTest(parsed)) {\n return { [(parsed as Test).id]: toExposedTest(parsed as Test) };\n }\n\n const exposed: ExposedTests = {};\n const { [PERSONALIZATIONS_KEY]: personalizations, ...tests } = parsed as Record<\n string,\n unknown\n >;\n\n for (const value of Object.values(tests)) {\n if (isUsableTest(value)) {\n exposed[value.id] = toExposedTest(value, readExposureTime(value));\n }\n }\n\n if (personalizations && typeof personalizations === \"object\") {\n for (const [id, time] of Object.entries(personalizations)) {\n if (id && !exposed[id]) exposed[id] = fromCompactPersonalization(id, time);\n }\n }\n\n return exposed;\n}\n\nconst byNewest = ([idA, a]: [string, ExposedTest], [idB, b]: [string, ExposedTest]) =>\n (b.exposureTime ?? 0) - (a.exposureTime ?? 0) || idA.localeCompare(idB);\n\nconst encodedBytes = (value: unknown) =>\n encodeURIComponent(JSON.stringify(value)).length;\n\n/**\n * A/B entries newest first, at most `MAX_EXPOSED_TESTS`, then personalizations\n * as id and time, newest first — each only while the whole value fits\n * `MAX_EXPOSED_COOKIE_BYTES`. A/B entries leave `PERSONALIZATION_RESERVE_BYTES`\n * free when there are personalizations, and the newest A/B entry is always\n * kept.\n */\nexport function serializeExposedTests(exposed: ExposedTests): string {\n const tests: [string, ExposedTest][] = [];\n const personalizations: [string, ExposedTest][] = [];\n\n for (const [id, entry] of Object.entries(exposed)) {\n if (entry.personalization) personalizations.push([id, entry]);\n else tests.push([id, entry]);\n }\n\n const value: Record<string, unknown> = {};\n const fits = (budget = MAX_EXPOSED_COOKIE_BYTES) =>\n encodedBytes(value) <= budget;\n const testBudget = personalizations.length\n ? MAX_EXPOSED_COOKIE_BYTES - PERSONALIZATION_RESERVE_BYTES\n : MAX_EXPOSED_COOKIE_BYTES;\n\n for (const [id, entry] of tests.sort(byNewest).slice(0, MAX_EXPOSED_TESTS)) {\n value[id] = entry;\n if (!fits(testBudget) && Object.keys(value).length > 1) {\n delete value[id];\n break;\n }\n }\n\n if (!personalizations.length) return JSON.stringify(value);\n\n const compact: Record<string, number> = {};\n value[PERSONALIZATIONS_KEY] = compact;\n\n for (const [id, entry] of personalizations.sort(byNewest)) {\n compact[id] = entry.exposureTime ?? 0;\n if (!fits()) {\n delete compact[id];\n break;\n }\n }\n\n if (!Object.keys(compact).length) delete value[PERSONALIZATIONS_KEY];\n return JSON.stringify(value);\n}\n\nexport function withExposedTest(\n exposed: ExposedTests,\n test: Test,\n exposureTime?: number,\n): ExposedTests {\n return { ...exposed, [test.id]: toExposedTest(test, exposureTime) };\n}\n\nexport type PendingExposure = {\n packTestInfo: Test;\n exposureTime: number;\n};\n\n/**\n * Which of this request's tests still owe an exposure.\n *\n * Drops malformed entries, anything the cookie already records, and anything\n * reported earlier in this mount.\n */\nexport function selectTestsOwedExposure(\n candidates: (Test | undefined | null)[],\n alreadyExposed: ExposedTests,\n reported: ReadonlySet<string> = new Set(),\n): Test[] {\n const owed: Test[] = [];\n const seen = new Set<string>();\n\n for (const test of candidates) {\n if (!isUsableTest(test)) continue;\n if (seen.has(test.id)) continue;\n if (alreadyExposed[test.id] || reported.has(test.id)) continue;\n\n seen.add(test.id);\n owed.push(test);\n }\n\n return owed;\n}\n\n/** The tests a page has been told owe an exposure, keyed by the page. */\nexport type RetainedOwedTests = { pageKey: string | undefined; tests: Test[] };\n\n/**\n * Accumulate the tests owed an exposure for as long as the page stays the same.\n *\n * Loader data lists only tests assigned on that request. Reporting an exposure\n * revalidates, and the revalidated data lists nothing new, so taking it at face\n * value unmounted the watcher of every test still waiting on its trigger — an\n * ON_ELEMENT_VIEW test beside an ON_LOAD one was never reported. A revalidation\n * keeps the page key; only a navigation starts over.\n */\nexport function retainOwedTests(\n previous: RetainedOwedTests,\n incoming: Test[],\n pageKey: string | undefined,\n): RetainedOwedTests {\n const byId = new Map<string, Test>();\n if (previous.pageKey === pageKey) {\n for (const test of previous.tests) byId.set(test.id, test);\n }\n for (const test of incoming) byId.set(test.id, test);\n\n return { pageKey, tests: [...byId.values()] };\n}\n\n/**\n * Decide what to report and what the exposure ledger becomes.\n *\n * Batches are merged in order — consent-held exposures before freshly triggered\n * ones — keeping the earliest `exposureTime` per test, so a test cannot be\n * reported twice and an exposure deferred for consent keeps the moment it\n * actually happened rather than the moment consent arrived.\n */\nexport function resolveExposures(\n batches: PendingExposure[][],\n alreadyExposed: ExposedTests,\n): { toReport: PendingExposure[]; nextExposed: ExposedTests } {\n const byTestId = new Map<string, PendingExposure>();\n\n for (const batch of batches) {\n for (const exposure of batch) {\n const test = exposure?.packTestInfo;\n if (!isUsableTest(test)) continue;\n if (alreadyExposed[test.id] || byTestId.has(test.id)) continue;\n\n byTestId.set(test.id, exposure);\n }\n }\n\n const toReport = [...byTestId.values()];\n const nextExposed = toReport.reduce(\n (exposed, { packTestInfo, exposureTime }) =>\n withExposedTest(exposed, packTestInfo, exposureTime),\n alreadyExposed,\n );\n\n return { toReport, nextExposed };\n}\n\n/**\n * The `packTestInfo` value a query response carries: the tests owed an exposure.\n *\n * One key, widened to accept a list, rather than a second key beside it. Themes\n * forward this value into loader data without inspecting it, so widening in\n * place means a theme written for the single-test era reports every exposure\n * with no change. A new key would have required each theme to thread it, and\n * until it did, several tests would serve while only one was counted.\n *\n * A lone test is emitted unwrapped, byte-identical to the single-test era.\n */\nexport function toPackTestInfo(\n owedExposure: Test[],\n): Test | Test[] | undefined {\n if (!owedExposure.length) return undefined;\n if (owedExposure.length === 1) return owedExposure[0];\n return owedExposure;\n}\n\n/** Read `packTestInfo` in either shape, dropping anything unserveable. */\nexport function fromPackTestInfo(\n packTestInfo: Test | Test[] | undefined | null,\n): Test[] {\n if (!packTestInfo) return [];\n\n const list = Array.isArray(packTestInfo) ? packTestInfo : [packTestInfo];\n\n return list.filter(isUsableTest);\n}\n","import type { ActionFunctionArgs, LoaderFunctionArgs } from \"react-router\";\nimport { PackCustomizerMeta } from \"../create-pack-client\";\n\nconst ROOT_PATH = \"/\" as const;\n\ntype JsonFunction = <Data>(\n data: Data,\n init?: number | ResponseInit,\n) => TypedResponse<Data>;\n\ntype RedirectFunction = (url: string, init?: number | ResponseInit) => Response;\n\n// must be a type since this is a subtype of response\n// interfaces must conform to the types they extend\ntype TypedResponse<T = unknown> = Omit<Response, \"json\"> & {\n json(): Promise<T>;\n};\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A not found response. Sets the status code.\n */\nfunction notFound(message = \"Not Found\") {\n return new Response(message, { status: 404, statusText: \"Not Found\" });\n}\n\nfunction isLocalPath(request: Request, url: string) {\n // Our domain, based on the current request path\n const currentUrl = new URL(request.url);\n\n // If url is relative, the 2nd argument will act as the base domain.\n const urlToCheck = new URL(url, currentUrl.origin);\n\n // If the origins don't match the slug is not on our domain.\n return currentUrl.origin === urlToCheck.origin;\n}\n\n/**\n * A `POST` request to this route will exit preview mode\n * POST /api/edit Content-Type: application/x-www-form-urlencoded\n */\nexport async function action({ request, context }: ActionFunctionArgs) {\n const { session } = context.pack;\n\n if (!(request.method === \"POST\" && session)) {\n return json({ message: \"Method not allowed\" }, 405);\n }\n\n const body = await request.formData();\n const slug = (body.get(\"slug\") as string) ?? ROOT_PATH;\n const redirectTo = isLocalPath(request, slug) ? slug : ROOT_PATH;\n\n await session.destroy();\n\n return redirect(redirectTo);\n}\n\n/**\n * A `GET` request to this route will enter preview mode\n */\nexport async function loader({ request, context }: LoaderFunctionArgs) {\n const { pack } = context;\n\n if (!pack.session) return notFound();\n\n const { searchParams } = new URL(request.url);\n\n const token = searchParams.get(\"token\");\n const environment = searchParams.get(\"environment\");\n const path = searchParams.get(\"path\") ?? ROOT_PATH;\n const customizerMeta = searchParams.get(\"customizerMeta\");\n const redirectTo = isLocalPath(request, path) ? path : ROOT_PATH;\n\n if (!searchParams.has(\"token\")) {\n throw new MissingTokenError();\n }\n\n const validatedToken = await pack.isValidEditToken(token);\n\n if (!validatedToken) {\n throw new InvalidTokenError();\n }\n\n let customizerMetaJson: PackCustomizerMeta | null;\n let previewContext: PackCustomizerMeta[\"previewContext\"] | null = null;\n\n try {\n customizerMetaJson = customizerMeta\n ? (JSON.parse(customizerMeta) as PackCustomizerMeta)\n : null;\n\n previewContext = customizerMetaJson?.previewContext || null;\n } catch {\n customizerMetaJson = null;\n }\n\n // Store preview mode and environment\n pack.session.set(\"previewEnabled\", true);\n pack.session.set(\"environment\", environment);\n pack.session.set(\"customizerMeta\", customizerMetaJson);\n\n // Always reset preview context fields to prevent stale data from a previous\n // storefront session bleeding into the current one. This is critical when\n // switching between local storefronts on the same localhost origin, since\n // the __pack cookie persists across storefront switches.\n pack.session.set(\"locale\", previewContext?.locale ?? null);\n pack.session.set(\"releaseId\", previewContext?.releaseId ?? null);\n pack.session.set(\"pageDraft\", previewContext?.pageDraft ?? null);\n pack.session.set(\n \"siteSettingsDraft\",\n previewContext?.siteSettingsDraft ?? null,\n );\n pack.session.set(\"testHandle\", previewContext?.testHandle ?? null);\n pack.session.set(\n \"testVariantHandle\",\n previewContext?.testVariantHandle ?? null,\n );\n\n return redirect(redirectTo, {\n status: 307,\n });\n}\n\nclass MissingTokenError extends Response {\n constructor() {\n super(\"Missing token\", { status: 401, statusText: \"Unauthorized\" });\n }\n}\n\nclass InvalidTokenError extends Response {\n constructor() {\n super(\"Invalid token\", { status: 401, statusText: \"Unauthorized\" });\n }\n}\n","import {\n useLoaderData,\n useLocation,\n useMatches,\n useRevalidator,\n} from \"react-router\";\nimport Cookies from \"js-cookie\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { usePackTestContext } from \"./pack-test-context\";\nimport { Test } from \"./test\";\nimport {\n EXPOSED_TEST_COOKIE,\n LEGACY_EXPOSED_TEST_COOKIE,\n exposedCookieOptions,\n fromPackTestInfo,\n parseExposedTests,\n retainOwedTests,\n type RetainedOwedTests,\n resolveExposures,\n selectTestsOwedExposure,\n serializeExposedTests,\n type ExposedTests,\n type PendingExposure,\n} from \"./exposed-tests\";\n\ntype PackTestImpressionSelector =\n | string\n | string[]\n | ((packTestInfo: Test) => string | string[] | undefined);\n\nfunction getImpressionSectionSelectors(packTestInfo: Test): string[] {\n const sectionIds = packTestInfo.impression?.sectionIds || [];\n\n return [...new Set(sectionIds)].map(\n (sectionId) => `section[data-comp-id=\"${sectionId}\"]`,\n );\n}\n\nfunction getImpressionSelectors(\n packTestInfo: Test,\n impressionSelector?: PackTestImpressionSelector,\n): string[] {\n if (!impressionSelector) {\n return getImpressionSectionSelectors(packTestInfo);\n }\n\n const resolvedSelector =\n typeof impressionSelector === \"function\"\n ? impressionSelector(packTestInfo)\n : impressionSelector;\n\n if (!resolvedSelector) {\n return getImpressionSectionSelectors(packTestInfo);\n }\n\n return Array.isArray(resolvedSelector)\n ? resolvedSelector\n : [resolvedSelector];\n}\n\n/**\n * The ledger, falling back to the legacy one-shot cookie.\n *\n * The fallback is a belt-and-braces read: the server migrates a legacy cookie\n * into the ledger on the same response that clears it, so by hydration there is\n * normally nothing left to fall back to. It stays for a client rendering\n * against a response that did not go through `handleRequest`.\n */\nfunction readExposedCookie(): string | undefined {\n return (\n Cookies.get(EXPOSED_TEST_COOKIE) ?? Cookies.get(LEGACY_EXPOSED_TEST_COOKIE)\n );\n}\n\n/**\n * Record the exposure ledger client-side. The server reads it to restore\n * assignments for a visitor whose session cookie was lost, and to keep those\n * restored tests from re-firing an impression.\n */\nfunction writeExposedCookie(exposed: ExposedTests): void {\n Cookies.set(\n EXPOSED_TEST_COOKIE,\n serializeExposedTests(exposed),\n exposedCookieOptions(\n new Date(),\n typeof window !== \"undefined\" && window.location.protocol === \"https:\",\n ),\n );\n}\n\n/**\n * Watches one test's impression trigger and reports it at most once.\n *\n * One component per test rather than a loop inside a single hook: React then\n * owns each test's observer lifecycle, so a test appearing or disappearing on\n * navigation sets up and tears down cleanly.\n */\nfunction TestImpression({\n test,\n impressionSelector,\n onImpression,\n}: {\n test: Test;\n impressionSelector?: PackTestImpressionSelector;\n onImpression: (test: Test) => void;\n}) {\n // Kept in a ref so the parent can pass a fresh callback without tearing down\n // and rebuilding this test's observers on every render.\n const onImpressionRef = useRef(onImpression);\n onImpressionRef.current = onImpression;\n\n useEffect(() => {\n let isTriggered = false;\n const observedElements = new Set<Element>();\n let observer: IntersectionObserver | undefined;\n let mutationObserver: MutationObserver | undefined;\n let observerTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n observer?.disconnect();\n mutationObserver?.disconnect();\n if (observerTimeoutId) {\n clearTimeout(observerTimeoutId);\n }\n };\n\n const triggerImpression = () => {\n if (isTriggered) return;\n isTriggered = true;\n cleanup();\n onImpressionRef.current(test);\n };\n\n // Anything other than ON_ELEMENT_VIEW (including undefined) fires on load,\n // for backward compatibility.\n if (\n test.impressionTrigger !== \"ON_ELEMENT_VIEW\" ||\n typeof window === \"undefined\" ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n triggerImpression();\n return;\n }\n\n const impressionSectionSelectors = getImpressionSelectors(\n test,\n impressionSelector,\n );\n\n if (impressionSectionSelectors.length === 0) {\n console.warn(\n `[Pack Test] Test \"${test.id}\" uses ON_ELEMENT_VIEW but has no selectors to observe. Impression will not be tracked.`,\n );\n return;\n }\n\n const observeMatchingElements = () => {\n if (!observer || isTriggered) return;\n\n impressionSectionSelectors.forEach((selector) => {\n document.querySelectorAll(selector).forEach((element) => {\n if (observedElements.has(element)) return;\n observedElements.add(element);\n observer?.observe(element);\n });\n });\n\n if (observedElements.size > 0) {\n mutationObserver?.disconnect();\n mutationObserver = undefined;\n if (observerTimeoutId) {\n clearTimeout(observerTimeoutId);\n observerTimeoutId = undefined;\n }\n }\n };\n\n observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n triggerImpression();\n }\n },\n { threshold: 0.1 },\n );\n\n observeMatchingElements();\n\n if (\n !isTriggered &&\n observedElements.size === 0 &&\n typeof MutationObserver !== \"undefined\"\n ) {\n mutationObserver = new MutationObserver(() => {\n observeMatchingElements();\n });\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n observerTimeoutId = setTimeout(() => {\n if (!isTriggered && observedElements.size === 0) {\n console.warn(\n `[Pack Test] Impression target not found within 30s for test \"${test.id}\". Stopping observer.`,\n );\n cleanup();\n }\n }, 30000);\n }\n\n return cleanup;\n }, [\n test.id,\n test.testVariant?.id,\n test.impressionTrigger,\n impressionSelector,\n ]);\n\n return null;\n}\n\n/**\n * Tests this request newly assigned, each owing exactly one exposure.\n *\n * `packTestInfo` is a single test or a list of them. It is one key rather than\n * two because a theme forwards this value into loader data without inspecting\n * it, so widening it in place means a theme written for the single-test era\n * reports every exposure with no change.\n */\nfunction useTestsOwedExposure(): Test[] {\n let packTestInfo: Test | Test[] | undefined;\n\n try {\n const loaderData = useLoaderData<{ packTestInfo?: Test | Test[] }>();\n packTestInfo = loaderData?.packTestInfo;\n } catch (error) {\n console.error(\"PackTestRoute router error:\", error);\n return [];\n }\n\n return fromPackTestInfo(packTestInfo);\n}\n\ntype PackTestRouteProps = {\n impressionSelector?: PackTestImpressionSelector;\n};\n\nexport const PackTestRoute = ({\n impressionSelector,\n}: PackTestRouteProps = {}) => {\n const incomingTests = useTestsOwedExposure();\n\n let packIsPreviewMode: boolean | undefined;\n let revalidator: ReturnType<typeof useRevalidator> | undefined;\n let pageKey: string | undefined;\n\n try {\n // The pathname, not `location.key`: a variant picker's `?Color=` replace\n // or an in-page `#anchor` changes the key without leaving the page, and\n // resetting there drops a test whose trigger is still on screen.\n pageKey = useLocation().pathname;\n const [root] = useMatches();\n packIsPreviewMode =\n (\n root?.data as {\n packIsPreviewMode?: boolean;\n isPreviewModeEnabled?: boolean;\n }\n )?.packIsPreviewMode ||\n (\n root?.data as {\n packIsPreviewMode?: boolean;\n isPreviewModeEnabled?: boolean;\n }\n )?.isPreviewModeEnabled;\n\n revalidator = useRevalidator();\n } catch (error) {\n console.error(\"PackTestRoute router error:\", error);\n packIsPreviewMode = undefined;\n revalidator = undefined;\n }\n\n // Idempotent for a given render's inputs, so updating it during render is\n // safe; state would cost a render in which the waiting watchers unmount.\n const retained = useRef<RetainedOwedTests>({ pageKey, tests: [] });\n retained.current = retainOwedTests(retained.current, incomingTests, pageKey);\n const tests = retained.current.tests;\n\n const {\n testExposureCallback,\n hasUserConsent,\n pendingExposureQueue,\n setPendingExposureQueue,\n } = usePackTestContext();\n\n // Reported this mount. A ref, not state: it must be readable synchronously\n // from the impression callback to keep a second impression for the same test\n // from double-reporting before a re-render lands.\n const reportedIds = useRef<Set<string>>(new Set());\n const [triggered, setTriggered] = useState<PendingExposure[]>([]);\n\n const exposedCookie = readExposedCookie();\n const alreadyExposed = useMemo(\n () => parseExposedTests(exposedCookie),\n [exposedCookie],\n );\n\n const pendingTests = selectTestsOwedExposure(\n tests,\n alreadyExposed,\n reportedIds.current,\n );\n\n const handleImpression = useCallback((test: Test) => {\n if (reportedIds.current.has(test.id)) return;\n reportedIds.current.add(test.id);\n setTriggered((prev) => [\n ...prev,\n { packTestInfo: test, exposureTime: Date.now() },\n ]);\n }, []);\n\n /** Report a batch, write the ledger, and return whether anything fired. */\n const commitExposures = useCallback(\n (batches: PendingExposure[][]): boolean => {\n const { toReport, nextExposed } = resolveExposures(\n batches,\n parseExposedTests(readExposedCookie()),\n );\n\n if (!toReport.length) return false;\n\n for (const { packTestInfo, exposureTime } of toReport) {\n try {\n testExposureCallback?.({ ...packTestInfo, exposureTime });\n } catch (error) {\n console.error(\"Failed to call testExposure:\", error);\n }\n }\n\n writeExposedCookie(nextExposed);\n return true;\n },\n [testExposureCallback],\n );\n\n useEffect(() => {\n if (!triggered.length || packIsPreviewMode) return;\n\n if (!hasUserConsent) {\n // Hold until consent. Keyed by test id so re-renders cannot enqueue the\n // same exposure twice.\n setPendingExposureQueue?.((prev) => {\n let next = prev;\n for (const exposure of triggered) {\n if (next.has(exposure.packTestInfo.id)) continue;\n if (next === prev) next = new Map(prev);\n next.set(exposure.packTestInfo.id, exposure);\n }\n return next;\n });\n return;\n }\n\n // Consent granted: anything held from before it, then what fired here.\n const reported = commitExposures([\n [...(pendingExposureQueue?.values() ?? [])],\n triggered,\n ]);\n\n setTriggered([]);\n if (pendingExposureQueue?.size) setPendingExposureQueue?.(new Map());\n\n if (!reported) return;\n\n // Once per batch, not once per test.\n // TODO: This results in flashing of UI driven by site settings data.\n // Need non-flashing solution.\n // Delay revalidation to avoid v3_lazyRouteDiscovery race condition bug\n // See: https://github.com/remix-run/remix/issues/10263\n setTimeout(() => {\n revalidator?.revalidate();\n }, 750);\n }, [\n triggered,\n hasUserConsent,\n packIsPreviewMode,\n pendingExposureQueue,\n setPendingExposureQueue,\n commitExposures,\n revalidator,\n ]);\n\n // Consent arriving after the queue filled, with nothing newly triggered here.\n useEffect(() => {\n if (\n triggered.length ||\n !hasUserConsent ||\n packIsPreviewMode ||\n !pendingExposureQueue?.size\n ) {\n return;\n }\n\n commitExposures([[...pendingExposureQueue.values()]]);\n setPendingExposureQueue?.(new Map());\n }, [\n triggered,\n hasUserConsent,\n packIsPreviewMode,\n pendingExposureQueue,\n setPendingExposureQueue,\n commitExposures,\n ]);\n\n if (packIsPreviewMode) return null;\n\n return (\n <>\n {pendingTests.map((test) => (\n <TestImpression\n key={`${test.id}:${test.testVariant.id}`}\n test={test}\n impressionSelector={impressionSelector}\n onImpression={handleImpression}\n />\n ))}\n </>\n );\n};\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","import { createContext, useContext, Dispatch, SetStateAction } from \"react\";\n\nexport interface Test {\n id: string;\n handle: string;\n impressionTrigger?: string;\n testVariant: {\n id: string;\n handle: string;\n };\n impression?: {\n sectionIds?: string[];\n };\n}\n\ninterface TestExposureCallbackArg extends Test {\n exposureTime: number;\n}\n\ntype PackTestContextValue = {\n testExposureCallback?: (test: TestExposureCallbackArg) => void;\n hasUserConsent?: boolean | undefined;\n pendingExposureQueue?: Map<any, any>;\n setPendingExposureQueue?: Dispatch<SetStateAction<Map<any, any>>>;\n exposedExperiments?: Set<unknown>;\n};\n\nexport const PackTestContext = createContext<PackTestContextValue>({});\n\nexport const usePackTestContext = () => useContext(PackTestContext);\n","import React, { useState, PropsWithChildren } from \"react\";\nimport { useRouteLoaderData } from \"react-router\";\nimport { PackTestContext, Test } from \"./pack-test-context\";\n\ninterface PackContentProps {\n testExposureCallback?: (test: Test) => void;\n /**\n * Whether exposures may be reported. Defaults to the analytics consent the\n * server resolved (`packConsentAllowed` from `getPackContextData()`), and to\n * `false` when the root loader does not expose it.\n */\n hasUserConsent?: boolean;\n}\n\nfunction useServerAnalyticsConsent(): boolean | undefined {\n try {\n // @ts-ignore - the root loader's shape belongs to the theme, not to us\n const root = useRouteLoaderData(\"root\") as Record<string, any> | undefined;\n const allowed = root?.packConsentAllowed?.analytics;\n return typeof allowed === \"boolean\" ? allowed : undefined;\n } catch {\n // Rendered outside a data router.\n return undefined;\n }\n}\n\nexport function PackTestProvider({\n children,\n testExposureCallback,\n hasUserConsent: hasUserConsentProp,\n}: PropsWithChildren<PackContentProps>) {\n const serverConsent = useServerAnalyticsConsent();\n const hasUserConsent = hasUserConsentProp ?? serverConsent ?? false;\n const [pendingExposureQueue, setPendingExposureQueue] = useState(new Map());\n const [exposedExperiments] = useState(new Set());\n\n return (\n <PackTestContext.Provider\n value={{\n testExposureCallback: (test) => {\n testExposureCallback && testExposureCallback(test);\n },\n hasUserConsent,\n pendingExposureQueue,\n setPendingExposureQueue,\n exposedExperiments,\n }}\n >\n {children}\n </PackTestContext.Provider>\n );\n}\n","import { Test } from \"./test\";\nimport { useRouteLoaderData } from \"react-router\";\n\nconst warned = new Set<string>();\n\n/**\n * Whether this bundle was built for development.\n *\n * `process.env.NODE_ENV` must be written exactly like that. Bundlers replace\n * that literal string at build time, and that replacement is the only reason it\n * works at all here: the Oxygen worker defines no `process` global, so anything\n * evaluated at runtime finds nothing. `typeof process` is *not* replaced — a\n * guard written that way returns early on every request and silently disables\n * the warnings in the one environment they exist for. Verified against a running\n * dev server, where `typeof process` is `\"undefined\"` while the replaced literal\n * resolves correctly.\n *\n * The try/catch covers a bundle that performs no replacement at all, where the\n * bare reference would throw a ReferenceError inside render — `useAbTest` is\n * called from theme components, so that would take the page down.\n *\n * Evaluated once at module scope: it cannot change between renders, and a\n * production build folds it to `false` and drops the calls entirely.\n */\nconst IS_DEVELOPMENT = (() => {\n try {\n return process.env.NODE_ENV === \"development\";\n } catch {\n return false;\n }\n})();\n\n/**\n * Warn once per message, in development only.\n *\n * These paths never throw: a theme misconfiguration should degrade to control\n * content, not take the storefront down in render. So the signal has to be a\n * warning the developer sees while building.\n *\n * Fails silent everywhere else — opting out only of the literal `\"production\"`\n * would warn on every render of every production visitor holding two\n * assignments, which is exactly the population concurrent assignment creates.\n */\nfunction warnOnce(key: string, message: string): void {\n if (!IS_DEVELOPMENT) return;\n\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(message);\n}\n\n/**\n * Root loader data, or an empty object when the root route exposes none.\n *\n * Destructuring the hook's result directly throws a TypeError, which pre-empts\n * the deliberate errors below — and those name the actual cause, a root loader\n * that does not spread `getPackContextData()`.\n */\nfunction useRootPackData(): Record<string, any> {\n // @ts-ignore - the root loader's shape belongs to the theme, not to us\n return useRouteLoaderData(\"root\") ?? {};\n}\n\n/**\n * One test the visitor is bucketed into: given a handle, that specific test;\n * argless, the oldest assignment.\n *\n * Argless is **not** necessarily the test supplying content on this page. While a\n * visitor could hold only one test it was, so branching on `useAbTest()?.handle`\n * to choose variant markup was safe; a visitor can now hold several. Pass a\n * handle to name the test you mean, or use `useAbTests` for all of them.\n *\n * A handle matches on assignment, not on targeting: a test scoped to\n * `/products/` is still returned on other pages, where its CMS content is not\n * being served.\n */\nexport function useAbTest(testHandle?: string): Test | null {\n const { abTest, packAbTest, abTests, packAbTests } = useRootPackData();\n\n if (abTest === undefined && packAbTest === undefined) {\n throw new Error(\n \"ERR_HY_MISSING_AB_TEST_CONTEXT: No A/B test found, are you sure you have call ...pack.getPackContextData() on root loader return? Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_AB_TEST_CONTEXT\"\n );\n }\n\n if (testHandle) {\n const tests: Test[] | undefined = abTests || packAbTests;\n\n if (!tests) {\n // Distinguishes \"cannot tell\" from \"not in that test\" — both return null,\n // so without this a theme that never exposed the list would silently stop\n // rendering every variant.\n warnOnce(\n \"missing-ab-tests\",\n `[Pack Test] useAbTest(\"${testHandle}\") cannot tell which tests this visitor is in: the root loader exposes no test list. Spread ...pack.getPackContextData() into the root loader return. Returning null.`,\n );\n return null;\n }\n\n return tests.find((test) => test?.handle === testHandle) || null;\n }\n\n const assignments: Test[] = abTests || packAbTests || [];\n // Normalised to null: the signature promises `Test | null`, and the loose\n // read could yield undefined when only one of the two keys is present.\n const primary: Test | null = abTest || packAbTest || null;\n\n if (assignments.length > 1) {\n // Impossible before concurrent assignment, so a theme branching on the\n // unnamed form was previously always reading the test that supplied content.\n warnOnce(\n \"ambiguous-ab-test\",\n `[Pack Test] Read the oldest of ${assignments.length} assignments. A visitor can now be in several tests at once, so this may not be the test you mean — and because tests default to variant names like control/variant-b, a variant handle read this way can match a different test's arm. Pass a test handle, e.g. useAbTest(\"${primary?.handle}\") for the one just returned, or use useAbTests() for all of them.`,\n );\n }\n\n return primary;\n}\n\n/**\n * Every test the visitor is bucketed into, including ones whose targeting does\n * not match the current page.\n *\n * Returns [] on a theme that has not adopted the plural context field, rather\n * than throwing — `useAbTest` remains the compatibility surface.\n */\nexport function useAbTests(): Test[] {\n const { abTests, packAbTests } = useRootPackData();\n\n return abTests || packAbTests || [];\n}\n\nexport function useAbTestSessionId(): string {\n const { sessionId, packSessionId } = useRootPackData();\n\n if (!sessionId && !packSessionId) {\n throw new Error(\n \"ERR_HY_MISSING_SESSION_ID: No Session ID found, are you sure you have call ...pack.getPackContextData() on root loader return? Doc: https://docs.packdigital.com/err/ERR_HY_MISSING_SESSION_ID\"\n );\n }\n\n return sessionId || packSessionId;\n}\n\n/**\n * Each of these takes the same optional handle as `useAbTest`. Argless they read\n * the visitor's oldest assignment, which is only the test you mean if they hold\n * exactly one.\n *\n * `useAbTestVariantHandle` is the one that bites: new tests default to variants\n * named `control` and `variant-b`, so unless renamed an argless read can return\n * `\"variant-b\"` from one test while the test being branched on has the visitor in\n * `control` — variant markup shown to a control-arm visitor. Pass the handle of\n * the test being branched on.\n */\nexport function useAbTestId(testHandle?: string): string | undefined {\n return useAbTest(testHandle)?.id;\n}\n\nexport function useAbTestHandle(testHandle?: string): string | undefined {\n return useAbTest(testHandle)?.handle;\n}\n\nexport function useAbTestVariantId(testHandle?: string): string | undefined {\n return useAbTest(testHandle)?.testVariant?.id;\n}\n\nexport function useAbTestVariantHandle(\n testHandle?: string,\n): string | undefined {\n return useAbTest(testHandle)?.testVariant?.handle;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAcA,YAAQ,QAAQA;AAChB,YAAQ,YAAYC;AAOpB,QAAI,aAAa,OAAO,UAAU;AAClC,QAAI,mBAAmB,OAAO,UAAU;AAcxC,QAAI,mBAAmB;AAYvB,QAAI,oBAAoB;AA0BxB,QAAI,oBAAoB;AAUxB,QAAI,kBAAkB;AActB,aAASD,OAAM,KAAK,KAAK;AACvB,UAAI,OAAO,QAAQ,UAAU;AAC3B,cAAM,IAAI,UAAU,+BAA+B;AAAA,MACrD;AAEA,UAAI,MAAM,CAAC;AACX,UAAI,MAAM,IAAI;AAEd,UAAI,MAAM,EAAG,QAAO;AAEpB,UAAI,MAAO,OAAO,IAAI,UAAW;AACjC,UAAI,QAAQ;AACZ,UAAI,QAAQ;AACZ,UAAI,SAAS;AAEb,SAAG;AACD,gBAAQ,IAAI,QAAQ,KAAK,KAAK;AAC9B,YAAI,UAAU,GAAI;AAElB,iBAAS,IAAI,QAAQ,KAAK,KAAK;AAE/B,YAAI,WAAW,IAAI;AACjB,mBAAS;AAAA,QACX,WAAW,QAAQ,QAAQ;AAEzB,kBAAQ,IAAI,YAAY,KAAK,QAAQ,CAAC,IAAI;AAC1C;AAAA,QACF;AAEA,YAAI,cAAc,WAAW,KAAK,OAAO,KAAK;AAC9C,YAAI,YAAY,SAAS,KAAK,OAAO,WAAW;AAChD,YAAI,MAAM,IAAI,MAAM,aAAa,SAAS;AAG1C,YAAI,CAAC,iBAAiB,KAAK,KAAK,GAAG,GAAG;AACpC,cAAI,cAAc,WAAW,KAAK,QAAQ,GAAG,MAAM;AACnD,cAAI,YAAY,SAAS,KAAK,QAAQ,WAAW;AAEjD,cAAI,IAAI,WAAW,WAAW,MAAM,MAAgB,IAAI,WAAW,YAAY,CAAC,MAAM,IAAc;AAClG;AACA;AAAA,UACF;AAEA,cAAI,MAAM,IAAI,MAAM,aAAa,SAAS;AAC1C,cAAI,GAAG,IAAI,UAAU,KAAK,GAAG;AAAA,QAC/B;AAEA,gBAAQ,SAAS;AAAA,MACnB,SAAS,QAAQ;AAEjB,aAAO;AAAA,IACT;AAEA,aAAS,WAAW,KAAK,OAAO,KAAK;AACnC,SAAG;AACD,YAAI,OAAO,IAAI,WAAW,KAAK;AAC/B,YAAI,SAAS,MAAgB,SAAS,EAAe,QAAO;AAAA,MAC9D,SAAS,EAAE,QAAQ;AACnB,aAAO;AAAA,IACT;AAEA,aAAS,SAAS,KAAK,OAAO,KAAK;AACjC,aAAO,QAAQ,KAAK;AAClB,YAAI,OAAO,IAAI,WAAW,EAAE,KAAK;AACjC,YAAI,SAAS,MAAgB,SAAS,EAAe,QAAO,QAAQ;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AAkBA,aAASC,WAAU,MAAM,KAAK,KAAK;AACjC,UAAI,MAAO,OAAO,IAAI,UAAW;AAEjC,UAAI,OAAO,QAAQ,YAAY;AAC7B,cAAM,IAAI,UAAU,0BAA0B;AAAA,MAChD;AAEA,UAAI,CAAC,iBAAiB,KAAK,IAAI,GAAG;AAChC,cAAM,IAAI,UAAU,0BAA0B;AAAA,MAChD;AAEA,UAAI,QAAQ,IAAI,GAAG;AAEnB,UAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;AAClC,cAAM,IAAI,UAAU,yBAAyB;AAAA,MAC/C;AAEA,UAAI,MAAM,OAAO,MAAM;AACvB,UAAI,CAAC,IAAK,QAAO;AAEjB,UAAI,QAAQ,IAAI,QAAQ;AACtB,YAAI,SAAS,KAAK,MAAM,IAAI,MAAM;AAElC,YAAI,CAAC,SAAS,MAAM,GAAG;AACrB,gBAAM,IAAI,UAAU,0BAA0B;AAAA,QAChD;AAEA,eAAO,eAAe;AAAA,MACxB;AAEA,UAAI,IAAI,QAAQ;AACd,YAAI,CAAC,kBAAkB,KAAK,IAAI,MAAM,GAAG;AACvC,gBAAM,IAAI,UAAU,0BAA0B;AAAA,QAChD;AAEA,eAAO,cAAc,IAAI;AAAA,MAC3B;AAEA,UAAI,IAAI,MAAM;AACZ,YAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,GAAG;AACnC,gBAAM,IAAI,UAAU,wBAAwB;AAAA,QAC9C;AAEA,eAAO,YAAY,IAAI;AAAA,MACzB;AAEA,UAAI,IAAI,SAAS;AACf,YAAI,UAAU,IAAI;AAElB,YAAI,CAAC,OAAO,OAAO,KAAK,MAAM,QAAQ,QAAQ,CAAC,GAAG;AAChD,gBAAM,IAAI,UAAU,2BAA2B;AAAA,QACjD;AAEA,eAAO,eAAe,QAAQ,YAAY;AAAA,MAC5C;AAEA,UAAI,IAAI,UAAU;AAChB,eAAO;AAAA,MACT;AAEA,UAAI,IAAI,QAAQ;AACd,eAAO;AAAA,MACT;AAEA,UAAI,IAAI,aAAa;AACnB,eAAO;AAAA,MACT;AAEA,UAAI,IAAI,UAAU;AAChB,YAAI,WAAW,OAAO,IAAI,aAAa,WACnC,IAAI,SAAS,YAAY,IAAI,IAAI;AAErC,gBAAQ,UAAU;AAAA,UAChB,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF;AACE,kBAAM,IAAI,UAAU,4BAA4B;AAAA,QACpD;AAAA,MACF;AAEA,UAAI,IAAI,UAAU;AAChB,YAAI,WAAW,OAAO,IAAI,aAAa,WACnC,IAAI,SAAS,YAAY,IAAI,IAAI;AAErC,gBAAQ,UAAU;AAAA,UAChB,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF;AACE,kBAAM,IAAI,UAAU,4BAA4B;AAAA,QACpD;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AASA,aAAS,OAAQ,KAAK;AACpB,aAAO,IAAI,QAAQ,GAAG,MAAM,KACxB,mBAAmB,GAAG,IACtB;AAAA,IACN;AASA,aAAS,OAAQ,KAAK;AACpB,aAAO,WAAW,KAAK,GAAG,MAAM;AAAA,IAClC;AAUA,aAAS,UAAU,KAAKC,SAAQ;AAC9B,UAAI;AACF,eAAOA,QAAO,GAAG;AAAA,MACnB,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC9UA;AAAA;AAAA;AAUA,KAAC,SAAUC,SAAQC,YAAW;AAE1B;AAOA,UAAI,aAAc,UACd,QAAc,IACd,UAAc,KACd,YAAc,YACd,aAAc,aACd,WAAc,UACd,WAAc,UACd,QAAc,SACd,QAAc,SACd,OAAc,QACd,OAAc,QACd,SAAc,UACd,UAAc,WACd,eAAc,gBACd,UAAc,WACd,SAAc,UACd,SAAc,UACd,UAAc,WACd,WAAc,YACd,WAAc,YACd,gBAAgB;AAEpB,UAAI,SAAU,UACV,QAAU,SACV,OAAU,QACV,aAAa,cACb,UAAU,WACV,SAAU,UACV,OAAU,QACV,UAAU,WACV,SAAU,UACV,SAAU,UACV,KAAU,MACV,YAAY,aACZ,WAAY,YACZ,QAAU,SACV,UAAU,WACV,QAAU,SACV,OAAU,QACV,SAAU,UACV,QAAU,SACV,WAAc,YACd,cAAc,eACd,SAAU;AAMd,UAAI,SAAS,SAAUC,UAAS,YAAY;AACpC,YAAI,gBAAgB,CAAC;AACrB,iBAAS,KAAKA,UAAS;AACnB,cAAI,WAAW,CAAC,KAAK,WAAW,CAAC,EAAE,SAAS,MAAM,GAAG;AACjD,0BAAc,CAAC,IAAI,WAAW,CAAC,EAAE,OAAOA,SAAQ,CAAC,CAAC;AAAA,UACtD,OAAO;AACH,0BAAc,CAAC,IAAIA,SAAQ,CAAC;AAAA,UAChC;AAAA,QACJ;AACA,eAAO;AAAA,MACX,GACA,YAAY,SAAU,KAAK;AACvB,YAAI,QAAQ,CAAC;AACb,iBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC7B,gBAAM,IAAI,CAAC,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC;AAAA,QACvC;AACA,eAAO;AAAA,MACX,GACA,MAAM,SAAU,MAAM,MAAM;AACxB,eAAO,OAAO,SAAS,WAAW,SAAS,IAAI,EAAE,QAAQ,SAAS,IAAI,CAAC,MAAM,KAAK;AAAA,MACtF,GACA,WAAW,SAAU,KAAK;AACtB,eAAO,IAAI,YAAY;AAAA,MAC3B,GACA,WAAW,SAAU,SAAS;AAC1B,eAAO,OAAO,YAAa,WAAW,QAAQ,QAAQ,YAAY,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,IAAID;AAAA,MAC7F,GACA,OAAO,SAAU,KAAK,KAAK;AACvB,YAAI,OAAO,QAAS,UAAU;AAC1B,gBAAM,IAAI,QAAQ,UAAU,KAAK;AACjC,iBAAO,OAAO,QAAS,aAAa,MAAM,IAAI,UAAU,GAAG,aAAa;AAAA,QAC5E;AAAA,MACR;AAMA,UAAI,YAAY,SAAU,IAAI,QAAQ;AAE9B,YAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS;AAGhC,eAAO,IAAI,OAAO,UAAU,CAAC,SAAS;AAElC,cAAI,QAAQ,OAAO,CAAC,GAChB,QAAQ,OAAO,IAAI,CAAC;AACxB,cAAI,IAAI;AAGR,iBAAO,IAAI,MAAM,UAAU,CAAC,SAAS;AAEjC,gBAAI,CAAC,MAAM,CAAC,GAAG;AAAE;AAAA,YAAO;AACxB,sBAAU,MAAM,GAAG,EAAE,KAAK,EAAE;AAE5B,gBAAI,CAAC,CAAC,SAAS;AACX,mBAAK,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC/B,wBAAQ,QAAQ,EAAE,CAAC;AACnB,oBAAI,MAAM,CAAC;AAEX,oBAAI,OAAO,MAAM,YAAY,EAAE,SAAS,GAAG;AACvC,sBAAI,EAAE,WAAW,GAAG;AAChB,wBAAI,OAAO,EAAE,CAAC,KAAK,WAAW;AAE1B,2BAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM,KAAK;AAAA,oBACtC,OAAO;AAEH,2BAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,oBACpB;AAAA,kBACJ,WAAW,EAAE,WAAW,GAAG;AAEvB,wBAAI,OAAO,EAAE,CAAC,MAAM,aAAa,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO;AAExD,2BAAK,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,IAAIA;AAAA,oBACxD,OAAO;AAEH,2BAAK,EAAE,CAAC,CAAC,IAAI,QAAQ,MAAM,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAIA;AAAA,oBACrD;AAAA,kBACJ,WAAW,EAAE,WAAW,GAAG;AACnB,yBAAK,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,KAAK,MAAM,MAAM,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAIA;AAAA,kBAC1E;AAAA,gBACJ,OAAO;AACH,uBAAK,CAAC,IAAI,QAAQ,QAAQA;AAAA,gBAC9B;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AACA,eAAK;AAAA,QACT;AAAA,MACJ,GAEA,YAAY,SAAU,KAAK,KAAK;AAE5B,iBAAS,KAAK,KAAK;AAEf,cAAI,OAAO,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG;AACjD,qBAAS,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,QAAQ,KAAK;AACpC,kBAAI,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG;AACrB,uBAAQ,MAAM,UAAWA,aAAY;AAAA,cACzC;AAAA,YACJ;AAAA,UACJ,WAAW,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG;AACzB,mBAAQ,MAAM,UAAWA,aAAY;AAAA,UACzC;AAAA,QACJ;AACA,eAAO;AAAA,MACf;AAOA,UAAI,eAAe;AAAA,QACX,OAAU;AAAA,QACV,OAAU;AAAA,QACV,OAAU;AAAA,QACV,OAAU;AAAA,QACV,SAAU;AAAA,QACV,SAAU;AAAA,QACV,SAAU;AAAA,QACV,KAAU;AAAA,MACd,GACA,oBAAoB;AAAA,QAChB,MAAc;AAAA,QACd,WAAc;AAAA,QACd,UAAc;AAAA,QACd,QAAc;AAAA,QACd,MAAc,CAAC,UAAU,QAAQ;AAAA,QACjC,SAAc;AAAA,QACd,KAAc;AAAA,QACd,KAAc;AAAA,QACd,OAAc;AAAA,QACd,MAAc,CAAC,UAAU,SAAS;AAAA,QAClC,MAAc;AAAA,MACtB;AAMA,UAAI,UAAU;AAAA,QAEV,SAAU;AAAA,UAAC;AAAA,YAEP;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAChC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9B;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACrC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;AAAA,UAAG;AAAA;AAAA,YAG7B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/B;AAAA;AAAA,YACA;AAAA;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA;AAAA,YAGA;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAK,OAAO,CAAC;AAAA,UAAG;AAAA,YACpC;AAAA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAChC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,WAAW,CAAC;AAAA,UAAG;AAAA,YACnC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,UAAG;AAAA,YAC5B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAChC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,kBAAgB,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,QAAQ,eAAa,OAAO,GAAG,OAAO;AAAA,UAAG;AAAA,YACpD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAQ,QAAQ,CAAC;AAAA,UAAG;AAAA,YACxC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YACtC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC;AAAA,UAAG;AAAA,YACjC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC;AAAA,UAAG;AAAA,YACjC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YACtC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAQ,OAAO,CAAC;AAAA,UAAG;AAAA,YACvC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,SAAS,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/B;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG,OAAO;AAAA,UAAG;AAAA;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAU,WAAW,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,MAAM,GAAG,GAAG,OAAO;AAAA,UAAG;AAAA,YACjC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC;AAAA,UAAG;AAAA,YACxC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,cAAc,GAAG,OAAO;AAAA,UAAG;AAAA,YACtC;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,IAAI;AAAA,UAAG;AAAA;AAAA,YAGX;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,QAAQ,GAAG,OAAO;AAAA,UAAG;AAAA,YAChC;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;AAAA,UAAG;AAAA,YAC7B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAEhC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAO,WAAW,CAAC;AAAA,UAAG;AAAA,YAE1C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,SAAO,UAAU,GAAG,OAAO;AAAA,UAAG;AAAA,YAEzC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,aAAW,OAAO,CAAC;AAAA,UAAG;AAAA,YAE1C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YAEpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,eAAe,CAAC;AAAA,UAAG;AAAA,YACvC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,IAAI;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,CAAC,SAAS,WAAW,YAAY,CAAC;AAAA,UAAG;AAAA,YAE/C;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA;AAAA,YAGpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,UAAU,GAAG,OAAO;AAAA,UAAG;AAAA,YAClC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAQ,UAAU,CAAC;AAAA,UAAG;AAAA,YAC1C;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA;AAAA,YAGA;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YAEpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,CAAC,SAAS,gBAAgB,EAAE,CAAC;AAAA,QAC3C;AAAA,QAEA,KAAM;AAAA,UAAC;AAAA,YAEH;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,OAAO,CAAC;AAAA,UAAG;AAAA,YAE9B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,QAAQ,CAAC;AAAA,UAAG;AAAA,YAE/B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,MAAM,CAAC;AAAA,UAAG;AAAA,YAE7B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,OAAO,CAAC;AAAA,UAAG;AAAA,YAE9B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,OAAO,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9B;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,KAAK,CAAC;AAAA,UAAG;AAAA,YAE5B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,QAAQ,OAAO,QAAQ,CAAC;AAAA,UAAG;AAAA,YAE9C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,cAAc,OAAO,CAAC;AAAA,UAAG;AAAA,YAE9B;AAAA;AAAA,UAEA;AAAA,UAAG,CAAC,CAAC,cAAc,QAAQ,CAAC;AAAA,QAChC;AAAA,QAEA,QAAS;AAAA,UAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAON;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC;AAAA,UAAG;AAAA;AAAA,YAG7B;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG7C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9C;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,MAAM,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC3D;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAE,CAAC,CAAC,OAAO,MAAM,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG1D;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9C;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGhD;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAChD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGhD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC1C;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG1C;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGhD;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,MAAM,GAAG,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG5D;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC5C;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,eAAe,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG/D;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGjD;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,SAAS,eAAe,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG1E;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACpC;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGlD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC5C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG5C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA;AAAA,YAGA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,CAAC,OAAO,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGjD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG9C;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAG/C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA,YAGjD;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAEpC;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAEpC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACjD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACnD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACjD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACjD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,gBAAgB,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACxD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAClD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC9C;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,QAAQ,cAAc,GAAG,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACtD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAClD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAClD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACnD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACjD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACnD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAChD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACpC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,OAAO,GAAG,GAAG,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC/D;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA;AAAA;AAAA;AAAA,YAM7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC9B;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,KAAK,SAAS,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAClE;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACpC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,CAAC,OAAO,QAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACpD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,OAAO,SAAO,MAAM,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAChE;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAE;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACrC;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACrD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA;AAAA;AAAA;AAAA,YAMtB;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACrC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YACjD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC7C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA;AAAA;AAAA;AAAA,YAMlD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YACtC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAChD;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAC/C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA;AAAA;AAAA;AAAA,YAMlD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA,YAC/B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC;AAAA,UAAG;AAAA;AAAA;AAAA;AAAA,YAMhD;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC5B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YAC5B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACrB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,MAAM,CAAC;AAAA,UAAG;AAAA,YACrB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,OAAO,CAAC,QAAQ,SAAS,CAAC;AAAA,QAClC;AAAA,QAEA,QAAS;AAAA,UAAC;AAAA,YAEN;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAK,MAAM,CAAC;AAAA,UAAG;AAAA,YAEnC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAE/B;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YAEpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,IAAI;AAAA,QACrB;AAAA,QAEA,IAAK;AAAA,UAAC;AAAA;AAAA,YAGF;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,CAAC,SAAS,WAAW,iBAAiB,CAAC;AAAA,UAAG;AAAA,YACpD;AAAA;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,SAAS,WAAW,iBAAiB,GAAG,CAAC,MAAM,SAAS,CAAC;AAAA,UAAG;AAAA;AAAA,YAGjE;AAAA;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC;AAAA,UAAG;AAAA,YAC1C;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC;AAAA,UAAG;AAAA;AAAA,YAG3C;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,IAAI;AAAA,UAAG;AAAA;AAAA,YACpB;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC;AAAA,UAAG;AAAA,YAClC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC;AAAA,UAAG;AAAA,YACjC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,UAAQ,KAAK,CAAC;AAAA,UAAG;AAAA,YACrC;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC;AAAA,UAAG;AAAA,YAC/B;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC;AAAA,UAAG;AAAA;AAAA,YAGjC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,SAAS,CAAC,MAAM,SAAO,MAAM,CAAC;AAAA,UAAG;AAAA,YACrC;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,WAAW,GAAG,OAAO;AAAA,UAAE;AAAA;AAAA,YAGlC;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA;AAAA,YAGA;AAAA;AAAA,YACA;AAAA;AAAA;AAAA,YAGA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,UAAG;AAAA,YACpB;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,CAAC,MAAM,SAAS,GAAG,OAAO;AAAA,UAAG;AAAA,YACjC;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,UACA;AAAA,UAAG,CAAC,MAAM,OAAO;AAAA,QACrB;AAAA,MACJ;AAMA,UAAI,WAAW,SAAU,IAAI,YAAY;AAErC,YAAI,OAAO,OAAO,UAAU;AACxB,uBAAa;AACb,eAAKA;AAAA,QACT;AAEA,YAAI,EAAE,gBAAgB,WAAW;AAC7B,iBAAO,IAAI,SAAS,IAAI,UAAU,EAAE,UAAU;AAAA,QAClD;AAEA,YAAI,aAAc,OAAOD,YAAW,cAAcA,QAAO,YAAaA,QAAO,YAAYC;AACzF,YAAI,MAAM,OAAQ,cAAc,WAAW,YAAa,WAAW,YAAY;AAC/E,YAAI,QAAS,cAAc,WAAW,gBAAiB,WAAW,gBAAgBA;AAClF,YAAI,UAAU,aAAa,OAAO,SAAS,UAAU,IAAI;AACzD,YAAI,aAAa,cAAc,WAAW,aAAa;AAEvD,aAAK,aAAa,WAAY;AAC1B,cAAI,WAAW,CAAC;AAChB,mBAAS,IAAI,IAAIA;AACjB,mBAAS,OAAO,IAAIA;AACpB,oBAAU,KAAK,UAAU,KAAK,QAAQ,OAAO;AAC7C,mBAAS,KAAK,IAAI,SAAS,SAAS,OAAO,CAAC;AAE5C,cAAI,cAAc,cAAc,WAAW,SAAS,OAAO,WAAW,MAAM,WAAW,WAAW;AAC9F,qBAAS,IAAI,IAAI;AAAA,UACrB;AACA,iBAAO;AAAA,QACX;AACA,aAAK,SAAS,WAAY;AACtB,cAAI,OAAO,CAAC;AACZ,eAAK,YAAY,IAAIA;AACrB,oBAAU,KAAK,MAAM,KAAK,QAAQ,GAAG;AACrC,iBAAO;AAAA,QACX;AACA,aAAK,YAAY,WAAY;AACzB,cAAI,UAAU,CAAC;AACf,kBAAQ,MAAM,IAAIA;AAClB,kBAAQ,KAAK,IAAIA;AACjB,kBAAQ,IAAI,IAAIA;AAChB,oBAAU,KAAK,SAAS,KAAK,QAAQ,MAAM;AAC3C,cAAI,cAAc,CAAC,QAAQ,IAAI,KAAK,SAAS,MAAM,QAAQ;AACvD,oBAAQ,IAAI,IAAI;AAAA,UACpB;AAEA,cAAI,cAAc,QAAQ,KAAK,KAAK,eAAe,cAAc,OAAO,WAAW,eAAe,cAAc,WAAW,kBAAkB,WAAW,iBAAiB,GAAG;AACxK,oBAAQ,KAAK,IAAI;AACjB,oBAAQ,IAAI,IAAI;AAAA,UACpB;AACA,iBAAO;AAAA,QACX;AACA,aAAK,YAAY,WAAY;AACzB,cAAI,UAAU,CAAC;AACf,kBAAQ,IAAI,IAAIA;AAChB,kBAAQ,OAAO,IAAIA;AACnB,oBAAU,KAAK,SAAS,KAAK,QAAQ,MAAM;AAC3C,iBAAO;AAAA,QACX;AACA,aAAK,QAAQ,WAAY;AACrB,cAAI,MAAM,CAAC;AACX,cAAI,IAAI,IAAIA;AACZ,cAAI,OAAO,IAAIA;AACf,oBAAU,KAAK,KAAK,KAAK,QAAQ,EAAE;AACnC,cAAI,cAAc,CAAC,IAAI,IAAI,KAAK,SAAS,MAAM,YAAY,WAAW;AAClE,gBAAI,IAAI,IAAI,MAAM,SACG,QAAQ,cAAc,WAAW,EACjC,QAAQ,UAAU,MAAM;AAAA,UACjD;AACA,iBAAO;AAAA,QACX;AACA,aAAK,YAAY,WAAY;AACzB,iBAAO;AAAA,YACH,IAAU,KAAK,MAAM;AAAA,YACrB,SAAU,KAAK,WAAW;AAAA,YAC1B,QAAU,KAAK,UAAU;AAAA,YACzB,IAAU,KAAK,MAAM;AAAA,YACrB,QAAU,KAAK,UAAU;AAAA,YACzB,KAAU,KAAK,OAAO;AAAA,UAC1B;AAAA,QACJ;AACA,aAAK,QAAQ,WAAY;AACrB,iBAAO;AAAA,QACX;AACA,aAAK,QAAQ,SAAUE,KAAI;AACvB,gBAAO,OAAOA,QAAO,YAAYA,IAAG,SAAS,gBAAiB,KAAKA,KAAI,aAAa,IAAIA;AACxF,iBAAO;AAAA,QACX;AACA,aAAK,MAAM,GAAG;AACd,eAAO;AAAA,MACX;AAEA,eAAS,UAAU;AACnB,eAAS,UAAW,UAAU,CAAC,MAAM,SAAS,KAAK,CAAC;AACpD,eAAS,MAAM,UAAU,CAAC,YAAY,CAAC;AACvC,eAAS,SAAS,UAAU,CAAC,OAAO,QAAQ,MAAM,SAAS,QAAQ,SAAS,QAAQ,UAAU,QAAQ,CAAC;AACvG,eAAS,SAAS,SAAS,KAAK,UAAU,CAAC,MAAM,OAAO,CAAC;AAOzD,UAAI,OAAO,YAAa,YAAY;AAEhC,YAAI,OAAO,WAAW,cAAc,OAAO,SAAS;AAChD,oBAAU,OAAO,UAAU;AAAA,QAC/B;AACA,gBAAQ,WAAW;AAAA,MACvB,OAAO;AAEH,YAAI,OAAO,WAAY,aAAa,OAAO,KAAK;AAC5C,iBAAO,WAAY;AACf,mBAAO;AAAA,UACX,CAAC;AAAA,QACL,WAAW,OAAOH,YAAW,YAAY;AAErC,UAAAA,QAAO,WAAW;AAAA,QACtB;AAAA,MACJ;AAOA,UAAI,IAAI,OAAOA,YAAW,eAAeA,QAAO,UAAUA,QAAO;AACjE,UAAI,KAAK,CAAC,EAAE,IAAI;AACZ,YAAII,UAAS,IAAI,SAAS;AAC1B,UAAE,KAAKA,QAAO,UAAU;AACxB,UAAE,GAAG,MAAM,WAAY;AACnB,iBAAOA,QAAO,MAAM;AAAA,QACxB;AACA,UAAE,GAAG,MAAM,SAAU,IAAI;AACrB,UAAAA,QAAO,MAAM,EAAE;AACf,cAAI,SAASA,QAAO,UAAU;AAC9B,mBAAS,QAAQ,QAAQ;AACrB,cAAE,GAAG,IAAI,IAAI,OAAO,IAAI;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAAA,IAEJ,GAAG,OAAO,WAAW,WAAW,SAAS,OAAI;AAAA;AAAA;;;ACj7B7C;AAAA;AAAA;AAIA,QAAI,IAAI;AACR,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AAgBZ,WAAO,UAAU,SAAU,KAAK,SAAS;AACvC,gBAAU,WAAW,CAAC;AACtB,UAAI,OAAO,OAAO;AAClB,UAAI,SAAS,YAAY,IAAI,SAAS,GAAG;AACvC,eAAOC,OAAM,GAAG;AAAA,MAClB,WAAW,SAAS,YAAY,SAAS,GAAG,GAAG;AAC7C,eAAO,QAAQ,OAAO,QAAQ,GAAG,IAAI,SAAS,GAAG;AAAA,MACnD;AACA,YAAM,IAAI;AAAA,QACR,0DACE,KAAK,UAAU,GAAG;AAAA,MACtB;AAAA,IACF;AAUA,aAASA,OAAM,KAAK;AAClB,YAAM,OAAO,GAAG;AAChB,UAAI,IAAI,SAAS,KAAK;AACpB;AAAA,MACF;AACA,UAAI,QAAQ,mIAAmI;AAAA,QAC7I;AAAA,MACF;AACA,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,UAAI,IAAI,WAAW,MAAM,CAAC,CAAC;AAC3B,UAAI,QAAQ,MAAM,CAAC,KAAK,MAAM,YAAY;AAC1C,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAUA,aAAS,SAAS,IAAI;AACpB,UAAI,QAAQ,KAAK,IAAI,EAAE;AACvB,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,aAAO,KAAK;AAAA,IACd;AAUA,aAAS,QAAQ,IAAI;AACnB,UAAI,QAAQ,KAAK,IAAI,EAAE;AACvB,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,KAAK;AAAA,MACnC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,MAAM;AAAA,MACpC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,QAAQ;AAAA,MACtC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,QAAQ;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,IACd;AAMA,aAAS,OAAO,IAAI,OAAO,GAAG,MAAM;AAClC,UAAI,WAAW,SAAS,IAAI;AAC5B,aAAO,KAAK,MAAM,KAAK,CAAC,IAAI,MAAM,QAAQ,WAAW,MAAM;AAAA,IAC7D;AAAA;AAAA;;;ACjKA;AAAA;AAAA;AAMA,aAAS,MAAM,KAAK;AACnB,MAAAC,aAAY,QAAQA;AACpB,MAAAA,aAAY,UAAUA;AACtB,MAAAA,aAAY,SAAS;AACrB,MAAAA,aAAY,UAAU;AACtB,MAAAA,aAAY,SAAS;AACrB,MAAAA,aAAY,UAAU;AACtB,MAAAA,aAAY,WAAW;AACvB,MAAAA,aAAY,UAAU;AAEtB,aAAO,KAAK,GAAG,EAAE,QAAQ,SAAO;AAC/B,QAAAA,aAAY,GAAG,IAAI,IAAI,GAAG;AAAA,MAC3B,CAAC;AAMD,MAAAA,aAAY,QAAQ,CAAC;AACrB,MAAAA,aAAY,QAAQ,CAAC;AAOrB,MAAAA,aAAY,aAAa,CAAC;AAQ1B,eAAS,YAAY,WAAW;AAC/B,YAAI,OAAO;AAEX,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,kBAAS,QAAQ,KAAK,OAAQ,UAAU,WAAW,CAAC;AACpD,kBAAQ;AAAA,QACT;AAEA,eAAOA,aAAY,OAAO,KAAK,IAAI,IAAI,IAAIA,aAAY,OAAO,MAAM;AAAA,MACrE;AACA,MAAAA,aAAY,cAAc;AAS1B,eAASA,aAAY,WAAW;AAC/B,YAAI;AACJ,YAAI,iBAAiB;AACrB,YAAI;AACJ,YAAI;AAEJ,iBAASC,UAAS,MAAM;AAEvB,cAAI,CAACA,OAAM,SAAS;AACnB;AAAA,UACD;AAEA,gBAAM,OAAOA;AAGb,gBAAM,OAAO,OAAO,oBAAI,KAAK,CAAC;AAC9B,gBAAM,KAAK,QAAQ,YAAY;AAC/B,eAAK,OAAO;AACZ,eAAK,OAAO;AACZ,eAAK,OAAO;AACZ,qBAAW;AAEX,eAAK,CAAC,IAAID,aAAY,OAAO,KAAK,CAAC,CAAC;AAEpC,cAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAEhC,iBAAK,QAAQ,IAAI;AAAA,UAClB;AAGA,cAAI,QAAQ;AACZ,eAAK,CAAC,IAAI,KAAK,CAAC,EAAE,QAAQ,iBAAiB,CAAC,OAAO,WAAW;AAE7D,gBAAI,UAAU,MAAM;AACnB,qBAAO;AAAA,YACR;AACA;AACA,kBAAM,YAAYA,aAAY,WAAW,MAAM;AAC/C,gBAAI,OAAO,cAAc,YAAY;AACpC,oBAAM,MAAM,KAAK,KAAK;AACtB,sBAAQ,UAAU,KAAK,MAAM,GAAG;AAGhC,mBAAK,OAAO,OAAO,CAAC;AACpB;AAAA,YACD;AACA,mBAAO;AAAA,UACR,CAAC;AAGD,UAAAA,aAAY,WAAW,KAAK,MAAM,IAAI;AAEtC,gBAAM,QAAQ,KAAK,OAAOA,aAAY;AACtC,gBAAM,MAAM,MAAM,IAAI;AAAA,QACvB;AAEA,QAAAC,OAAM,YAAY;AAClB,QAAAA,OAAM,YAAYD,aAAY,UAAU;AACxC,QAAAC,OAAM,QAAQD,aAAY,YAAY,SAAS;AAC/C,QAAAC,OAAM,SAAS;AACf,QAAAA,OAAM,UAAUD,aAAY;AAE5B,eAAO,eAAeC,QAAO,WAAW;AAAA,UACvC,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,KAAK,MAAM;AACV,gBAAI,mBAAmB,MAAM;AAC5B,qBAAO;AAAA,YACR;AACA,gBAAI,oBAAoBD,aAAY,YAAY;AAC/C,gCAAkBA,aAAY;AAC9B,6BAAeA,aAAY,QAAQ,SAAS;AAAA,YAC7C;AAEA,mBAAO;AAAA,UACR;AAAA,UACA,KAAK,OAAK;AACT,6BAAiB;AAAA,UAClB;AAAA,QACD,CAAC;AAGD,YAAI,OAAOA,aAAY,SAAS,YAAY;AAC3C,UAAAA,aAAY,KAAKC,MAAK;AAAA,QACvB;AAEA,eAAOA;AAAA,MACR;AAEA,eAAS,OAAO,WAAW,WAAW;AACrC,cAAM,WAAWD,aAAY,KAAK,aAAa,OAAO,cAAc,cAAc,MAAM,aAAa,SAAS;AAC9G,iBAAS,MAAM,KAAK;AACpB,eAAO;AAAA,MACR;AASA,eAAS,OAAO,YAAY;AAC3B,QAAAA,aAAY,KAAK,UAAU;AAC3B,QAAAA,aAAY,aAAa;AAEzB,QAAAA,aAAY,QAAQ,CAAC;AACrB,QAAAA,aAAY,QAAQ,CAAC;AAErB,cAAM,SAAS,OAAO,eAAe,WAAW,aAAa,IAC3D,KAAK,EACL,QAAQ,QAAQ,GAAG,EACnB,MAAM,GAAG,EACT,OAAO,OAAO;AAEhB,mBAAW,MAAM,OAAO;AACvB,cAAI,GAAG,CAAC,MAAM,KAAK;AAClB,YAAAA,aAAY,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,UACnC,OAAO;AACN,YAAAA,aAAY,MAAM,KAAK,EAAE;AAAA,UAC1B;AAAA,QACD;AAAA,MACD;AAUA,eAAS,gBAAgB,QAAQ,UAAU;AAC1C,YAAI,cAAc;AAClB,YAAI,gBAAgB;AACpB,YAAI,YAAY;AAChB,YAAI,aAAa;AAEjB,eAAO,cAAc,OAAO,QAAQ;AACnC,cAAI,gBAAgB,SAAS,WAAW,SAAS,aAAa,MAAM,OAAO,WAAW,KAAK,SAAS,aAAa,MAAM,MAAM;AAE5H,gBAAI,SAAS,aAAa,MAAM,KAAK;AACpC,0BAAY;AACZ,2BAAa;AACb;AAAA,YACD,OAAO;AACN;AACA;AAAA,YACD;AAAA,UACD,WAAW,cAAc,IAAI;AAE5B,4BAAgB,YAAY;AAC5B;AACA,0BAAc;AAAA,UACf,OAAO;AACN,mBAAO;AAAA,UACR;AAAA,QACD;AAGA,eAAO,gBAAgB,SAAS,UAAU,SAAS,aAAa,MAAM,KAAK;AAC1E;AAAA,QACD;AAEA,eAAO,kBAAkB,SAAS;AAAA,MACnC;AAQA,eAAS,UAAU;AAClB,cAAM,aAAa;AAAA,UAClB,GAAGA,aAAY;AAAA,UACf,GAAGA,aAAY,MAAM,IAAI,eAAa,MAAM,SAAS;AAAA,QACtD,EAAE,KAAK,GAAG;AACV,QAAAA,aAAY,OAAO,EAAE;AACrB,eAAO;AAAA,MACR;AASA,eAAS,QAAQ,MAAM;AACtB,mBAAW,QAAQA,aAAY,OAAO;AACrC,cAAI,gBAAgB,MAAM,IAAI,GAAG;AAChC,mBAAO;AAAA,UACR;AAAA,QACD;AAEA,mBAAW,MAAMA,aAAY,OAAO;AACnC,cAAI,gBAAgB,MAAM,EAAE,GAAG;AAC9B,mBAAO;AAAA,UACR;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AASA,eAAS,OAAO,KAAK;AACpB,YAAI,eAAe,OAAO;AACzB,iBAAO,IAAI,SAAS,IAAI;AAAA,QACzB;AACA,eAAO;AAAA,MACR;AAMA,eAAS,UAAU;AAClB,gBAAQ,KAAK,uIAAuI;AAAA,MACrJ;AAEA,MAAAA,aAAY,OAAOA,aAAY,KAAK,CAAC;AAErC,aAAOA;AAAA,IACR;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACnSjB;AAAA;AAAA;AAMA,YAAQ,aAAa;AACrB,YAAQ,OAAO;AACf,YAAQ,OAAO;AACf,YAAQ,YAAY;AACpB,YAAQ,UAAU,aAAa;AAC/B,YAAQ,UAAW,uBAAM;AACxB,UAAIE,UAAS;AAEb,aAAO,MAAM;AACZ,YAAI,CAACA,SAAQ;AACZ,UAAAA,UAAS;AACT,kBAAQ,KAAK,uIAAuI;AAAA,QACrJ;AAAA,MACD;AAAA,IACD,GAAG;AAMH,YAAQ,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAWA,aAAS,YAAY;AAIpB,UAAI,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,QAAQ,SAAS,cAAc,OAAO,QAAQ,SAAS;AACrH,eAAO;AAAA,MACR;AAGA,UAAI,OAAO,cAAc,eAAe,UAAU,aAAa,UAAU,UAAU,YAAY,EAAE,MAAM,uBAAuB,GAAG;AAChI,eAAO;AAAA,MACR;AAEA,UAAI;AAKJ,aAAQ,OAAO,aAAa,eAAe,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,SAAS,gBAAgB,MAAM;AAAA,MAEtI,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,QAAQ,WAAY,OAAO,QAAQ,aAAa,OAAO,QAAQ;AAAA;AAAA,MAG1H,OAAO,cAAc,eAAe,UAAU,cAAc,IAAI,UAAU,UAAU,YAAY,EAAE,MAAM,gBAAgB,MAAM,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK;AAAA,MAEpJ,OAAO,cAAc,eAAe,UAAU,aAAa,UAAU,UAAU,YAAY,EAAE,MAAM,oBAAoB;AAAA,IAC1H;AAQA,aAAS,WAAW,MAAM;AACzB,WAAK,CAAC,KAAK,KAAK,YAAY,OAAO,MAClC,KAAK,aACJ,KAAK,YAAY,QAAQ,OAC1B,KAAK,CAAC,KACL,KAAK,YAAY,QAAQ,OAC1B,MAAM,OAAO,QAAQ,SAAS,KAAK,IAAI;AAExC,UAAI,CAAC,KAAK,WAAW;AACpB;AAAA,MACD;AAEA,YAAM,IAAI,YAAY,KAAK;AAC3B,WAAK,OAAO,GAAG,GAAG,GAAG,gBAAgB;AAKrC,UAAI,QAAQ;AACZ,UAAI,QAAQ;AACZ,WAAK,CAAC,EAAE,QAAQ,eAAe,WAAS;AACvC,YAAI,UAAU,MAAM;AACnB;AAAA,QACD;AACA;AACA,YAAI,UAAU,MAAM;AAGnB,kBAAQ;AAAA,QACT;AAAA,MACD,CAAC;AAED,WAAK,OAAO,OAAO,GAAG,CAAC;AAAA,IACxB;AAUA,YAAQ,MAAM,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AAAA,IAAC;AAQtD,aAAS,KAAK,YAAY;AACzB,UAAI;AACH,YAAI,YAAY;AACf,kBAAQ,QAAQ,QAAQ,SAAS,UAAU;AAAA,QAC5C,OAAO;AACN,kBAAQ,QAAQ,WAAW,OAAO;AAAA,QACnC;AAAA,MACD,SAAS,OAAO;AAAA,MAGhB;AAAA,IACD;AAQA,aAAS,OAAO;AACf,UAAI;AACJ,UAAI;AACH,YAAI,QAAQ,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MACxE,SAAS,OAAO;AAAA,MAGhB;AAGA,UAAI,CAAC,KAAK,OAAO,YAAY,eAAe,SAAS,SAAS;AAC7D,YAAI,QAAQ,IAAI;AAAA,MACjB;AAEA,aAAO;AAAA,IACR;AAaA,aAAS,eAAe;AACvB,UAAI;AAGH,eAAO;AAAA,MACR,SAAS,OAAO;AAAA,MAGhB;AAAA,IACD;AAEA,WAAO,UAAU,iBAAoB,OAAO;AAE5C,QAAM,EAAC,WAAU,IAAI,OAAO;AAM5B,eAAW,IAAI,SAAU,GAAG;AAC3B,UAAI;AACH,eAAO,KAAK,UAAU,CAAC;AAAA,MACxB,SAAS,OAAO;AACf,eAAO,iCAAiC,MAAM;AAAA,MAC/C;AAAA,IACD;AAAA;AAAA;;;AC/QA,IAAAC,iBAAmB;;;ACAnB,SAAS,OAAO,OAAO;AACnB,WAAS,YAAY,OAAO,QAAQ;AAChC,WAAQ,UAAU,SAAW,SAAU,KAAK;AAAA,EAChD;AACA,QAAM,UAAU,KAAK;AACrB,QAAM,UAAU,QAAQ,GAAG,EAAE;AAC7B,QAAM,iBAAiB;AACvB,MAAI,GAAG;AACP,MAAI,SAAS;AACb,QAAM,QAAQ,CAAC;AACf,QAAM,iBAAiB,MAAM,cAAc,IAAI;AAK/C,MAAI,OAAQ,OAAO,IAAI,OAAO,KAAK,CAAC;AAGpC,QAAM,IAAK,OAAO,IAAI,OAAO,KAAK,CAAC;AACnC,MAAI,eAAe,EAAE,cAAc;AAKnC,QAAM,cAAc,CAAC;AACrB,WAAS,YAAY,GAAG,eAAe,IAAI,aAAa;AAEpD,QAAI,CAAC,YAAY,SAAS,GAAG;AACzB,WAAK,IAAI,GAAG,IAAI,KAAK,KAAK,WAAW;AAEjC,oBAAY,CAAC,IAAI;AAAA,MACrB;AACA,WAAK,YAAY,IAAK,QAAQ,WAAW,GAAG,IAAI,UAAW;AAC3D,QAAE,cAAc,IAAK,QAAQ,WAAW,IAAI,CAAC,IAAI,UAAW;AAAA,IAChE;AAAA,EACJ;AACA,WAAS;AACT,SAAQ,MAAM,cAAc,IAAI,KAAM;AAClC,aAAS;AACb,OAAK,IAAI,GAAG,IAAI,MAAM,cAAc,GAAG,KAAK;AACxC,QAAI,MAAM,WAAW,CAAC;AACtB,QAAI,KAAK;AACL;AACJ,UAAM,KAAK,CAAC,KAAK,MAAQ,IAAI,KAAK,IAAK;AAAA,EAC3C;AACA,QAAM,MAAM,cAAc,CAAC,IAAK,iBAAiB,UAAW;AAC5D,QAAM,MAAM,cAAc,CAAC,IAAI;AAE/B,OAAK,IAAI,GAAG,IAAI,MAAM,cAAc,KAAI;AACpC,UAAM,IAAI,MAAM,MAAM,GAAI,KAAK,EAAG;AAClC,UAAM,UAAU;AAGhB,WAAO,KAAK,MAAM,GAAG,CAAC;AACtB,SAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AACrB,YAAM,KAAK,IAAI;AAGf,YAAM,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC;AAEnC,YAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC;AAC7B,YAAM,QAAQ,KAAK,CAAC,KACf,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,EAAE,IAAI,YAAY,GAAG,EAAE;AAAA,OACzD,IAAI,KAAK,CAAC,IAAM,CAAC,IAAI,KAAK,CAAC;AAAA,MAC7B,EAAE,CAAC;AAAA,OAEF,EAAE,CAAC,IACA,IAAI,KACE,EAAE,CAAC,IACF,EAAE,IAAI,EAAE,KACN,YAAY,KAAK,CAAC,IAAI,YAAY,KAAK,EAAE,IAAK,QAAQ;AAAA,MACvD,EAAE,IAAI,CAAC,KACN,YAAY,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,IAAK,OAAO;AAAA,MACrD;AAEhB,YAAM,SAAS,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,EAAE,IAAI,YAAY,GAAG,EAAE;AAAA,OACnE,IAAI,KAAK,CAAC,IAAM,IAAI,KAAK,CAAC,IAAM,KAAK,CAAC,IAAI,KAAK,CAAC;AACtD,aAAO,CAAE,QAAQ,QAAS,CAAC,EAAE,OAAO,IAAI;AACxC,WAAK,CAAC,IAAK,KAAK,CAAC,IAAI,QAAS;AAAA,IAClC;AACA,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACpB,WAAK,CAAC,IAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAK;AAAA,IACvC;AAAA,EACJ;AACA,OAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACpB,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACpB,YAAM,IAAK,KAAK,CAAC,KAAM,IAAI,IAAM;AACjC,iBAAW,IAAI,KAAK,IAAI,MAAM,EAAE,SAAS,EAAE;AAAA,IAC/C;AAAA,EACJ;AACA,SAAO;AACX;AACA,SAAS,WAAW,MAAM;AACtB,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AAAA,IACH,MAAM,UAAU,GAAG,CAAC;AAAA,IACpB,MAAM,UAAU,GAAG,EAAE;AAAA,IACrB,MAAM,UAAU,IAAI,EAAE;AAAA,IACtB,MAAM,UAAU,IAAI,EAAE;AAAA,IACtB,MAAM,UAAU,IAAI,EAAE;AAAA,EAC1B,EAAE,KAAK,GAAG;AACd;AAWO,SAAS,gBAAgB,MAAM,QAAQ;AAC1C,QAAM,cAAc,oBAAI,KAAK;AAC7B,QAAM,gBAAgB,YAAY,mBAAmB,OAAO;AAC5D,QAAM,OAAO,OAAO,gBAAgB,MAAM;AAC1C,SAAO,WAAW,OAAO,IAAI;AACjC;;;ACrGA,IAAMC,kBAAkB,SAAlBA,iBAAmBC,QAAD;AAAA,SAAoBA;AAApB;IAEXC,sBAAsB,SAAtBA,qBAIXC,qBACAC,SALiC;MAKjCA,YAAAA,QAAAA;AAAAA,cAAmB,CAAA;;AAEnB,MAAI,CAACD,oBAAqB,QAAO,CAAA;AACjC,MAAA,WAA8DC,SAA9D,wBAAA,SAAQC,gBAAAA,iBAAR,0BAAA,SAAyB,OAAzB,uBAAA,oBAAA,SAA+BC,UAAAA,WAA/B,sBAAA,SAA0CN,kBAA1C;AAEA,SAAOG,oBACJI,MAAM,GADF,EAEJC,IAAI,SAACC,MAAD;AACH,QAAA,cAA4BA,KAAKF,MAAM,GAAX,GAArBN,SAAP,YAAA,CAAA,GAAA,eAAA,YAAA,CAAA,GAAeS,IAAf,iBAAA,SAAmB,QAAnB;AACA,QAAMC,gBAAgBV,OAAOW,KAAP;AACtB,QAAMC,OAAOC,OAAOJ,EAAEK,QAAQ,QAAQ,EAAlB,CAAD;AACnB,QAAIC,MAAMH,IAAD,EAAQ,QAAO,CAAC,GAAGF,aAAJ;AACxB,WAAO,CAACE,MAAMF,aAAP;EACR,CARI,EASJM,KAAK,SAAA,MAAA,OAAA;AAAA,QAAEC,KAAF,KAAA,CAAA;AAAA,QAAQC,KAAR,MAAA,CAAA;AAAA,WAAgBA,KAAKD;EAArB,CATD,EAUJE,QAAQ,SAAA,OAAA;QAAKnB,SAAAA,MAAAA,CAAAA;AACZ,QAAIA,WAAW,OAAOI,eAAgB,QAAO,CAAA;AAC7C,QAAI;AACF,aAAOC,SAASL,MAAD,KAAY,CAAA;IAE5B,SAAC,SAAM;AACN,aAAO,CAAA;IACR;EACF,CAlBI;AAmBR;;;AC/CM,SAAS,WAAW,kBAAkB;AACzC,MAAI,4BAA4B,SAAS;AACrC,WAAO,iBAAiB;AAAA,EAC5B;AACA,SAAO;AACX;;;ACHO,SAAS,iBAAiB,kBAAkB;AAC/C,MAAI,UAAU,WAAW,gBAAgB;AACzC,MAAI,iBAAiB,QAAQ,IAAI,iBAAiB;AAElD,MAAI,CAAC;AACD,WAAO;AACX,MAAI,UAAU,oBAAoB,gBAAgB;AAAA,IAC9C,UAAU,KAAK,eAAe;AAAA,IAC9B,gBAAgB;AAAA,EACpB,CAAC;AAED,MAAI,QAAQ,WAAW;AACnB,WAAO;AAEX,SAAO;AACX;;;AChBO,IAAM,kBAAkB,CAAC,SAAS;AACrC,MAAI,UAAU,KAAK,UAAU,IAAI;AACjC,QAAM,kBAAkB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,kBAAgB,QAAQ,CAAC,UAAU;AAC/B,cAAU,QAAQ,WAAW,IAAI,OAAO,KAAK,KAAK,mBAAmB,KAAK,GAAG,eAAe;AAAA,EAChG,CAAC;AACD,SAAO;AACX;;;AC5BA,IAAI,WAAW;AACf,IAAM,wBAAwB,YAAY;AACtC,MAAI;AACA;AACJ,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,wDAAwD;AAAA,MACjF,SAAS;AAAA,QACL,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AACD,QAAI,SAAS,IAAI;AACb,iBAAW,MAAM,SAAS,KAAK;AAAA,IACnC,OACK;AACD,cAAQ,MAAM,sCAAsC,SAAS,UAAU;AAAA,IAC3E;AAAA,EACJ,SACO,OAAO;AAEV,YAAQ,MAAM,sCAAsC,MAAM,OAAO;AAAA,EACrE;AACJ;AACO,IAAM,YAAY,CAAC,cAAc,cAAc;AAClD,SAAO,OAAOoB,SAAQ,iBAAiB;AACnC,UAAM,wBAAwB,gBAAgB;AAAA,MAC1C,GAAG;AAAA,IACP,CAAC;AACD,UAAM,sBAAsB;AAC5B,QAAI,CAAC,UAAU;AACX,cAAQ,KAAK,qDAAqD;AAClE;AAAA,IACJ;AAEA,UAAM,gBAAgB,SAAS,IAAI,KAAK,SAAS,SAAS;AAC1D,QAAI,CAAC,cAAc,OAAO;AACtB,cAAQ,KAAK,2CAA2C;AACxD;AAAA,IACJ;AACA,UAAM,iBAAiB,SAAS,gBAAgB,KAAK;AACrD,UAAM,cAAc,GAAG,cAAc,QAAQ,IAAI,cAAc,OAAO,gBAAgB,cAAc;AAEpG,UAAM,YAAY;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAAA;AAAA,MACA,SAAS;AAAA,MACT,eAAe,gBAAgB;AAAA,MAC/B,YAAY;AAAA,MACZ,SAAS;AAAA,IACb;AACA,WAAO,MAAM,aAAa;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,eAAe,UAAU,cAAc,KAAK;AAAA,MAChD;AAAA,MACA,MAAM,KAAK,UAAU,SAAS;AAAA,IAClC,CAAC;AAAA,EACL;AACJ;;;AC5DO,IAAM,eAAe,CAAC,cAAc,cAAc;AACrD,SAAO,CAAC,eAAe,CAAC,MAAM;AAC1B,WAAO,UAAU,cAAc,SAAS,EAAE,YAAY,YAAY;AAAA,EACtE;AACJ;;;ACLA,0BAAmB;AACZ,SAAS,UAAU,WAAW;AACjC,QAAM,oBAAgB,oBAAAC,SAAO,SAAS;AACtC,SAAO;AAAA,IACH,YAAY,cAAc,OAAO,QAAQ;AAAA,IACzC,aAAa,cAAc,OAAO,SAAS;AAAA,IAC3C,cAAc,cAAc,OAAO,UAAU;AAAA,IAC7C,IAAI,cAAc,GAAG,QAAQ;AAAA,IAC7B,WAAW,cAAc,GAAG,WAAW;AAAA,IACvC,SAAS,cAAc,QAAQ,QAAQ;AAAA,IACvC,gBAAgB,cAAc,QAAQ,WAAW;AAAA,IACjD,QAAQ,cAAc,OAAO,QAAQ;AAAA,IACrC,eAAe,cAAc,OAAO,WAAW;AAAA,IAC/C,KAAK,cAAc,IAAI,gBAAgB;AAAA,EAC3C;AACJ;;;ACXA,SAAS,4BAA4B;;;ACJ9B,SAAS,kBAAkB,QAAQ;AACtC,QAAM,cAAc,OAAO,MAAM,GAAG;AACpC,SAAO,YAAY,SAAS,IAAI,YAAY,CAAC,EAAE,YAAY,IAAI;AACnE;;;ADGA,eAAsBC,WAAU,SAAS,SAAS,QAAQ;AACtD,MAAI,QAAQ,IAAI,aAAa,eAAe;AACxC;AAAA,EACJ;AAEA,MAAI,CAAC,CAAC,QAAQ,IAAI,gBAAgB,GAAG;AACjC;AAAA,EACJ;AACA,QAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,YAAY,qBAAqB,OAAO,EAAE,SAAS,KAAK;AAC9D,QAAM,aAAa,GAAG,QAAQ,QAAQ,IAAI,YAAY,CAAC,GAAG,SAAS,GAAG,IAAI,QAAQ;AAClF,QAAM,eAAe,gBAAgB,YAAY,OAAO,aAAa;AACrE,QAAM,SAAS,iBAAiB,OAAO,KAAK,CAAC,OAAO;AACpD,QAAM,WAAW,kBAAkB,QAAQ,UAAU,OAAO,CAAC,CAAC;AAC9D,SAAO,aAAa,OAAO,cAAc,YAAY,EAAE;AAAA,IACnD,mBAAmB,QAAQ;AAAA;AAAA,IAC3B,cAAc,QAAQ,aAAa,QAAQ,QAAQ,IAAI,YAAY,KAAK;AAAA,IACxE,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,cAAc,QAAQ;AAAA,IACtB,UAAU,QAAQ,YAAY,iBAAiB,OAAO,KAAK;AAAA,IAC3D,QAAQ,QAAQ,UAAU,OAAO,CAAC;AAAA,IAClC;AAAA,IACA,YAAY,QAAQ,cAAc,QAAQ,QAAQ,IAAI,YAAY,KAAK;AAAA,IACvE,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,MAAM,QAAQ,QAAQ,QAAQ;AAAA,IAC9B,GAAG,UAAU,QAAQ,QAAQ,IAAI,YAAY,KAAK,EAAE;AAAA,EACxD,CAAC;AACL;AACA,eAAsB,WAAW,MAAM,SAAS,MAAM;AAClD,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,MAAI,IAAI,SAAS,SAAS,aAAa,KAAK,QAAQ,WAAW,QAAQ;AACnE,QAAI;AACA,YAAMA,WAAU,SAAS,KAAK,SAAS;AAAA,QACnC,cAAc,KAAK,mBAAmB,EAAE;AAAA,QACxC,eAAe,KAAK,QAAQ;AAAA,MAChC,CAAC;AAAA,IACL,SACO,KAAK;AAAA,IAAE;AACd,WAAO,IAAI,SAAS,KAAK,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,EAC1D;AACA,SAAO,KAAK;AAChB;;;AErDA,oBAAmB;;;ACAZ,IAAM,iBAAiB;AACvB,IAAM,8BAA8B;AACpC,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB,KAAK,KAAK,KAAK;AAM3C,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB,KAAK;;;ADLlC,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0CA,IAAM,cAA8C;AAAA,EAClD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AACd;AAEO,SAAS,iBAA8B;AAC5C,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AAEA,SAAS,QAAQ,OAAgE;AAC/E,MAAI,UAAU,QAAQ,UAAU,UAAW,QAAO;AAClD,MAAI,UAAU,SAAS,UAAU,SAAU,QAAO;AAClD,SAAO;AACT;AAGO,SAAS,aACd,MACA,OACa;AACb,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,MAAI,CAAC,MAAO,QAAO;AAEnB,aAAW,WAAW,kBAAkB;AACtC,UAAM,QAAQ,QAAQ,MAAM,OAAO,CAAC;AACpC,QAAI,UAAU,UAAW,QAAO,OAAO,IAAI;AAAA,EAC7C;AAEA,SAAO;AACT;AASO,SAAS,mBAAmB,OAAwC;AACzE,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,UAAU,UAAU,UAAU,SAAS;AACzC,YAAQ,YAAY,UAAU,SAAS,YAAY;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,gBAAgB,KAAK;AACxC,aAAW,WAAW,kBAAkB;AACtC,UAAM,MAAM,OAAO,IAAI,YAAY,OAAO,CAAC;AAC3C,QAAI,QAAQ,IAAK,SAAQ,OAAO,IAAI;AAAA,aAC3B,QAAQ,IAAK,SAAQ,OAAO,IAAI;AAAA,EAC3C;AAEA,SAAO;AACT;AAEO,SAAS,4BAA4B,SAA8B;AACxE,SAAO,iBAAiB,IAAI,CAAC,YAAY;AACvC,UAAM,QAAQ,QAAQ,OAAO;AAC7B,UAAM,MAAM,UAAU,YAAY,MAAM,UAAU,WAAW,MAAM;AACnE,WAAO,GAAG,YAAY,OAAO,CAAC,IAAI,GAAG;AAAA,EACvC,CAAC,EAAE,KAAK,GAAG;AACb;AAUO,SAAS,iBACd,SACA,YACQ;AACR,SAAO,cAAAC,QAAO;AAAA,IACZ;AAAA,IACA,4BAA4B,OAAO;AAAA,IACnC;AAAA,MACE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,SAA+B;AAC/D,QAAM,MAAM,cAAAA,QAAO,MAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAC5D,SAAO,mBAAmB,IAAI,2BAA2B,CAAC;AAC5D;AASA,eAAsB,eACpB,SACA,YACsB;AACtB,MAAI;AAEJ,MAAI,YAAY;AACd,QAAI;AACF,kBAAY,MAAM,WAAW,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa,kBAAkB,OAAO,GAAG,SAAS;AAC3D;AAEO,SAAS,sBACd,SACA,SAA+B,WACT;AACtB,MAAI,OAAO,WAAW,WAAY,QAAO;AAEzC,MAAI;AACF,WAAO,OAAO,OAAO,MAAM,WAAW,WAAW;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eACd,SACA,WACoB;AACpB,QAAM,UAAU,CAAC;AACjB,aAAW,WAAW,kBAAkB;AACtC,UAAM,QAAQ,QAAQ,OAAO;AAC7B,YAAQ,OAAO,IACb,UAAU,aAAc,UAAU,aAAa,cAAc;AAAA,EACjE;AACA,SAAO;AACT;;;AE1MO,SAAS,SAAS,WAAmC;AAC1D,MAAI,CAAC,UAAW,QAAO;AAEvB,SACE,WAAW,KAAK,SAAS,KACzB,CAAC,WAAW,KAAK,SAAS,KAC1B,CAAC,aAAa,KAAK,SAAS,KAC5B,CAAC,QAAQ,KAAK,SAAS,KACvB,CAAC,YAAY,KAAK,SAAS;AAE/B;;;ACRO,IAAM,oBAAoB;AAE1B,SAAS,iBAAiB,SAA2B;AAC1D,SACE,QAAQ,WAAW,UACnB,IAAI,IAAI,QAAQ,GAAG,EAAE,SAAS,SAAS,iBAAiB;AAE5D;AASA,eAAsB,qBACpB,SACA,SACA,YACmB;AAGnB,QAAM,YAAY,QAAQ,QAAQ,IAAI,gBAAgB;AACtD,QAAM,SAAS,QAAQ,QACpB,IAAI,cAAc,GACjB,YAAY,EACb,WAAW,kBAAkB;AAChC,MAAI,CAAC,UAAW,aAAa,cAAc,eAAgB;AACzD,WAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,GAAG;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,MAAI;AAEJ,MAAI;AACF,WAAQ,MAAM,QAAQ,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,GAAG;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,aAAa,QAAQ,SAAS,IAAI;AAClD,UAAQ,WAAW,OAAO;AAK1B,QAAM,SAAS,aAAa,kBAAkB,OAAO,GAAG,IAAI;AAE5D,QAAM,WAAW,IAAI,SAAS,KAAK,UAAU,EAAE,QAAQ,CAAC,GAAG;AAAA,IACzD,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,EAChD,CAAC;AACD,WAAS,QAAQ,OAAO,cAAc,iBAAiB,QAAQ,UAAU,CAAC;AAE1E,SAAO;AACT;;;ACrDO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAAS,eACd,UACgB;AAChB,QAAM,SAAS,SAAS,sBAAsB;AAC9C,MAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,SAAO,oBAAoB,KAAK,CAAC,SAAS,SAAS,IAAI,CAAC,IAAI,MAAM;AACpE;AAQO,SAAS,uBACd,SACA,YACQ;AACR,SAAO,GAAG,sBAAsB,IAAI,OAAO,qBAAqB,oBAAoB,kBAClF,aAAa,KAAK,UACpB;AACF;;;AftCA,mBAAwB;AAExB,IAAM,YAAQ,aAAAC,SAAY,gCAAgC;AAqB1D,eAAe,oBACb,UACA,OACA,QACe;AACf,MAAI;AACF,aAAS,QAAQ,OAAO,cAAc,MAAM,OAAO,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,UAAM,+BAA+B,KAAK,YAAY,KAAK;AAC3D,YAAQ;AAAA,MACN,+BAA+B,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,MACA,SACAC,gBACmB;AACnB,QAAM,qBAAqB,MAAM,KAAK,cAAc,OAAO;AAC3D,QAAM,aACJ,SAAS,QAAQ,QAAQ,IAAI,YAAY,CAAC,KAC1C,QAAQ,IAAI,aAAa;AAE3B,MAAI;AAEJ,MAAI,iBAAiB,OAAO,GAAG;AAC7B,eAAW,MAAM,qBAAqB,KAAK,SAAS,SAAS,UAAU;AAAA,EACzE,OAAO;AACL,eAAW,MAAM,WAAW,MAAM,SAAS,MAAM;AAC/C,aAAOA,eAAc,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,qBAAmB,QAAQ;AAE3B,WAAS,QAAQ,OAAO,cAAc,kCAAkC;AACxE,QAAM,oBAAoB,UAAU,gBAAgB,MAAM,KAAK,QAAQ,OAAO,CAAC;AAQ/E,QAAM,WAAW,eAAAC,QAAO,MAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AACjE,WAAS,QAAQ;AAAA,IACf;AAAA,IACA,uBAAuB,eAAe,QAAQ,GAAG,UAAU;AAAA,EAC7D;AAEA,MAAI,KAAK,eAAe,KAAK,YAAY,WAAW,GAAG;AACrD,UAAM,cAAc,KAAK;AACzB,UAAM;AAAA,MAAoB;AAAA,MAAU;AAAA,MAAgB,MAClD,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;AgBhGA,SAAS,iBAAiB;AAiB1B,SAAS,uBAAuB;AAC9B,MAAI;AACF,UAAM,QAAQ,SAAS,OACpB,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,2BAA2B,GAAG,CAAC;AACpE,WAAO;AAAA,MACL,SAAS,mBAAmB,MAAM,MAAM,4BAA4B,SAAS,CAAC,CAAC;AAAA,IACjF,EAAE;AAAA,EACJ,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,SAAS,eAAe,SAAuC;AACpE,QAAM,iBAAiB,SAAS;AAEhC,YAAU,MAAM;AACd,QAAI,OAAO,mBAAmB,UAAW;AACzC,QAAI,qBAAqB,OAAO,iBAAiB,YAAY,WAAW;AACtE;AAAA,IACF;AAEA,UAAM,mBAAmB;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,WAAW,eAAe,CAAC;AAAA,MAClD,aAAa;AAAA,MACb,WAAW;AAAA,IACb,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,cAAQ,MAAM,oCAAoC,KAAK;AAAA,IACzD,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,CAAC;AACrB;;;AC5DA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAYA,IAAM,cAAN,MAAkB;AAAA,EACvB;AAAA,EAES;AAAA,EAEA;AAAA,EAET;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YACE,IACA,QACA,gBACA,SACA,SACA,WACA;AACA,SAAK,MAAM;AACX,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,aAAa,KACX,SACA,SACA,UAA0B,CAAC,GACL;AACtB,UAAM,YAAY,QAAQ,QAAQ,IAAI,YAAY;AAElD,UAAM,UAAU,2BAA2B;AAAA,MACzC,QAAQ,aAAa,gBAAgB;AAAA,QACnC,QACE,SAAS,SAAS,KAAK,QAAQ,IAAI,aAAa,gBAC5C,QACA;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UAAU,MAAM,QAAQ,WAAW,QAAQ,QAAQ,IAAI,QAAQ,CAAC;AACtE,UAAM,UAAU,MAAM,eAAe,SAAS,QAAQ,UAAU;AAChE,UAAM,YAAY,sBAAsB,SAAS,QAAQ,cAAc;AAEvE,UAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,QAAQ,CAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,gBAAY,cAAc;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAuB;AACzB,WAAO,EAAE,GAAG,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,IAAI,iBAAqC;AACvC,WAAO,eAAe,KAAK,UAAU,KAAK,UAAU;AAAA,EACtD;AAAA;AAAA,EAGA,WAAW,SAA4B;AACrC,SAAK,WAAW,EAAE,GAAG,QAAQ;AAC7B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,eAAe,WAAW;AACjC,UAAI,YAAY,KAAK,SAAS,IAAI,YAAY;AAC9C,UAAI,CAAC,WAAW;AACd,oBAAY,OAAO,WAAW;AAC9B,aAAK,SAAS,IAAI,cAAc,SAAS;AAAA,MAC3C;AACA,WAAK,MAAM;AACX;AAAA,IACF;AAIA,SAAK,SAAS,MAAM,YAAY;AAChC,SAAK,MAAM,OAAO,WAAW;AAAA,EAC/B;AAAA,EAEA,IAAI,KAAsB;AACxB,WAAO,KAAK,SAAS,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,KAAa;AACf,WAAO,KAAK,SAAS,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,UAA2B;AACzB,eAAW,OAAO,OAAO,KAAK,KAAK,SAAS,IAAI,GAAG;AACjD,WAAK,SAAS,MAAM,GAAG;AAAA,IACzB;AAEA,WAAO,KAAK,gBAAgB,eAAe,KAAK,QAAQ;AAAA,EAC1D;AAAA,EAEA,IAAI,KAAa,OAAkB;AACjC,SAAK,SAAS,IAAI,KAAK,KAAK;AAAA,EAC9B;AAAA,EAEA,SAA0B;AACxB,WAAO,KAAK,gBAAgB,cAAc,KAAK,QAAQ;AAAA,EACzD;AACF;;;AChJA;AAAA,EACE,gBAAAC;AAAA,EACA,8BAAAC;AAAA,OAGK;AAIP,IAAAC,gBAAwB;AAExB,IAAMC,aAAQ,cAAAC,SAAY,8BAA8B;AAExD,IAAM,kBAAkB;AAExB,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAGtB,IAAM,sBAAqB,oBAAI,KAAK,CAAC,GAAE,YAAY;AAmC5C,IAAM,4BAA4B;AAkCzC,SAAS,oBACP,KACA,oBACuB;AACvB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,QAAM,YAAY;AAOlB,QAAM,KAAK,OAAO,UAAU,OAAO,WAAW,UAAU,KAAK;AAC7D,QAAM,YACJ,OAAO,UAAU,aAAa,OAAO,WAAW,UAAU,YAAY,KAAK;AAE7E,MAAI,CAAC,MAAM,CAAC,UAAW,QAAO;AAE9B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS;AAAA,IAClE,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,QACE,OAAO,UAAU,aAAa,WAAW,WACrC,UAAU,YAAY,SACtB;AAAA,IACR;AAAA,IACA,YACE,OAAO,UAAU,eAAe,WAC5B,UAAU,aACV;AAAA,EACR;AACF;AAaA,SAAS,eACP,aACA,SACiB;AACjB,QAAM,UAAU,CAAC,GAAG,OAAO,OAAO,WAAW,CAAC,EAAE;AAAA,IAC9C,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,EAClE;AAIA,MAAI,OAAO;AAEX,SACE,KAAK,SAAS,KACd,QAAQ,OAAO,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IACpD,2BACF;AACA,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AAEA,MAAI,KAAK,WAAW,QAAQ,OAAQ,QAAO;AAE3C,EAAAD,OAAM,sDAAsD;AAAA,IAC1D,QAAQ,QAAQ;AAAA,IAChB,MAAM,KAAK;AAAA,EACb,CAAC;AAED,SAAO,OAAO,YAAY,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAClE;AAOA,SAAS,YACP,aAC4B;AAC5B,QAAM,UAAU,OAAO,OAAO,WAAW;AACzC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,QAAQ;AAAA,IAAO,CAAC,SAAS,UAC9B,MAAM,aAAa,QAAQ,cAC1B,MAAM,eAAe,QAAQ,cAC5B,MAAM,GAAG,cAAc,QAAQ,EAAE,IAAI,IACnC,QACA;AAAA,EACN;AACF;AAEA,SAAS,OAAO,YAAkC;AAChD,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,QAAQ,WAAW;AAAA,IACnB,aAAa;AAAA,MACX,IAAI,WAAW,YAAY;AAAA,MAC3B,QAAQ,WAAW,YAAY;AAAA,IACjC;AAAA,EACF;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAClB;AAAA,EACA;AAAA,EACT;AAAA,EACA,WAAoB;AAAA,EACX;AAAA,EACT,eAKI,CAAC;AAAA,EAEL,YACE,IACA,gBACA,SACA,UAAmB,OACnB;AACA,SAAK,KAAK;AACV,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,kBAAkB;AAGvB,SAAK,eAAe;AAAA,MAClB,eAAe,KAAK,SAAS,IAAI,eAAe;AAAA,MAChD,gBAAgB,KAAK,SAAS,IAAI,gBAAgB;AAAA,MAClD,kBAAkB,KAAK,SAAS,IAAI,kBAAkB;AAAA,MACtD,4BAA4B,KAAK,SAAS;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,KACX,SACA,SAC0B;AAC1B,UAAM,YAAY,QAAQ,QAAQ,IAAI,YAAY;AAClD,IAAAA,OAAM,oDAAoD;AAAA,MACxD,YAAY,QAAQ,SAAS;AAAA,MAC7B,WAAW,WAAW,UAAU,GAAG,EAAE;AAAA,IACvC,CAAC;AAED,UAAM,UAAUE,4BAA2B;AAAA,MACzC,QAAQC,cAAa,qBAAqB;AAAA,QACxC,QACE,SAAS,SAAS,KAAK,QAAQ,IAAI,aAAa,gBAC5C,QACA;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UAAU,MAAM,QAAQ,WAAW,QAAQ,QAAQ,IAAI,QAAQ,CAAC;AACtE,QAAI,YAAY,QAAQ,IAAI,iBAAiB;AAC7C,UAAM,UAAU,CAAC;AAEjB,QAAI,CAAC,WAAW;AACd,kBAAY,OAAO,WAAW;AAC9B,cAAQ,IAAI,mBAAmB,SAAS;AACxC,MAAAH,OAAM,mDAAmD,EAAE,UAAU,CAAC;AAAA,IACxE,OAAO;AACL,MAAAA,OAAM,oDAAoD,EAAE,UAAU,CAAC;AAAA,IACzE;AAEA,WAAO,IAAI,KAAK,WAAW,SAAS,SAAS,OAAO;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAkB;AAChB,QAAI,KAAK,SAAU,MAAK,WAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAkC;AAChC,UAAM,SAAS,KAAK,SAAS,IAAI,eAAe;AAChD,UAAM,SAAS,KAAK,SAAS,IAAI,oBAAoB;AACrD,UAAM,MAAM,KAAK,IAAI;AAMrB,UAAM,eAAe,CAAC,CAAC,UAAU,OAAO,WAAW;AAEnD,QAAI,aAA8B,CAAC;AAEnC,QAAI,cAAc;AAChB,iBAAW,OAAO,OAAO,OAAO,MAAiC,GAAG;AAClE,cAAM,aAAa,oBAAoB,KAAK,GAAG;AAC/C,YAAI,WAAY,YAAW,WAAW,EAAE,IAAI;AAAA,MAC9C;AAaA,YAAM,UAAU,oBAAoB,QAAQ,GAAG;AAC/C,UAAI,WAAW,CAAC,WAAW,QAAQ,EAAE,GAAG;AACtC,QAAAA,OAAM,gEAAgE;AAAA,UACpE,WAAW,KAAK;AAAA,UAChB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AACD,mBAAW,QAAQ,EAAE,IAAI;AAAA,MAC3B;AAAA,IACF,WAAW,WAAW,QAAW;AAC/B,YAAM,aAAa,oBAAoB,QAAQ,GAAG;AAClD,UAAI,WAAY,YAAW,WAAW,EAAE,IAAI;AAC5C,MAAAA,OAAM,0DAA0D;AAAA,QAC9D,WAAW,KAAK;AAAA,QAChB,UAAU,CAAC,CAAC;AAAA,MACd,CAAC;AAAA,IACH;AAEA,iBAAa,eAAe,YAAY,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC;AAMxE,UAAM,aAAa,eACf,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,IACpD,OAAO,KAAK,UAAU,EAAE,SAAS,KACjC,WAAW,UACX,WAAW;AAEf,QAAI,YAAY;AACd,WAAK,OAAO,UAAU;AAAA,IACxB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,mBAA6B;AAC3B,WAAO,OAAO,KAAK,KAAK,eAAe,CAAC;AAAA,EAC1C;AAAA,EAEA,cAAc,QAA4C;AACxD,WAAO,KAAK,eAAe,EAAE,MAAM;AAAA,EACrC;AAAA,EAEA,cAAc,QAAyB;AACrC,WAAO,CAAC,CAAC,KAAK,cAAc,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAmD;AACjD,WAAO,YAAY,KAAK,eAAe,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,YACS;AACT,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,WAAW,QAAQ,WAAW,EAAE;AAEtC,UAAM,OAAO;AAAA,MACX;AAAA,QACE,GAAG;AAAA,QACH,YACE,WAAW,cAAc,UAAU,cAAc,KAAK,IAAI;AAAA,MAC9D;AAAA,MACA,KAAK,IAAI;AAAA,IACX;AAEA,QAAI,CAAC,MAAM;AACT,MAAAA,OAAM,iDAAiD;AAAA,QACrD,WAAW,KAAK;AAAA,QAChB,QAAQ,YAAY;AAAA,MACtB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,KAAK;AAClD,UAAM,eAAe,KAAK,kBAAkB,WAAW;AAEvD,QAAI,eAAe,2BAA2B;AAM5C,MAAAA,OAAM,yDAAyD;AAAA,QAC7D,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,OAAO,KAAK,OAAO,EAAE;AAAA,MAC7B,CAAC;AACD,aAAO;AAAA,IACT;AAEA,IAAAA,OAAM,sCAAsC;AAAA,MAC1C,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK,YAAY;AAAA,MAC5B,eAAe,KAAK,YAAY;AAAA,IAClC,CAAC;AAED,SAAK,OAAO,WAAW;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,QAAsB;AACpC,UAAM,UAAU,KAAK,eAAe;AACpC,QAAI,CAAC,QAAQ,MAAM,EAAG;AAEtB,IAAAA,OAAM,yCAAyC;AAAA,MAC7C,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAED,UAAM,EAAE,CAAC,MAAM,GAAG,UAAU,GAAG,KAAK,IAAI;AACxC,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEA,sBAA4B;AAC1B,IAAAA,OAAM,mDAAmD;AAAA,MACvD,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,SAAK,OAAO,CAAC,CAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,kBAAkB,aAAsC;AACtD,UAAM,UAAU,YAAY,WAAW;AAEvC,WAAO,KAAK,UAAU;AAAA,MACpB,GAAG,KAAK,SAAS;AAAA,MACjB,CAAC,aAAa,GAAG,KAAK,YAAY,KAAK;AAAA,MACvC,CAAC,eAAe,GAAG;AAAA,MACnB,GAAI,UAAU,EAAE,CAAC,oBAAoB,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,IAC/D,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,OAAO,aAAoC;AACzC,SAAK,WAAW;AAChB,SAAK,SAAS,IAAI,iBAAiB,WAAW;AAC9C,SAAK,mBAAmB,WAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,mBAAmB,aAAoC;AACrD,UAAM,UAAU,YAAY,WAAW;AAEvC,QAAI,SAAS;AACX,WAAK,SAAS,IAAI,sBAAsB,OAAO,OAAO,CAAC;AAAA,IACzD,WAAW,KAAK,SAAS,IAAI,oBAAoB,GAAG;AAClD,WAAK,SAAS,MAAM,oBAAoB;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAgC;AAC9B,UAAM,UAAU,KAAK,qBAAqB;AAC1C,WAAO,UAAU,OAAO,OAAO,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAkC;AAC5C,QAAI,CAAC,UAAU;AACb,WAAK,oBAAoB;AACzB;AAAA,IACF;AAEA,SAAK,cAAc;AAAA,MACjB,IAAI,SAAS;AAAA,MACb,QAAQ,SAAS,UAAU;AAAA,MAC3B,aAAa;AAAA,QACX,IAAI,SAAS,aAAa,MAAM;AAAA,QAChC,QAAQ,SAAS,aAAa,UAAU;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAkC;AAChC,WAAO,KAAK,SAAS,IAAI,gBAAgB;AAAA,EAC3C;AAAA,EAEA,YAAY,UAAoC;AAC9C,IAAAA,OAAM,gCAAgC;AAAA,MACpC,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,SAAS,IAAI,kBAAkB,QAAQ;AAAA,EAC9C;AAAA,EAEA,gBAAsB;AACpB,IAAAA,OAAM,iDAAiD;AAAA,MACrD,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,SAAK,oBAAoB;AACzB,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM,gBAAgB;AAAA,EACtC;AAAA,EAEA,cAAuB;AACrB,WAAO,OAAO,KAAK,KAAK,eAAe,CAAC,EAAE,SAAS;AAAA,EACrD;AAAA;AAAA,EAGA,oBAAuC;AACrC,WAAO,KAAK,SAAS,IAAI,kBAAkB;AAAA,EAC7C;AAAA,EAEA,6BAAiD;AAC/C,WAAO,KAAK,SAAS,IAAI,4BAA4B;AAAA,EACvD;AAAA,EAEA,kBAAkB,OAAc,WAAyB;AACvD,IAAAA,OAAM,0CAA0C;AAAA,MAC9C,WAAW,KAAK;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,WAAW,IAAI,KAAK,SAAS,EAAE,YAAY;AAAA,IAC7C,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,SAAS,IAAI,oBAAoB,KAAK;AAC3C,SAAK,SAAS,IAAI,8BAA8B,SAAS;AAAA,EAC3D;AAAA,EAEA,sBAA4B;AAC1B,IAAAA,OAAM,8CAA8C;AAAA,MAClD,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM,kBAAkB;AACtC,SAAK,SAAS,MAAM,4BAA4B;AAAA,EAClD;AAAA,EAEA,sBAAsB,kBAA0B,KAAK,KAAK,KAAe;AACvE,UAAM,YAAY,KAAK,2BAA2B;AAClD,QAAI,CAAC,WAAW;AACd,MAAAA,OAAM,oDAAoD;AAAA,QACxD,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,IAAI,IAAI,YAAY;AACzC,IAAAA,OAAM,gDAAgD;AAAA,MACpD,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI,IAAI;AAAA,MACxD,QAAQ,KAAK,MAAM,kBAAkB,GAAI,IAAI;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,aAAsB;AAEpB,UAAM,qBAAqB,KAAK,eAAe;AAC/C,UAAM,kBAAkB,KAAK,YAAY;AACzC,UAAM,wBAAwB,KAAK,kBAAkB;AACrD,UAAM,iCAAiC,KAAK,2BAA2B;AAMvE,UAAM,qBACJ,KAAK,UAAU,kBAAkB,MACjC,KAAK,UAAU,KAAK,aAAa,iBAAiB,CAAC,CAAC;AACtD,UAAM,kBACJ,oBAAoB,KAAK,aAAa;AACxC,UAAM,wBACJ,KAAK,UAAU,qBAAqB,MACpC,KAAK,UAAU,KAAK,aAAa,gBAAgB;AACnD,UAAM,iCACJ,mCAAmC,KAAK,aAAa;AAEvD,UAAM,aAAa,sBAAsB,mBAAmB,yBAAyB,kCAAkC,KAAK;AAE5H,IAAAA,OAAM,qCAAqC;AAAA,MACzC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,SAA0B;AAGxB,UAAM,cAAc,KAAK,eAAe;AAExC,IAAAA,OAAM,+BAA+B;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,iBAAiB,OAAO,KAAK,WAAW,EAAE;AAAA,IAC5C,CAAC;AAED,SAAK,WAAW;AAGhB,SAAK,eAAe;AAAA,MAClB,eAAe;AAAA,MACf,gBAAgB,KAAK,YAAY;AAAA,MACjC,kBAAkB,KAAK,kBAAkB;AAAA,MACzC,4BAA4B,KAAK,2BAA2B;AAAA,IAC9D;AAEA,WAAO,KAAK,gBAAgB,cAAc,KAAK,QAAQ;AAAA,EACzD;AAAA,EAEA,UAA2B;AACzB,IAAAA,OAAM,gCAAgC;AAAA,MACpC,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM,eAAe;AACnC,SAAK,SAAS,MAAM,oBAAoB;AACxC,SAAK,SAAS,MAAM,gBAAgB;AACpC,SAAK,SAAS,MAAM,kBAAkB;AACtC,SAAK,SAAS,MAAM,4BAA4B;AAChD,WAAO,KAAK,gBAAgB,eAAe,KAAK,QAAQ;AAAA,EAC1D;AACF;;;ACtqBA,IAAAI,UAAwB;AAFxB,SAAS,kBAAkB;AAC3B,SAAS,aAAa,uBAAuB;;;ACG7C,IAAAC,UAAwB;;;ACHxB,IAAAC,gBAAwB;;;ACcjB,SAAS,+BACd,aACU;AACV,QAAM,aACJ,aAAa,qBACT,IAAI,CAAC,YAAY,SAAS,SAAS,EAAE,EACtC,OAAO,CAAC,OAAqB,QAAQ,EAAE,CAAC,KAAK,CAAC;AAEnD,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAChC;AAEO,SAAS,kCACd,MACA,aACU;AACV,QAAM,4BAA4B,+BAA+B,WAAW;AAE5E,MAAI,0BAA0B,SAAS,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,WAAW;AACrC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,qBACJ,MAAM,cACF,OAAO,CAAC,YAAY,QAAQ,WAAW,SAAS,EACjD,QAAQ,CAAC,YAAY,+BAA+B,OAAO,CAAC,KAAK,CAAC;AAEvE,SAAO,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC;AACxC;;;AC9CA,IAAAC,UAAwB;AA2ExB,SAAS,iBAAiB,WAAiD;AACzE,QAAM,KAAK,UAAU,YAAY;AACjC,MAAI,oCAAoC,KAAK,EAAE,EAAG,QAAO;AACzD,MAAI,iCAAiC,KAAK,EAAE,EAAG,QAAO;AACtD,SAAO;AACT;AAIA,SAAS,mBACP,SACoB;AACpB,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,QAAQ,GAAG,MAAM,GAAG;AAC1B,SAAO,MAAM,UAAU,IAAI,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG,IAAI;AACzD;AAEA,SAAS,YAAY,YAAqB,OAAqC;AAC7E,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,QAAQ,QAAQ,IAAI,IAAI;AACtC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAOO,SAAS,oBACd,SACA,UAAsC,CAAC,GACvB;AAChB,QAAM,gBAAuB,cAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AACtE,QAAM,UAAkC,CAAC;AACzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACzD,QAAI,OAAO,UAAU,SAAU,SAAQ,IAAI,IAAI;AAAA,EACjD;AAEA,QAAM,YAAY,QAAQ,QAAQ,IAAI,YAAY,KAAK;AAEvD,QAAM,aACJ,QAAQ,cACR,mBAAmB,QAAQ,2BAA2B,CAAC,EAAE,cACvD;AAEJ,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AACtC,QAAM,QAAgC,CAAC;AACvC,aAAW,aAAa,QAAQ,CAAC,OAAO,QAAQ;AAC9C,UAAM,GAAG,IAAI;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL,mBAAmB,QAAQ;AAAA;AAAA;AAAA,IAG3B,aAAa,mBAAmB,OAAO;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,YAAY,iBAAiB,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBtD,KAAK;AAAA,MACH,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,MAAM,WAAW;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OACE,YAAY,SAAS,oBAAoB,MAAM,KAAK,WAAW,UAE9D,MAAM,GAAG,EAAE,CAAC,EACZ,KAAK,EACL,MAAM,GAAG,EAAE,CAAC,EACZ,YAAY;AAAA,IACjB;AAAA,IACA,UAAU,QAAQ,QAAQ,IAAI,SAAS,KAAK;AAAA,EAC9C;AACF;;;AClLO,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAE/B,SAAS,eACd,SACA,OACS;AAGT,MAAI,CAAC,WAAW,UAAU,OAAW,QAAO;AAC5C,MACE,QAAQ,SAAS,4BACjB,MAAM,SAAS,wBACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,IAAI,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACDO,SAAS,eACd,QACA,UACS;AACT,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,QAAQ;AACnB,MAAI,CAAC,QAAQ,CAAC,GAAI,QAAO;AAGzB,MAAI,QAAQ,kBAAkB,CAAC,SAAS,WAAY,QAAO;AAE3D,QAAM,QAAQ,SAAS,UAAU,IAAI;AACrC,QAAM,SAAS,QAAQ,SAAS;AAEhC,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,UAAU,UAAa,UAAU;AAAA,IAC1C,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,UAAa,MAAM,SAAS,MAAM;AAAA,IACrD,KAAK;AACH,aAAO,UAAU,UAAa,MAAM,WAAW,MAAM;AAAA,IACvD,KAAK;AACH,aAAO,UAAU,UAAa,MAAM,SAAS,MAAM;AAAA,IACrD,KAAK;AACH,aAAO,eAAe,QAAQ,KAAK;AAAA,IACrC;AACE,aAAO;AAAA,EACX;AACF;;;AC/BA,IAAM,cAAc;AACpB,IAAM,iBAAiB,CAAC,WAAW,UAAU,cAAc,gBAAgB,KAAK;AAChF,IAAM,gBAAgB,CAAC,UAAU,kBAAkB,gBAAgB,MAAM,kBAAkB,cAAc;AACzG,IAAM,uBAAuB;AAC7B,IAAM,eAAe;AACrB,IAAM,kBAAkB,CAAC,YAAY,OAAO,MAAM;AAClD,IAAM,iBAAiB;AAAA,EACrB;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAc;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EACtE;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAa;AAAA,EAAS;AAAA,EAAS;AACnE;AACA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EAAY;AAAA,EAAO;AAAA,EAAa;AAAA,EAAU;AAAA,EAAa;AAAA,EAAU;AAAA,EACjE;AAAA,EAAW;AAAA,EAAU;AAAA,EAAY;AAAA,EAAW;AAAA,EAAS;AAAA,EAAQ;AAAA,EAC7D;AAAA,EAAW;AAAA,EAAY;AAAA,EAAU;AAAA,EAAS;AAAA,EAAO;AACnD;AAEA,SAAS,iBAAiB,UAAsC;AAC9D,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,WAAO,IAAI,IAAI,QAAQ,EAAE,SAAS,YAAY;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,IAAM,YAAY,CAAC,WAChB,SAAS,IACP,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAQnB,SAAS,SACP,MACA,IACA,OACS;AACT,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,KAAK,YAAY;AAC3B,QAAM,OAAO,UAAU,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AACxD,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,OAAO,SAAS,IAAI,KAAK,EAAE,YAAY;AAAA,IAChD,KAAK;AACH,aAAO,KAAK,SAAS,CAAC;AAAA,IACxB,KAAK;AACH,aAAO,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,CAAC;AAAA,IAC5C;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBACP,OACA,UACA,aACQ;AACR,QAAM,UAAU,QAAQ,YAAY,KAAK,IAAI,YAAY;AACzD,QAAM,UAAU,QAAQ,YAAY,KAAK,IAAI,YAAY;AACzD,QAAM,WAAW,CAAC,MAAc,EAAE,QAAQ,UAAU,EAAE;AACtD,MAAI,OAAO,iBAAiB,QAAQ;AAQpC,MAAI,QAAQ,aAAa;AACvB,UAAM,IAAI,SAAS,IAAI;AACvB,UAAM,IAAI,SAAS,YAAY,YAAY,CAAC;AAC5C,QAAI,MAAM,KAAK,EAAE,SAAS,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,EAAG,QAAO;AAAA,EACpE;AAOA,QAAM,WAAW,SAAS,IAAI;AAG9B,QAAM,UAAU,CAAC,MAAe,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AACnE,QAAM,aAAa,CAAC,SAClB,CAAC,CAAC,YACF,KAAK,KAAK,CAAC,MAAM;AACf,UAAM,MAAM,QAAQ,CAAC;AACrB,WAAO,IAAI,SAAS,GAAG,IACnB,aAAa,OAAO,SAAS,SAAS,MAAM,GAAG,IAC/C,SAAS,MAAM,GAAG,EAAE,SAAS,GAAG;AAAA,EACtC,CAAC;AAKH,QAAM,eAAe,CAAC,SAAmB;AACvC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,OAAO,MAAM,SAAS;AACrC,WAAO,KAAK,KAAK,CAAC,MAAM;AACtB,YAAM,MAAM,QAAQ,CAAC;AACrB,aAAO,IAAI,SAAS,GAAG,IACnB,WAAW,OAAO,OAAO,SAAS,MAAM,GAAG,IAC3C,OAAO,SAAS,GAAG;AAAA,IACzB,CAAC;AAAA,EACH;AACA,QAAM,aAAa,CAAC,SAClB,aAAa,IAAI,KAAK,WAAW,IAAI;AAEvC,MAAI,YAAY,KAAK,MAAM,KAAK,eAAe,SAAS,MAAM,EAAG,QAAO;AACxE,MAAI,cAAc,SAAS,MAAM,KAAK,WAAW,cAAc,EAAG,QAAO;AACzE,MAAI,WAAW,aAAa,qBAAqB,KAAK,MAAM,KAAK,WAAW,cAAc,EAAG,QAAO;AACpG,MAAI,aAAa,KAAK,MAAM,KAAK,aAAa,KAAK,MAAM,EAAG,QAAO;AAKnE,MACE,WAAW,eACX,gBAAgB,SAAS,MAAM,KAC/B,QACA,UACA;AAEA,WAAO;AACT,SAAO;AACT;AAEA,IAAM,WAA6C;AAAA;AAAA,EAEjD,aAAa,CAAC,QAAQ,aAAa;AAKjC,UAAM,WAAW,SAAS,cAAc,CAAC,CAAC,SAAS;AACnD,QAAI,QAAQ,UAAU,YAAa,QAAO;AAC1C,QAAI,QAAQ,UAAU,YAAa,QAAO,CAAC;AAC3C,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,CAAC,QAAQ,cACd,SAAS,cAAc,eAAe,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBjD,iBAAiB,CAAC,QAAQ,aAAa;AACrC,UAAM,UAAU,SAAS,WAAW,CAAC;AACrC,UAAM,aAAa,oBAAoB,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,CAAC;AACrE,UAAM,UAAU,QAAQ,sBAAsB;AAC9C,UAAM,YACJ,YAAY,MAAM,OAAO,YAAY,MAAM,QAAQ;AACrD,QAAI,QAAQ,UAAU,YAAa,QAAO;AAC1C,QAAI,QAAQ,UAAU,MAAO,QAAO,CAAC;AACrC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,CAAC,QAAQ,aACpB,SAAS,SAAS,KAAK,SAAS,QAAQ,IAAI,QAAQ,KAAK;AAAA,EAC3D,YAAY,CAAC,QAAQ,aACnB,SAAS,SAAS,KAAK,QAAQ,QAAQ,IAAI,QAAQ,KAAK;AAAA;AAAA,EAG1D,iBAAiB,CAAC,QAAQ,aACxB;AAAA,IACE,SAAS,KAAK;AAAA,IACd,SAAS;AAAA,IACT,SAAS,KAAK;AAAA,EAChB,MACA,QAAQ;AAAA;AAAA,EAGV,WAAW,CAAC,QAAQ,aAAa;AAC/B,QAAI,CAAC,QAAQ,MAAO,QAAO;AAI3B,UAAM,OAAO,OAAO,MAAM,QAAQ,SAAS,EAAE;AAC7C,UAAM,IAAI,SAAS,KAAK,QAAQ,OAAO,IAAI,EAAE,GAAG,YAAY;AAC5D,YAAQ,QAAQ,IAAI;AAAA,MAClB,KAAK;AACH,eAAO,MAAM,UAAa,MAAM;AAAA,MAClC,KAAK;AAGH,eAAO,MAAM,UAAa,MAAM,QAAQ,OAAO,YAAY;AAAA,MAC7D,KAAK;AACH,eACE,MAAM,UACN,UAAU,QAAQ,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1B,SAAS,CAAC;AAAA,MAEjB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,gBACd,QACA,UACS;AACT,QAAM,YAAY,QAAQ,MAAM,SAAS,OAAO,GAAG,IAAI;AAEvD,SAAO,YAAY,UAAU,UAAU,CAAC,GAAG,QAAQ,IAAI;AACzD;;;ACpPA,IAAM,aAAa,oBAAI,IAAgC;AAEhD,SAAS,2BACd,MACA,UACM;AACN,MAAI,WAAW,IAAI,IAAI,GAAG;AACxB,UAAM,IAAI,MAAM,wBAAwB,IAAI,0BAA0B;AAAA,EACxE;AACA,aAAW,IAAI,MAAM,QAAQ;AAC/B;AAEO,SAAS,sBACd,MACgC;AAChC,SAAO,WAAW,IAAI,IAAI;AAC5B;AAEO,SAAS,sBAAsB,MAAuB;AAC3D,SAAO,WAAW,IAAI,IAAI;AAC5B;AAGA,2BAA2B,UAAU,cAAc;AAGnD,2BAA2B,WAAW,eAAe;;;AC5BrD,IAAM,4BAA4B,oBAAI,IAAI,CAAC,aAAa,CAAC;AAKlD,SAAS,mBAAmB,MAAyB;AAC1D,SAAO,cAAc,IAAI,EACtB,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,EACxC,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,EAC9B,OAAO,CAAC,QAAuB,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG;AACpE;AAIA,SAAS,cAAc,MAAuB;AAC5C,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,CAAC;AAE/C,QAAM,YAAY;AAElB,MAAI,UAAU,IAAI;AAChB,WAAO,MAAM,QAAQ,UAAU,QAAQ,IACnC,UAAU,SAAS,QAAQ,CAAC,UAAU,cAAc,KAAK,CAAC,IAC1D,CAAC;AAAA,EACP;AAEA,SAAO,CAAC,IAAY;AACtB;AAGO,SAAS,sBAAsB,MAAwB;AAC5D,QAAM,YAAY;AAClB,SACE,WAAW,SAAS,aACpB,OAAO,UAAU,QAAQ,QAAQ,YACjC,0BAA0B,IAAI,UAAU,OAAO,GAAG;AAEtD;AAGO,SAAS,4BAA4B,OAAyB;AACnE,SAAO,mBAAmB,KAAK,EAAE;AAAA,IAAK,CAAC,QACrC,0BAA0B,IAAI,GAAG;AAAA,EACnC;AACF;AASO,SAAS,kBACd,OACA,UACuB;AACvB,QAAM,QAA+B,CAAC;AAEtC,QAAM,gBACJ,UAAU,eAAe,UAAa,CAAC,CAAC,UAAU;AACpD,MAAI,CAAC,iBAAiB,4BAA4B,KAAK,GAAG;AACxD,UAAM,KAAK,iBAAiB;AAAA,EAC9B;AAEA,SAAO;AACT;;;ACrDA,SAAS,aAAa,OAAyB;AAC7C,SACE,SAAS,QACR,OAAO,UAAU,YAChB,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,KAAK,KAAe,EAAE,WAAW;AAE9C;AAEA,SAAS,YAAY,MAAsC;AACzD,SACE,CAAC,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAa,OAAO;AAEtE;AAQA,eAAsB,iBACpB,OACA,UAC6B;AAC7B,QAAM,oBAAwC,CAAC;AAE/C,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO,EAAE,SAAS,MAAM,kBAAkB;AAAA,EAC5C;AAEA,QAAM,UAAU,MAAM,aAAa,OAAO,UAAU,iBAAiB;AAKrE,SAAO,EAAE,SAAS,mBAAmB,UAAU,oBAAoB,CAAC,EAAE;AACxE;AAEA,eAAe,aACb,MACA,UACA,SACkB;AAClB,MAAI,YAAY,IAAI,GAAG;AACrB,UAAM,EAAE,IAAI,SAAS,IAAI;AAEzB,QAAI,OAAO,OAAO;AAChB,iBAAW,SAAS,UAAU;AAC5B,YAAI,CAAE,MAAM,aAAa,OAAO,UAAU,OAAO,EAAI,QAAO;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,MAAM;AACf,iBAAW,SAAS,UAAU;AAC5B,YAAI,MAAM,aAAa,OAAO,UAAU,OAAO,EAAG,QAAO;AAAA,MAC3D;AACA,aAAO;AAAA,IACT;AAKA,QAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,eAAW,SAAS,UAAU;AAC5B,UAAI,MAAM,aAAa,OAAO,UAAU,OAAO,EAAG,QAAO;AAAA,IAC3D;AACA,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,MAA2B,UAAU,OAAO;AAClE;AAEA,eAAe,aACb,MACA,UACA,SACkB;AAClB,QAAM,WAAW,sBAAsB,KAAK,IAAI;AAGhD,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,SAAS,KAAK,UAAU,CAAC,GAAG,QAAQ;AAAA,EACrD,QAAQ;AACN,aAAS;AAAA,EACX;AAEA,MAAI,KAAK,OAAQ,UAAS,CAAC;AAE3B,MAAI,QAAQ;AACV,YAAQ,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,YAAY;AAAA,MAC3B,QAAQ,KAAK,UAAU;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAeA,eAAsB,6BACpB,OACA,UAC+B;AAC/B,MAAI,aAAa,KAAK,EAAG,QAAO;AAEhC,QAAM,QAAQ,MAAM,oBAAoB,OAAO,QAAQ;AACvD,SAAO,UAAU,SAAY,YAAY,QAAQ,UAAU;AAC7D;AAEA,eAAe,oBACb,MACA,UAC8B;AAC9B,MAAI,YAAY,IAAI,GAAG;AACrB,UAAM,EAAE,IAAI,SAAS,IAAI;AACzB,UAAM,SAAkC,CAAC;AAEzC,eAAW,SAAS,YAAY,CAAC,GAAG;AAClC,YAAM,QAAQ,MAAM,oBAAoB,OAAO,QAAQ;AACvD,UAAI,OAAO,SAAS,UAAU,MAAO,QAAO;AAC5C,UAAI,OAAO,SAAS,UAAU,KAAM,QAAO,OAAO;AAClD,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,QAAI,OAAO,MAAO,QAAO,OAAO,SAAS,MAAS,IAAI,SAAY;AAClE,QAAI,OAAO,KAAM,QAAO,OAAO,SAAS,MAAS,IAAI,SAAY;AAGjE,QAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,WAAO,OAAO,SAAS,MAAS,IAAI,SAAY;AAAA,EAClD;AAEA,MAAI,sBAAsB,IAAI,EAAG,QAAO;AAExC,SAAO,aAAa,MAA2B,UAAU,CAAC,CAAC;AAC7D;;;ACvKA,SAAS,SAAAC,cAAa;AAUf,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gBAAgB,CAAC,gBAAgB,GAAG,qBAAqB;AAe/D,SAAS,uBAAuB,SAA+B;AACpE,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,CAAC,cAAc;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,OAAO;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,GAAG,qBAAqB;AAAA,IAClC;AACE,aAAO,CAAC,GAAG,aAAa;AAAA,EAC5B;AACF;AAQA,IAAM,qBAAiD;AAAA,EACrD,cAAc;AAAA,EAEd,MAAM;AAAA,EACN,cAAc;AAAA,EACd,OAAO;AAAA,EAEP,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,cAAc;AAAA,EAEd,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EAEjB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,UAAU;AAAA,EAEV,MAAM;AAAA,EACN,cAAc;AAAA,EACd,OAAO;AACT;AAcO,SAAS,kBAAkB,OAAyB;AACzD,MAAIC;AAEJ,MAAI;AACF,IAAAA,YAAWD,OAAM,OAAO,EAAE,YAAY,KAAK,CAAC;AAAA,EAC9C,QAAQ;AAGN,WAAO,CAAC;AAAA,EACV;AAEA,aAAW,cAAcC,UAAS,aAAa;AAC7C,QAAI,WAAW,SAAS,sBAAuB;AAC/C,QAAI,WAAW,cAAc,QAAS;AAEtC,UAAM,SAAmB,CAAC;AAE1B,eAAW,aAAa,WAAW,aAAa,YAAY;AAC1D,UAAI,UAAU,SAAS,QAAS,QAAO,KAAK,UAAU,KAAK,KAAK;AAAA,IAClE;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;AAKA,IAAM,6BAA6B;AAEnC,IAAM,kBAAkB,oBAAI,IAAoC;AAEhE,SAAS,kBAAkB,OAAuC;AAChE,QAAM,UAAU,oBAAI,IAAgB;AAEpC,aAAW,SAAS,kBAAkB,KAAK,GAAG;AAC5C,UAAM,aAAa,mBAAmB,KAAK;AAC3C,QAAI,WAAY,SAAQ,IAAI,UAAU;AAAA,EACxC;AAEA,MAAI,QAAQ,SAAS,EAAG,QAAO;AAE/B,SAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AACvB;AAcO,SAAS,cAAc,OAAuC;AACnE,MAAI,gBAAgB,IAAI,KAAK,EAAG,QAAO,gBAAgB,IAAI,KAAK;AAEhE,QAAM,WAAW,kBAAkB,KAAK;AAExC,MAAI,gBAAgB,OAAO,4BAA4B;AACrD,oBAAgB,IAAI,OAAO,QAAQ;AAAA,EACrC;AAEA,SAAO;AACT;;;ACtKA,IAAM,mBAAmB;AACzB,IAAM,YAAY;AAElB,IAAM,UAAU,IAAI,YAAY;AAIhC,SAAS,MAAM,OAAuB;AACpC,MAAI,OAAO;AAEX,aAAW,QAAQ,QAAQ,OAAO,KAAK,GAAG;AACxC,YAAQ;AACR,WAAO,KAAK,KAAK,MAAM,SAAS,MAAM;AAAA,EACxC;AAEA,SAAO,SAAS;AAClB;AAQA,SAAS,OAAO,MAAsB;AACpC,MAAI,IAAI,SAAS;AAEjB,OAAK,MAAM;AACX,MAAI,KAAK,KAAK,GAAG,UAAU,MAAM;AACjC,OAAK,MAAM;AACX,MAAI,KAAK,KAAK,GAAG,UAAU,MAAM;AACjC,OAAK,MAAM;AAEX,SAAO,MAAM;AACf;AAOO,SAAS,OAAO,MAAc,KAAqB;AACxD,SAAO,OAAO,MAAM,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AACvC;AAGO,SAAS,OAAO,MAAc,KAAa,SAAyB;AACzE,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAM,IAAI,WAAW,0CAA0C,OAAO,EAAE;AAAA,EAC1E;AAEA,SAAO,OAAO,MAAM,GAAG,IAAI;AAC7B;AAGO,SAAS,YAAY,MAAc,QAAwB;AAChE,SAAO,OAAO,MAAM,QAAQ,GAAG,IAAI;AACrC;;;AC/CA,SAAS,gBAAgB,MAAsC;AAC7D,SACE,SAAS,QACT,OAAO,SAAS,YAChB,OAAO,OAAO,MAAM,WAAW,KAC/B,OAAO,OAAO,MAAM,UAAU,KAC9B,OAAO,OAAO,MAAM,OAAO;AAE/B;AAUA,SAAS,YAAY,SAAiB,OAA+B;AACnE,MAAI;AACF,WAAO,IAAI,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,eACP,YACA,WACoB;AACpB,MAAI,CAAC,OAAO,OAAO,YAAY,SAAS,EAAG,QAAO;AAElD,QAAM,QAAS,WAAuC,SAAS;AAE/D,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAcO,SAAS,YACd,MACA,YACS;AACT,QAAM,OAAO,eAAe,YAAY,KAAK,SAAS;AACtD,QAAM,EAAE,MAAM,IAAI;AAElB,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,CAAC,CAAC,QAAQ,KAAK,SAAS,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,KAAK;AAAA,IACvC,KAAK;AACH,aAAO,CAAC,CAAC,QAAQ,YAAY,OAAO,IAAI,MAAM;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,CAAC,QAAQ,YAAY,OAAO,IAAI,MAAM;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,CAAC;AAAA,IACX,KAAK;AACH,aAAO,CAAC;AAAA,IACV;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,iBACd,OACA,YACS;AACT,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAElC,SAAO,MACJ,OAAO,eAAe,EACtB,MAAM,CAAC,SAAS,YAAY,MAAM,UAAU,CAAC;AAClD;;;AX7FA,IAAMC,aAAQ,cAAAC,SAAY,gCAAgC;AAyDnD,SAAS,yBAAyB,MAAsC;AAC7E,QAAM,UAAU,oBAAI,IAAgB;AAEpC,aAAW,WAAW,KAAK,gBAAgB,CAAC,GAAG;AAC7C,QAAI,QAAQ,sBAAsB,MAAM;AACtC,iBAAW,cAAc,cAAe,SAAQ,IAAI,UAAU;AAC9D;AAAA,IACF;AAEA,eAAW,WAAW,QAAQ,oBAAoB;AAChD,iBAAW,cAAc,uBAAuB,OAAO,GAAG;AACxD,gBAAQ,IAAI,UAAU;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,MAA4C;AAC5E,SAAO,KAAK,mBAAmB;AACjC;AAEA,SAAS,oBACP,SACA,SACS;AACT,aAAW,cAAc,SAAS;AAChC,QAAI,QAAQ,IAAI,UAAU,EAAG,QAAO;AAAA,EACtC;AAEA,SAAO;AACT;AAUA,SAAS,WAAqC,OAAY,MAAmB;AAC3E,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,UAAM,aAAa,OAAO,MAAM,SAAS,EAAE,EAAE,EAAE,IAAI,OAAO,MAAM,SAAS,EAAE,EAAE,EAAE;AAC/E,WAAO,eAAe,IAAI,aAAa,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,EAChE,CAAC;AACH;AAMO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACrB,YAA6B,CAAC;AAAA,EAEtC,cAAc;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAwB;AACnC,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAA8B;AAC5B,UAAM,QAAQ,IAAI,mBAAkB;AACpC,UAAM,aAAa,KAAK,SAAS;AACjC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,eAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAyB;AACpC,WAAO,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBACJ,YACA,UACkB;AAClB,eAAW,QAAQ,KAAK,WAAW;AACjC,YAAM,cAAc,KAAK,oBAAoB;AAC7C,UAAI,CAAC,eAAe,CAAC,4BAA4B,WAAW,EAAG;AAC/D,UAAI,CAAC,iBAAiB,KAAK,OAAO,UAAU,EAAG;AAE/C,UAAI;AACF,YACG,MAAM,6BAA6B,aAAa,QAAQ,MACzD,WACA;AACA,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAEN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAsC;AAChD,WAAO,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,YACJ,MACA,YACA,UACA,kBAAuC,oBAAI,IAAY,GACtC;AACjB,UAAM,gBAAgB,MAAM,KAAK,iBAAiB,YAAY,QAAQ;AACtE,WAAO,KAAK,eAAe,MAAM,eAAe,eAAe;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,iBACJ,YACA,UAC0B;AAC1B,IAAAD;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,YAAY,KAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,IAClE;AAEA,QAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,MAAAA,OAAM,mDAAmD;AACzD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,gBAAgB,MAAM,KAAK;AAAA,MAC/B,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAEA,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,YAAY,KAAK,UAAU;AAAA,QAC3B,eAAe,cAAc;AAAA,QAC7B,iBAAiB,cAAc,IAAI,CAAC,OAAO;AAAA,UACzC,IAAI,EAAE;AAAA,UACN,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eACE,MACA,eACA,kBAAuC,oBAAI,IAAY,GAC/C;AACR,UAAM,aAAa,cAAc;AAAA,MAC/B,CAAC,SAAS,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAAA,IACxC;AAEA,QAAI,CAAC,WAAW,QAAQ;AACtB,MAAAA,OAAM,0DAA0D;AAChE,aAAO,CAAC;AAAA,IACV;AAYA,UAAM,iBAAiB,IAAI,IAAI,cAAc,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAEnE,UAAM,UAAU,oBAAI,IAAgB;AACpC,eAAW,MAAM,iBAAiB;AAChC,UAAI,CAAC,eAAe,IAAI,EAAE,EAAG;AAE7B,YAAM,eAAe,KAAK,YAAY,EAAE;AACxC,UAAI,CAAC,aAAc;AACnB,iBAAW,cAAc,yBAAyB,YAAY,GAAG;AAC/D,gBAAQ,IAAI,UAAU;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,WAAW,oBAAI,IAAkB;AAKvC,UAAM,eAAe,KAAK,iBAAiB,YAAY,SAAS,IAAI;AACpE,UAAM,eAAe;AAAA,MACnB,GAAG,aAAa,OAAO,iBAAiB;AAAA,MACxC,GAAG,aAAa,OAAO,CAAC,SAAS,CAAC,kBAAkB,IAAI,CAAC;AAAA,IAC3D;AAEA,eAAW,QAAQ,cAAc;AAC/B,YAAM,UAAU,yBAAyB,IAAI;AAK7C,UAAI,CAAC,kBAAkB,IAAI,KAAK,oBAAoB,SAAS,OAAO,GAAG;AACrE,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QAChE;AACA;AAAA,MACF;AAKA,YAAM,SAAS,KAAK,cAAc,MAAM,IAAI;AAC5C,UAAI,CAAC,OAAQ;AAEb,iBAAW,cAAc,QAAS,SAAQ,IAAI,UAAU;AACxD,eAAS,IAAI,KAAK,IAAI,MAAM;AAAA,IAC9B;AAIA,UAAM,UAAU,WACb,OAAO,CAAC,SAAS,SAAS,IAAI,KAAK,EAAE,CAAC,EACtC,IAAI,CAAC,SAAS,SAAS,IAAI,KAAK,EAAE,CAAS;AAE9C,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,eAAe,QAAQ;AAAA,QACvB,qBAAqB,CAAC,GAAG,OAAO;AAAA,QAChC,UAAU,QAAQ,IAAI,CAAC,OAAO;AAAA,UAC5B,QAAQ,EAAE;AAAA,UACV,WAAW,EAAE,YAAY;AAAA,QAC3B,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBACN,YACA,SACA,MACiB;AACjB,UAAM,YAAY,IAAI,IAAI,OAAO;AAEjC,eAAW,QAAQ,YAAY;AAC7B,YAAM,UAAU,yBAAyB,IAAI;AAC7C,UAAI,oBAAoB,SAAS,SAAS,GAAG;AAC3C,eAAO,WAAW,YAAY,IAAI;AAAA,MACpC;AACA,iBAAW,cAAc,QAAS,WAAU,IAAI,UAAU;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAc,MAAqB,MAA2B;AACpE,UAAM,oBAAoB,YAAY,MAAM,KAAK,EAAE;AACnD,QAAI,wBAAwB;AAE5B,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,UAAU,KAAK,aAAa,IAAI,CAAC,OAAO;AAAA,UACtC,IAAI,EAAE;AAAA,UACN,QAAQ,EAAE;AAAA,UACV,mBAAmB,EAAE;AAAA,QACvB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,eAAW,WAAW,KAAK,cAAc;AACvC,+BAAyB,QAAQ,oBAAoB;AAErD,MAAAA;AAAA,QACE;AAAA,QACA,KAAK,UAAU;AAAA,UACb,WAAW,QAAQ;AAAA,UACnB,eAAe,QAAQ;AAAA,UACvB,mBAAmB,QAAQ;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,YAAY,yBAAyB;AAAA,QACvC,CAAC;AAAA,MACH;AAEA,UAAI,yBAAyB,mBAAmB;AAC9C,cAAM,uBAAuB;AAAA,UAC3B;AAAA,UACA;AAAA,QACF;AACA,cAAM,SAAS;AAAA,UACb,IAAI,KAAK;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,mBAAmB,KAAK;AAAA,UACxB,aAAa;AAAA,YACX,IAAI,QAAQ;AAAA,YACZ,QAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,YACE,qBAAqB,SAAS,IAC1B,EAAE,YAAY,qBAAqB,IACnC;AAAA,QACR;AACA,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU,MAAM;AAAA,QACvB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,kBAAkB,CAAC;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,cACZ,OACA,YACA,UAC0B;AAC1B,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,YAAY,MAAM,QAAQ,WAAW,CAAC;AAAA,IACzD;AAEA,UAAM,gBAAgB,MAAM,OAAO,CAAC,SAAS;AAC3C,YAAM,WAAW,iBAAiB,KAAK,OAAO,UAAU;AAExD,MAAAA;AAAA,QACE,kCAAkC,KAAK,MAAM;AAAA,QAC7C,KAAK,UAAU;AAAA,UACb,QAAQ,KAAK;AAAA,UACb,YAAY,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,SAAS;AAAA,UAC5D,OAAO,KAAK;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAED,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,eAAe,cAAc;AAAA,QAC7B,eAAe,cAAc,IAAI,CAAC,OAAO;AAAA,UACvC,IAAI,EAAE;AAAA,UACN,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,oBAAoB,eAAe,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,oBACZ,eACA,UAC0B;AAC1B,UAAM,cAAc,cAAc;AAAA,MAChC,CAAC,SAAS,KAAK,oBAAoB;AAAA,IACrC;AACA,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,QAAQ,MAAM,QAAQ;AAAA,MAC1B,cAAc,IAAI,OAAO,SAAS;AAChC,cAAM,cAAc,KAAK,oBAAoB;AAC7C,YAAI,CAAC,YAAa,QAAO;AAEzB,YAAI,CAAC,UAAU;AACb,UAAAA;AAAA,YACE,kCAAkC,KAAK,MAAM;AAAA,UAC/C;AACA,iBAAO;AAAA,QACT;AAMA,cAAM,QAAQ,kBAAkB,aAAa,QAAQ;AACrD,YAAI,MAAM,QAAQ;AAChB,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AACA,UAAAA;AAAA,YACE,kCAAkC,KAAK,MAAM;AAAA,YAC7C,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,OAAO,SAAS,CAAC;AAAA,UACrD;AACA,iBAAO,aAAa,UAAU,OAAO;AAAA,QACvC;AAEA,YAAI;AACF,gBAAM,EAAE,QAAQ,IAAI,MAAM,iBAAiB,aAAa,QAAQ;AAChE,UAAAA;AAAA,YACE,kCAAkC,KAAK,MAAM;AAAA,YAC7C,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,UAC5B;AACA,iBAAO,UAAU,OAAO;AAAA,QAC1B,SAAS,KAAK;AACZ,UAAAA;AAAA,YACE,kCAAkC,KAAK,MAAM;AAAA,YAC7C,OAAO,GAAG;AAAA,UACZ;AACA,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,OAAO,CAAC,SAAgC,SAAS,IAAI;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,0BACE,YACA,eAIO;AACP,UAAM,OAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,UAAU;AAC/D,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,aAAa;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;;;ADnmBA,IAAAE,gBAAwB;;;AaZxB,IAAAC,gBAAwB;AAExB,IAAMC,aAAQ,cAAAC,SAAY,0BAA0B;AAqC7C,IAAM,sCAAsC;AAWnD,eAAsB,uBACpB,oBACA,SACA,YAAoB,qCACkB;AACtC,MAAI,CAAC,mBAAoB,QAAO;AAEhC,MAAI;AAEJ,MAAI;AACF,UAAM,UAAU,IAAI,QAAmB,CAAC,YAAY;AAClD,cAAQ,WAAW,MAAM;AAIvB,gBAAQ;AAAA,UACN,2CAA2C,SAAS;AAAA,QACtD;AACA,gBAAQ,MAAS;AAAA,MACnB,GAAG,SAAS;AAAA,IACd,CAAC;AAED,UAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,MAClC,QAAQ,QAAQ,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC/C;AAAA,IACF,CAAC;AAED,QAAI,CAAC,YAAY,OAAO,SAAS,eAAe,WAAW;AACzD,MAAAD,OAAM,qDAAqD;AAC3D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,GAAI,SAAS,oBACT,EAAE,mBAAmB,SAAS,kBAAkB,IAChD,CAAC;AAAA,IACP;AAAA,EACF,SAAS,OAAO;AAEd,IAAAA,OAAM,6CAA6C,OAAO,KAAK,CAAC;AAChE,YAAQ,MAAM,0CAA0C,KAAK;AAC7D,WAAO;AAAA,EACT,UAAE;AACA,QAAI,MAAO,cAAa,KAAK;AAAA,EAC/B;AACF;;;AC7DO,IAAM,6BAA6B;AASnC,IAAM,sBAAsB;AAU5B,IAAM,oBAAoB;AAYjC,IAAM,uBAAuB;AAatB,IAAM,2BAA2B;AAQjC,IAAM,gCAAgC;AAE7C,SAAS,aAAa,OAA+B;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SAAO,QAAQ,UAAU,MAAM,UAAU,aAAa,EAAE;AAC1D;AAGA,SAAS,cAAc,MAAY,cAAoC;AACrE,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,aAAa;AAAA,MACX,IAAI,KAAK,YAAY;AAAA,MACrB,QAAQ,KAAK,YAAY;AAAA,IAC3B;AAAA,IACA,GAAI,OAAO,SAAS,YAAY,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,KAAc,IAAI,CAAC;AAAA,EACnE;AACF;AAGA,SAAS,2BACP,IACA,cACa;AACb,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,aAAa,EAAE,IAAI,IAAI,QAAQ,GAAG;AAAA,IAClC,GAAI,OAAO,SAAS,YAAY,IAAI,EAAE,aAAqC,IAAI,CAAC;AAAA,IAChF,iBAAiB;AAAA,EACnB;AACF;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,QAAM,OAAQ,MAAsB;AACpC,SAAO,OAAO,SAAS,IAAI,IAAI,OAAO;AACxC;AAUO,SAAS,qBAAqB,KAAW,gBAAyB;AACvE,QAAM,UAAU,IAAI,KAAK,GAAG;AAC5B,UAAQ,SAAS,QAAQ,SAAS,IAAI,EAAE;AAExC,SAAO,EAAE,SAAS,UAAU,OAAgB,QAAQ,gBAAgB,MAAM,IAAI;AAChF;AAEO,SAAS,kBAAkB,KAA8C;AAC9E,MAAI,CAAC,IAAK,QAAO,CAAC;AAElB,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO,CAAC;AAGnD,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO,EAAE,CAAE,OAAgB,EAAE,GAAG,cAAc,MAAc,EAAE;AAAA,EAChE;AAEA,QAAM,UAAwB,CAAC;AAC/B,QAAM,EAAE,CAAC,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,IAAI;AAK/D,aAAW,SAAS,OAAO,OAAO,KAAK,GAAG;AACxC,QAAI,aAAa,KAAK,GAAG;AACvB,cAAQ,MAAM,EAAE,IAAI,cAAc,OAAO,iBAAiB,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,oBAAoB,OAAO,qBAAqB,UAAU;AAC5D,eAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACzD,UAAI,MAAM,CAAC,QAAQ,EAAE,EAAG,SAAQ,EAAE,IAAI,2BAA2B,IAAI,IAAI;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,CAAC,KAAK,CAAC,GAA0B,CAAC,KAAK,CAAC,OACvD,EAAE,gBAAgB,MAAM,EAAE,gBAAgB,MAAM,IAAI,cAAc,GAAG;AAExE,IAAM,eAAe,CAAC,UACpB,mBAAmB,KAAK,UAAU,KAAK,CAAC,EAAE;AASrC,SAAS,sBAAsB,SAA+B;AACnE,QAAM,QAAiC,CAAC;AACxC,QAAM,mBAA4C,CAAC;AAEnD,aAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,QAAI,MAAM,gBAAiB,kBAAiB,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,QACvD,OAAM,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,EAC7B;AAEA,QAAM,QAAiC,CAAC;AACxC,QAAM,OAAO,CAAC,SAAS,6BACrB,aAAa,KAAK,KAAK;AACzB,QAAM,aAAa,iBAAiB,SAChC,2BAA2B,gCAC3B;AAEJ,aAAW,CAAC,IAAI,KAAK,KAAK,MAAM,KAAK,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG;AAC1E,UAAM,EAAE,IAAI;AACZ,QAAI,CAAC,KAAK,UAAU,KAAK,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACtD,aAAO,MAAM,EAAE;AACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,OAAQ,QAAO,KAAK,UAAU,KAAK;AAEzD,QAAM,UAAkC,CAAC;AACzC,QAAM,oBAAoB,IAAI;AAE9B,aAAW,CAAC,IAAI,KAAK,KAAK,iBAAiB,KAAK,QAAQ,GAAG;AACzD,YAAQ,EAAE,IAAI,MAAM,gBAAgB;AACpC,QAAI,CAAC,KAAK,GAAG;AACX,aAAO,QAAQ,EAAE;AACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,KAAK,OAAO,EAAE,OAAQ,QAAO,MAAM,oBAAoB;AACnE,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEO,SAAS,gBACd,SACA,MACA,cACc;AACd,SAAO,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,cAAc,MAAM,YAAY,EAAE;AACpE;AAaO,SAAS,wBACd,YACA,gBACA,WAAgC,oBAAI,IAAI,GAChC;AACR,QAAM,OAAe,CAAC;AACtB,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,QAAQ,YAAY;AAC7B,QAAI,CAAC,aAAa,IAAI,EAAG;AACzB,QAAI,KAAK,IAAI,KAAK,EAAE,EAAG;AACvB,QAAI,eAAe,KAAK,EAAE,KAAK,SAAS,IAAI,KAAK,EAAE,EAAG;AAEtD,SAAK,IAAI,KAAK,EAAE;AAChB,SAAK,KAAK,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAcO,SAAS,gBACd,UACA,UACA,SACmB;AACnB,QAAM,OAAO,oBAAI,IAAkB;AACnC,MAAI,SAAS,YAAY,SAAS;AAChC,eAAW,QAAQ,SAAS,MAAO,MAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAC3D;AACA,aAAW,QAAQ,SAAU,MAAK,IAAI,KAAK,IAAI,IAAI;AAEnD,SAAO,EAAE,SAAS,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE;AAC9C;AAUO,SAAS,iBACd,SACA,gBAC4D;AAC5D,QAAM,WAAW,oBAAI,IAA6B;AAElD,aAAW,SAAS,SAAS;AAC3B,eAAW,YAAY,OAAO;AAC5B,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,aAAa,IAAI,EAAG;AACzB,UAAI,eAAe,KAAK,EAAE,KAAK,SAAS,IAAI,KAAK,EAAE,EAAG;AAEtD,eAAS,IAAI,KAAK,IAAI,QAAQ;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,GAAG,SAAS,OAAO,CAAC;AACtC,QAAM,cAAc,SAAS;AAAA,IAC3B,CAAC,SAAS,EAAE,cAAc,aAAa,MACrC,gBAAgB,SAAS,cAAc,YAAY;AAAA,IACrD;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,YAAY;AACjC;AAaO,SAAS,eACd,cAC2B;AAC3B,MAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,MAAI,aAAa,WAAW,EAAG,QAAO,aAAa,CAAC;AACpD,SAAO;AACT;AAGO,SAAS,iBACd,cACQ;AACR,MAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,QAAM,OAAO,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC,YAAY;AAEvE,SAAO,KAAK,OAAO,YAAY;AACjC;;;AdhVA,IAAME,aAAQ,cAAAC,SAAY,sBAAsB;AAoDhD,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoE7B,IAAM,oBAAoB,IAAI,kBAAkB;AAGhD,SAAS,0BACP,SACA,oBACQ;AACR,SAAO,cAAc,OAAO,IAAI,sBAAsB,SAAS;AACjE;AAGA,eAAe,qBACb,YACA,WACA,OACgB;AAChB,QAAM,eAAe;AAAA,IACnB,WAAW,WAAW;AAAA,IACtB,WAAW;AAAA,EACb;AAEA,EAAAD;AAAA,IACE;AAAA,IACA,KAAK,UAAU;AAAA,MACb;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,oBAAoB,WAAW;AAAA,IACjC,CAAC;AAAA,EACH;AAIA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAM,UAAU;AAAA,MAC3B;AAAA,QACE,UAAU,CAAC,sBAAsB;AAAA,QACjC,eAAe;AAAA,UACb,QAAQ;AAAA,UACR,sBAAsB;AAAA,QACxB;AAAA,QACA,mBAAmB,CAAC,UAAe,UAAU;AAAA,MAC/C;AAAA,MACA,OAAO;AAAA,QACL;AAAA,MACF,MAAwD;AAGtD,cAAME,OACJ;AAEF,cAAMC,QAAO,MAAM,MAAMD,MAAK;AAAA,UAC5B,SAAS;AAAA,YACP,eAAe,UAAU,KAAK;AAAA,UAChC;AAAA,QACF,CAAC;AAED,uBAAe;AAAA,UACb,aAAa;AAAA,UACb,UAAUC;AAAA,QACZ,CAAC;AAED,cAAM,EAAE,OAAO,IAAIA;AACnB,YAAI,WAAW,KAAK;AAClB,cAAI;AAEJ,cAAI,WAAW,KAAK;AAClB,sBACE;AAAA,UACJ,OAAO;AACL,sBAAU,sEAAsE,MAAM;AAAA,UACxF;AAEA,UAAAH,OAAM,kCAAkC,OAAO,EAAE;AACjD,kBAAQ,MAAM,OAAO;AACrB,iBAAO;AAAA,QACT;AAEA,cAAM,OAAO,MAAMG,MAAK,KAAK;AAC7B,QAAAH,OAAM,mCAAmC,KAAK,UAAU,IAAI,CAAC;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,qBAAiB,MAAM;AACvB,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb;AAAA,QACA,cAAc,CAAC,CAAC;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU,GAAG;AAAA,IACpB;AACA,YAAQ,MAAM,oDAAoD,GAAG;AAAA,EACvE;AAGA,QAAM,WAAW,iBACb,GAAG,YAAY,IAAI,cAAc,KACjC;AAEJ,EAAAA,OAAM,+CAA+C,QAAQ;AAE7D,SAAO,UAAU;AAAA,IACf;AAAA,MACE,UAAU,CAAC,QAAQ;AAAA,MACnB,eAAe;AAAA,QACb,QAAQ;AAAA;AAAA,QACR,sBAAsB;AAAA;AAAA,QACtB,cAAc;AAAA;AAAA,MAChB;AAAA,MACA,mBAAmB,CAAC,WAClB,MAAM,QAAQ,MAAM,KAAK,OAAO,UAAU;AAAA,MAC5C,aAAa;AAAA,IACf;AAAA,IACA,OAAO,EAAE,aAAa,MAA2B;AAC/C,YAAM,YAAY,KAAK,IAAI;AAC3B,MAAAA;AAAA,QACE;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,WAAW,MAAM,sBAAsB;AAAA,UACnE,WAAW,EAAE,QAAQ,UAAU;AAAA,QACjC,CAAC;AAED,cAAM,gBAAgB,KAAK,IAAI,IAAI;AACnC,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,UAAU,GAAG,aAAa;AAAA,YAC1B,SAAS,CAAC,CAAC;AAAA,YACX,UAAU,CAAC,CAAC;AAAA,YACZ,YAAY,MAAM,gBAAgB;AAAA,YAClC,YAAY,MAAM,gBAAgB,OAAO,UAAU;AAAA,YACnD,sBAAsB,MAAM,yBAAyB,UAAU;AAAA,UACjE,CAAC;AAAA,QACH;AAEA,uBAAe;AAAA,UACb,aAAa;AAAA,QACf,CAAC;AAED,YAAI,OAAO;AACT,UAAAA;AAAA,YACE;AAAA,YACA,KAAK,UAAU;AAAA,cACb;AAAA,cACA,WAAW,OAAO;AAAA,cAClB,cAAc,OAAO,WAAW,KAAK,UAAU,KAAK;AAAA,YACtD,CAAC;AAAA,UACH;AACA,gBAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,QAC3D;AAKA,cAAM,QACJ,MAAM,gBAAgB,OAAO,IAAI,CAAC,SAAc,KAAK,IAAI,KAAK,CAAC;AACjE,cAAM,mBAAmB,MAAM,2BAA2B,CAAC;AAC3D,cAAM,QAAQ,CAAC,GAAG,OAAO,GAAG,gBAAgB;AAE5C,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,YAAY,MAAM;AAAA,YAClB;AAAA,YACA,OAAO,MAAM,IAAI,CAAC,UAAe;AAAA,cAC/B,IAAI,KAAK;AAAA,cACT,QAAQ,KAAK;AAAA,cACb,YAAY,KAAK,OAAO,UAAU;AAAA,cAClC,eAAe,KAAK,cAAc,UAAU;AAAA,YAC9C,EAAE;AAAA,UACJ,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,gBAAgB,KAAK,IAAI,IAAI;AACnC,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,YAChD,UAAU,GAAG,aAAa;AAAA,YAC1B,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,UAChD,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAmBA,SAAS,kBAAkB,SAA2B;AACpD,QAAM,aAAa,QAAQ,QAAQ,IAAI,aAAa,GAAG,YAAY;AACnE,QAAM,UAAU,QAAQ,QAAQ,IAAI,SAAS,GAAG,YAAY;AAC5D,QAAM,WAAW,QAAQ,QAAQ,IAAI,WAAW,GAAG,YAAY;AAE/D,SAAO,CAAC,YAAY,SAAS,QAAQ,EAAE;AAAA,IAAK,CAAC,UAC3C,OACI,MAAM,GAAG,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,SAAS,UAAU;AAAA,EACxB;AACF;AASA,SAAS,cACP,MACA,SACA,iBACU;AACV,QAAM,uBAAuB,kCAAkC,MAAM,OAAO;AAE5E,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,mBAAmB,KAAK;AAAA,IACxB,aAAa;AAAA,MACX,IAAI,QAAQ;AAAA,MACZ,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,YACE,qBAAqB,SAAS,IAC1B,EAAE,YAAY,qBAAqB,IACnC;AAAA,IACN;AAAA,EACF;AACF;AASA,eAAe,cACb,YACA,WACA,OACkB;AAClB,MAAI,CAAC,aAAa,CAAC,OAAO;AACxB,IAAAA;AAAA,MACE;AAAA,IACF;AACA,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,qBAAqB,YAAY,WAAW,KAAK;AACrE,sBAAkB,aAAa,KAAK;AACpC,IAAAA,OAAM,iEAAiE;AACvE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,IAAAA,OAAM,2CAA2C,KAAK,UAAU,KAAK,CAAC;AACtE,YAAQ,MAAM,2CAA2C,KAAK;AAC9D,WAAO,kBAAkB,SAAS;AAAA,EACpC;AACF;AAMA,SAAS,uBAAuB,SAAgC;AAC9D,QAAM,MAAa,cAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAE5D,QAAM,MAAM,MAAM,mBAAmB,KAAK,MAAM,0BAA0B;AAE1E,SAAO,kBAAkB,GAAG;AAC9B;AAOA,SAAS,oBACP,OACA,QACA,WAMO;AACP,QAAM,OAAO,MAAM,YAAY,MAAM;AACrC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACjE,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,EAAE,MAAM,QAAQ;AACzB;AAIA,SAAS,kBAAkB;AACzB,QAAM,WAAW,oBAAI,KAAK;AAC1B,WAAS,SAAS,SAAS,SAAS,IAAI,CAAC;AACzC,SAAO;AACT;AAgCA,IAAM,8BAA8B;AAiBpC,SAAS,SAAS,YAAuB,WAA+B;AACtE,MAAI,WAAW,sBAAsB,UAAU,mBAAmB;AAChE,WAAO,WAAW;AAAA,EACpB;AAEA,SACE,WAAW,aAAa,UAAU,cACjC,WAAW,eAAe,UAAU,cACnC,WAAW,KAAK,GAAG,cAAc,UAAU,KAAK,EAAE,IAAI;AAE5D;AAEA,SAAS,cAA8B;AACrC,SAAO,EAAE,OAAO,CAAC,GAAG,SAAS,QAAW,cAAc,CAAC,EAAE;AAC3D;AAuBA,SAAS,gBACP,MACA,gBACA,eACuC;AACvC,QAAM,UAAkD,CAAC;AAEzD,aAAW,SAAS,MAAM;AACxB,QAAI,CAAC,eAAe,IAAI,MAAM,KAAK,EAAE,EAAG;AAExC,UAAM,QAAQ,cAAc,YAAY,MAAM,KAAK,EAAE;AACrD,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,mBAAmB,kBAAkB,KAAK;AAAA,IAC5C;AAEA,eAAW,cAAc,yBAAyB,KAAK,GAAG;AACxD,YAAM,YAAY,QAAQ,UAAU;AAEpC,UAAI,WAAW;AACb,cAAM,iBAAiB,SAAS,YAAY,SAAS;AAErD,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb;AAAA,YACA,eAAe,iBAAiB,MAAM,KAAK,KAAK,UAAU,KAAK;AAAA,YAC/D,eAAe,iBAAiB,UAAU,KAAK,KAAK,MAAM,KAAK;AAAA,YAC/D,QACE,WAAW,sBAAsB,UAAU,oBACvC,kCACA;AAAA,UACR,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,eAAgB;AAAA,MACvB;AAEA,cAAQ,UAAU,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM;AAAA,MACpD;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAgBA,SAAS,mBACP,MACA,gBACA,eACsB;AACtB,SAAO,KACJ,OAAO,CAAC,UAAU,eAAe,IAAI,MAAM,KAAK,EAAE,CAAC,EACnD,IAAe,CAAC,UAAU;AACzB,UAAM,QAAQ,cAAc,YAAY,MAAM,KAAK,EAAE;AACrD,WAAO,EAAE,GAAG,OAAO,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,KAAK,EAAE;AAAA,EAC5E,CAAC,EACA;AAAA,IACC,CAAC,MAAM,UAAW,CAAC,QAAQ,SAAS,OAAO,IAAI,IAAI,QAAQ;AAAA,IAC3D;AAAA,EACF,GAAG;AACP;AAUA,SAAS,kBAAkB,aAA8C;AACvE,QAAM,QAAQ,OAAO,OAAO,YAAY,eAAe,CAAC,EAAE;AAAA,IACxD,CAAC,gBACE;AAAA,MACC,IAAI,WAAW;AAAA,MACf,QAAQ,WAAW;AAAA,MACnB,aAAa,EAAE,GAAG,WAAW,YAAY;AAAA,MACzC,iBAAiB;AAAA,IACnB;AAAA,EACJ;AAKA,QAAM,YAAY,YAAY,qBAAqB,GAAG;AACtD,QAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS,KAAK,MAAM,CAAC;AAEtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,cAAc,UACV,OAAO,YAAY,cAAc,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IACzD,CAAC;AAAA,EACP;AACF;AAgBA,eAAsB,YAAY;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,EAAAA;AAAA,IACE;AAAA,IACA,KAAK,UAAU;AAAA,MACb,gBAAgB,CAAC,CAAC;AAAA,MAClB,qBAAqB;AAAA,MACrB,YAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB,OAAO,GAAG;AAC9B,IAAAA,OAAM,4DAA4D;AAClE,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,CAAC,aAAa;AAChB,IAAAA,OAAM,4DAA4D;AAClE,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,CAAC,WAAW,SAAS;AACvB,IAAAA,OAAM,mDAAmD;AACzD,YAAQ,MAAM,mDAAmD;AACjE,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI;AACF,QAAI,CAAE,MAAM,cAAc,YAAY,WAAW,KAAK,GAAI;AACxD,MAAAA,OAAM,6DAA6D;AACnE,aAAO,kBAAkB,WAAW;AAAA,IACtC;AAIA,UAAM,QAAQ,kBAAkB,SAAS;AAEzC,UAAM,OAAyB,CAAC;AAGhC,eAAW,cAAc,OAAO,OAAO,YAAY,eAAe,CAAC,GAAG;AACpE,YAAM,WAAW;AAAA,QACf;AAAA,QACA,WAAW;AAAA,QACX,WAAW,YAAY;AAAA,MACzB;AAEA,UAAI,CAAC,UAAU;AACb,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,QAAQ,WAAW;AAAA,YACnB,WAAW,WAAW,YAAY;AAAA,UACpC,CAAC;AAAA,QACH;AACA,oBAAY,gBAAgB,WAAW,EAAE;AACzC;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,QAAQ,IAAI;AAI1B,UACE,WAAW,WAAW,KAAK,UAC3B,WAAW,YAAY,WAAW,QAAQ,QAC1C;AACA,oBAAY,cAAc;AAAA,UACxB,IAAI,KAAK;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,aAAa,EAAE,IAAI,QAAQ,IAAI,QAAQ,QAAQ,OAAO;AAAA,QACxD,CAAC;AAAA,MACH;AAEA,WAAK,KAAK;AAAA,QACR,MAAM,cAAc,MAAM,SAAS,MAAS;AAAA,QAC5C,YAAY,WAAW;AAAA,MACzB,CAAC;AAAA,IACH;AAQA,UAAM,eAAe,OAAO,OAAO,uBAAuB,OAAO,CAAC,EAAE;AAAA,MAClE,CAAC,GAAG,OACD,EAAE,gBAAgB,aAAa,EAAE,gBAAgB,aAClD,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,IAC3B;AAEA,eAAW,eAAe,cAAc;AACtC,UAAI,KAAK,KAAK,CAAC,UAAU,MAAM,KAAK,OAAO,YAAY,EAAE,EAAG;AAE5D,YAAM,WAAW;AAAA,QACf;AAAA,QACA,YAAY;AAAA,QACZ,YAAY,aAAa;AAAA,MAC3B;AAEA,UAAI,CAAC,UAAU;AACb,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU,EAAE,QAAQ,YAAY,GAAG,CAAC;AAAA,QAC3C;AACA;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,QAAQ,IAAI;AAI1B,UAAI,kBAAkB,IAAI,EAAG;AAE7B,YAAM,SAAS,YAAY,cAAc;AAAA,QACvC,IAAI,KAAK;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,aAAa,EAAE,IAAI,QAAQ,IAAI,QAAQ,QAAQ,OAAO;AAAA,QACtD,YAAY,YAAY;AAAA,MAC1B,CAAC;AAED,UAAI,CAAC,QAAQ;AAIX,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU,EAAE,QAAQ,KAAK,GAAG,CAAC;AAAA,QACpC;AACA;AAAA,MACF;AAEA,MAAAA;AAAA,QACE;AAAA,QACA,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,WAAW,QAAQ,GAAG,CAAC;AAAA,MAC3D;AAEA,WAAK,KAAK;AAAA,QACR,MAAM,cAAc,MAAM,SAAS,MAAS;AAAA,QAC5C,YACE,YAAY,cAAc,KAAK,EAAE,GAAG,cAAc,KAAK,IAAI;AAAA,MAC/D,CAAC;AAAA,IACH;AAIA,UAAM,WAAW,oBAAoB,SAAS;AAAA,MAC5C,YAAY;AAAA,IACd,CAAC;AAMD,QACE,sBACC,MAAM,MAAM;AAAA,MACX,gCAAgC,CAAC;AAAA,MACjC;AAAA,IACF,GACA;AACA,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,UAAU;AACZ,iBAAS,aAAa,SAAS;AAC/B,YAAI,SAAS,mBAAmB;AAC9B,mBAAS,oBAAoB,SAAS;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B,gCAAgC,CAAC;AAAA,MACjC;AAAA,IACF;AACA,UAAM,iBAAiB,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAI9D,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,CAAC;AACvD,UAAM,gBAAgB,MAAM,eAAe,YAAY,IAAI,UAAU,IAAI;AAOzE,QACE,SAAS;AAAA,MACP,CAAC,SACC,CAAC,KAAK,IAAI,KAAK,EAAE,MAChB,CAAC,kBAAkB,IAAI,KACtB,KAAK,aAAa,SAAS,MAC1B,KAAK,aAAa,CAAC,GAAG,qBAAqB,KAAK;AAAA,IACvD,GACA;AACA,kBAAY,UAAU;AAAA,IACxB;AAIA,UAAM,aAAa,IAAI,IAAI,aAAa,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAC9D,UAAM,WAAW,oBAAI,IAAY;AAEjC,eAAW,YAAY,eAAe;AACpC,YAAM,gBAAgB,MAAM,YAAY,SAAS,EAAE;AAKnD,UAAI,iBAAiB,kBAAkB,aAAa,GAAG;AACrD,iBAAS,IAAI,SAAS,EAAE;AACxB,aAAK,KAAK;AAAA,UACR,MAAM;AAAA,YACJ,GAAG;AAAA,YACH,iBAAiB;AAAA,YACjB,iBAAiB,WAAW,IAAI,SAAS,EAAE,IAAI,SAAY;AAAA,UAC7D;AAAA;AAAA;AAAA,UAGA,YAAY;AAAA,QACd,CAAC;AACD;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,cAAc;AAAA,QACvC,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,aAAa;AAAA,UACX,IAAI,SAAS,YAAY;AAAA,UACzB,QAAQ,SAAS,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AAED,UAAI,CAAC,QAAQ;AAGX,QAAAA;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UACvB,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,WAAK,KAAK;AAAA,QACR,MAAM,EAAE,GAAG,UAAU,iBAAiB,KAAK;AAAA,QAC3C,YACE,YAAY,cAAc,SAAS,EAAE,GAAG,cAAc,KAAK,IAAI;AAAA,MACnE,CAAC;AAAA,IACH;AAKA,QAAI,KAAK,KAAK,CAAC,UAAU,CAAC,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC,GAAG;AACtD,kBAAY,YAAY,gBAAgB,EAAE,YAAY,CAAC;AAAA,IACzD;AAEA,UAAM,eAAe,gBAAgB,MAAM,gBAAgB,KAAK;AAKhE,eAAW,SAAS,MAAM;AACxB,UAAI,CAAC,SAAS,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,gBAAiB;AAEjE,YAAM,aAAa,MAAM,YAAY,MAAM,KAAK,EAAE;AAClD,YAAM,YAAY,aACd,CAAC,GAAG,yBAAyB,UAAU,CAAC,IACxC,CAAC;AACL,UACE,UAAU,UACV,CAAC,UAAU,KAAK,CAAC,eAAe,aAAa,UAAU,GAAG,OAAO,MAAM,KAAK,EAAE,GAC9E;AACA,cAAM,OAAO,EAAE,GAAG,MAAM,MAAM,iBAAiB,OAAU;AAAA,MAC3D;AAAA,IACF;AAEA,UAAM,SAAyB;AAAA,MAC7B,OAAO,KAAK,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACrC,SAAS,mBAAmB,MAAM,gBAAgB,KAAK;AAAA,MACvD;AAAA,IACF;AAEA,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,iBAAiB,OAAO,MAAM;AAAA,QAC9B,gBAAgB,OAAO,MACpB,OAAO,CAAC,SAAS,KAAK,eAAe,EACrC,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,QACxB,WAAW,OAAO,SAAS;AAAA,QAC3B,cAAc,OAAO;AAAA,UACnB,OAAO,QAAQ,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AAAA,YACvD;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU,KAAK;AAAA,IACtB;AACA,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO,kBAAkB,WAAW;AAAA,EACtC;AACF;AAOO,SAAS,qBACd,WACwB;AACxB,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,UAAU,QAAQ,UAAU,UAAU,UAAU,UAAU;AAChE,QAAM,aAAa;AAAA,IACjB,UAAU,iBAAiB,UAAU;AAAA,EACvC;AAEA,SAAO,WAAW;AACpB;AAeO,SAAS,eACd,aACA,eAAiC,MACjC,iBAA0B,OACD;AACzB,EAAAA;AAAA,IACE;AAAA,IACA,KAAK,UAAU;AAAA,MACb,gBAAgB,CAAC,CAAC;AAAA,MAClB,iBAAiB,qBAAqB,YAAY;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAMA,MAAI,qBAAqB,YAAY,GAAG;AACtC,UAAM,SAAS;AAAA,MACb,IAAI,aAAa,UAAU;AAAA,MAC3B,QAAQ,aAAa,cAAc;AAAA,MACnC,aAAa;AAAA,QACX,IAAI,aAAa,iBAAiB;AAAA,QAClC,QAAQ,aAAa,qBAAqB;AAAA,MAC5C;AAAA,IACF;AACA,IAAAA,OAAM,0CAA0C,KAAK,UAAU,MAAM,CAAC;AACtE,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB;AAClB,UAAM,SAAS;AAAA,MACb,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,MACV;AAAA,IACF;AACA,IAAAA;AAAA,MACE;AAAA,MACA,KAAK,UAAU,MAAM;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa;AAChB,IAAAA,OAAM,uCAAuC;AAC7C,WAAO;AAAA,EACT;AAGA,QAAM,kBAAoC,YAAY,YAAY;AAClE,EAAAA;AAAA,IACE;AAAA,IACA,KAAK,UAAU;AAAA,MACb,SAAS,CAAC,CAAC;AAAA,MACX,QAAQ,iBAAiB;AAAA,MACzB,YAAY,iBAAiB;AAAA,MAC7B,WAAW,iBAAiB,aAAa;AAAA,MACzC,eAAe,iBAAiB,aAAa;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,SAAO,mBAAmB;AAC5B;AAYA,IAAM,yBAAyB,CAAC,WAAW,OAAO;AAElD,SAAS,iBAAiB,UAA0B;AAClD,MAAI,aAAa,cAAe,QAAO;AACvC,MAAI,CAAC,SAAS,SAAS,OAAO,EAAG,QAAO;AAExC,SAAO,SAAS,MAAM,GAAG,CAAC,QAAQ,MAAM,KAAK;AAC/C;AAEO,SAAS,sCACd,SAC8B;AAC9B,MAAI,0BAAwD,CAAC;AAE7D,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AACtC,aAAW,SAAS,wBAAwB;AAC1C,eAAW,aAAa,OAAO,KAAK;AAAA,EACtC;AAEA,QAAM,WAAW,iBAAiB,WAAW,QAAQ;AACrD,QAAM,eAAe,WAAW;AAEhC,0BAAwB,MAAM,WAAW,SAAS;AAClD,0BAAwB,QAAQ,WAAW;AAC3C,0BAAwB,OAAO;AAC/B,eAAa,IAAI,cAAc,MAC5B,wBAAwB,cACvB,aAAa,IAAI,cAAc,KAAK;AACxC,eAAa,IAAI,aAAa,MAC3B,wBAAwB,aACvB,aAAa,IAAI,aAAa,KAAK;AACvC,eAAa,IAAI,YAAY,MAC1B,wBAAwB,YACvB,aAAa,IAAI,YAAY,KAAK;AACtC,eAAa,IAAI,YAAY,MAC1B,wBAAwB,YACvB,aAAa,IAAI,YAAY,KAAK;AACtC,eAAa,IAAI,UAAU,MACxB,wBAAwB,UACvB,aAAa,IAAI,UAAU,KAAK;AAEpC,SAAO;AACT;AAEO,SAAS,uBAAuB,SAAoC;AACzE,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AACtC,QAAM,SAAS,WAAW;AAE1B,MACE,OAAO,IAAI,QAAQ,KACnB,OAAO,IAAI,SAAS,KACpB,OAAO,IAAI,SAAS,KACpB,OAAO,IAAI,YAAY,KACvB,OAAO,IAAI,aAAa,KACxB,OAAO,IAAI,aAAa,KACxB,OAAO,IAAI,eAAe,KAC1B,OAAO,IAAI,iBAAiB,KAC5B,OAAO,IAAI,iBAAiB,KAC5B,OAAO,IAAI,mBAAmB,KAC9B,OAAO,IAAI,qBAAqB,KAChC,OAAO,IAAI,qBAAqB,GAChC;AACA,WAAO;AAAA,MACL,QACE,OAAO,IAAI,QAAQ,KACnB,OAAO,IAAI,SAAS,KACpB,OAAO,IAAI,SAAS,KACpB;AAAA,MACF,YACE,OAAO,IAAI,YAAY,KACvB,OAAO,IAAI,aAAa,KACxB,OAAO,IAAI,aAAa,KACxB;AAAA,MACF,eACE,OAAO,IAAI,eAAe,KAC1B,OAAO,IAAI,iBAAiB,KAC5B,OAAO,IAAI,iBAAiB,KAC5B;AAAA,MACF,mBACE,OAAO,IAAI,mBAAmB,KAC9B,OAAO,IAAI,qBAAqB,KAChC,OAAO,IAAI,qBAAqB,KAChC;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eACd,SACA,SAIA;AACA,QAAM,EAAE,qBAAqB,mBAAmB,IAAI;AAEpD,MAAI,qBAAqB;AACvB,YAAQ,gCAAgC,IAAI;AAE5C,QAAI,oBAAoB,QAAQ;AAC9B,cAAQ,gBAAgB,IAAI,oBAAoB;AAAA,IAClD;AAEA,QAAI,oBAAoB,YAAY;AAClC,cAAQ,oBAAoB,IAAI,oBAAoB;AAAA,IACtD;AAEA,QAAI,oBAAoB,eAAe;AACrC,cAAQ,wBAAwB,IAAI,oBAAoB;AAAA,IAC1D;AAEA,QAAI,oBAAoB,mBAAmB;AACzC,cAAQ,4BAA4B,IAClC,oBAAoB;AAAA,IACxB;AAAA,EACF,WAAW,oBAAoB;AAC7B,YAAQ,gBAAgB,IAAI,oBAAoB;AAChD,YAAQ,wBAAwB,IAAI,oBAAoB,aAAa;AAAA,EACvE;AAEA,SAAO;AACT;;;ADttCA,IAAAI,gBAAwB;AAExB,IAAMC,aAAQ,cAAAC,SAAY,oCAAoC;AAgK9D,eAAeC,QAAO,SAAkC;AAEtD,QAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,OAAO;AAEtD,QAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,aAAa;AAEtE,SAAO,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC,EACzC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAMA,SAAS,UACP,OACA,WACA,SACiB;AACjB,MAAI,OAAO;AACX,MAAI,cAAc,KAAM,SAAQ,KAAK,UAAU,SAAS;AACxD,MAAI,YAAY,KAAM,SAAQ,KAAK,UAAU,OAAO;AAEpD,SAAOA,QAAO,IAAI;AACpB;AAEA,eAAe,YACb,WACA,OACA,OACA,SAIA;AACA,MAAI,YAAY,MAAM,UAAU,OAAO,SAAS,WAAW,SAAS,OAAO;AAE3E,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAM,UAAU;AAAA,MAC3B;AAAA,QACE,UAAU,CAAC,0BAA0B;AAAA,QACrC,eAAe,YAAY;AAAA,UACzB,QAAQ;AAAA,UACR,sBAAsB;AAAA,QACxB,CAAC;AAAA,QACD,mBAAmB,CAAC,UAAU,UAAU;AAAA,MAC1C;AAAA,MACA,OAAO,EAAE,aAAa,MAAgD;AACpE,cAAMC,OACJ;AACF,cAAMC,QAAO,MAAM,MAAMD,MAAK;AAAA,UAC5B,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,QAC9C,CAAC;AAED,uBAAe;AAAA,UACb,aAAa;AAAA,UACb,UAAUC;AAAA,QACZ,CAAC;AAED,cAAM,EAAE,OAAO,IAAIA;AACnB,YAAI,WAAW,KAAK;AAClB,cAAI;AAEJ,cAAI,WAAW,KAAK;AAClB,sBACE;AAAA,UACJ,OAAO;AACL,sBAAU,iEAAiE,MAAM;AAAA,UACnF;AAEA,UAAAJ,OAAM,sBAAsB,OAAO,EAAE;AACrC,kBAAQ,MAAM,OAAO;AACrB,iBAAO;AAAA,QACT;AAEA,eAAOI,MAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,kBAAc,MAAM;AAAA,EACtB,SAAS,KAAK;AACZ,IAAAJ,OAAM,4BAA4B,GAAG,EAAE;AACvC,YAAQ,MAAM,GAAG;AAAA,EACnB;AAEA,MAAI,aAAa;AACf,WAAO,GAAG,SAAS,IAAI,WAAW;AAAA,EACpC;AAEA,SAAO;AACT;AAGA,IAAM,cAAc,YAAY;AAAA,EAC9B,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,cAAc;AAAA;AAChB,CAAC;AAGD,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIQ;AACN,QAAM,aAAa,qBAAqB,KAAK;AAC7C,QAAM,aAAa,WAAW,UAAU,WAAW;AAEnD,QAAM,sBAAsB,iBAAiB,KAAK,UAAU;AAC5D,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,CAAC,UAAU,GAAG,aACV,oBAAoB,UAAU,IAC9B;AAAA,EACN;AACF;AAoBA,SAAS,qBAAqB,OAAuB;AACnD,QAAM,QAAQ,MAAM,MAAM,2BAA2B;AACrD,MAAI,OAAO;AACT,WAAO,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAwC;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,iBAAiB,CAAC,CAAC,QAAQ,IAAI,gBAAgB;AACrD,QAAM,qBAAqB,QAAQ,IAAI,aAAa;AACpD,QAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,QAAM,YAAY,QAAQ,IAAI,WAAW;AACzC,QAAM,YAAY,QAAQ,IAAI,WAAW;AACzC,QAAM,oBAAoB,QAAQ,IAAI,mBAAmB;AACzD,QAAM,aAAa,QAAQ,IAAI,YAAY;AAC3C,QAAM,oBAAoB,QAAQ,IAAI,mBAAmB;AAEzD,QAAM,2BAA2B,sBAAsB;AAEvD,MAAI;AACJ,MAAI,qBAA2C;AAI/C,MAAI,iBAA6C;AACjD,MAAI,kBAAuD;AAC3D,MAAI,iBAAsC;AAC1C,MAAI,sBAAwC,UACxC,uBAAuB,OAAO,IAC9B;AAQJ,QAAM,yBACJ,kBAAkB,cAAc,oBAC5B,EAAE,QAAQ,IAAI,YAAY,eAAe,IAAI,kBAAkB,IAC/D;AAKN,QAAM,4BAA4B,MAChC,qBAAqB,mBAAmB,IACpC,sBACA;AAiBN,QAAM,oBAAoB,MAAc;AACtC,UAAM,WAAW,0BAA0B;AAC3C,QAAI,qBAAqB,QAAQ,KAAK,gBAAgB;AACpD,YAAM,UAAU,iBAAiB;AACjC,aAAO,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,IAChC;AAIA,UAAM,cAAc,aAAa,eAAe,KAAK,CAAC;AACtD,UAAM,QAAQ,CAAC,GAAS,OACrB,YAAY,EAAE,EAAE,GAAG,cAAc,MAC/B,YAAY,EAAE,EAAE,GAAG,cAAc,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE;AAEnE,QAAI,gBAAgB;AAClB,aAAO,eAAe,MACnB,IAAI,CAAC,EAAE,iBAAiB,kBAAkB,GAAG,KAAK,MAAM,IAAI,EAC5D,KAAK,KAAK;AAAA,IACf;AAEA,WAAO,OAAO,OAAO,WAAW,EAC7B,IAAI,CAAC,gBAAgB;AAAA,MACpB,IAAI,WAAW;AAAA,MACf,QAAQ,WAAW;AAAA,MACnB,aAAa,EAAE,GAAG,WAAW,YAAY;AAAA,IAC3C,EAAE,EACD,KAAK,KAAK;AAAA,EACf;AAEA,QAAM,mBAAmB,MACvB,eAAe,aAAa,0BAA0B,GAAG,cAAc;AAEzE,MAAI,CAAC,SAAS,CAAC,kBAAkB;AAC/B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAMK,iBAAgB,OAAOC,aAAqB;AAEhD,QAAI,CAAC,gBAAgB;AACnB,uBAAiBA;AACjB,4BAAsB,uBAAuBA,QAAO;AAAA,IACtD;AAEA,WAAO,CAAC,aAAuB;AAC7B,YAAM,MAAa,cAAMA,SAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAC5D,YAAM,SAAS,IAAI,0BAA0B;AAE7C,UAAI,CAAC,OAAQ;AAKb,eAAS,QAAQ;AAAA,QACf;AAAA,QACO,kBAAU,4BAA4B,IAAI;AAAA,UAC/C,QAAQ;AAAA,UACR,SAAS,oBAAI,KAAK,CAAC;AAAA,UACnB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAMA,UAAI,IAAI,mBAAmB,EAAG;AAE9B,YAAM,WAAW,kBAAkB,MAAM;AACzC,UAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,OAAQ;AAEnC,YAAM,SAAS,IAAI,IAAIA,SAAQ,GAAG,EAAE,aAAa;AACjD,YAAM,EAAE,SAAS,UAAU,KAAK,IAAI;AAAA,QAClC,oBAAI,KAAK;AAAA,QACT;AAAA,MACF;AAEA,eAAS,QAAQ;AAAA,QACf;AAAA,QACO,kBAAU,qBAAqB,sBAAsB,QAAQ,GAAG;AAAA,UACrE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,IAAI,SAAS;AACX,eAAO,iBAAiB;AAAA,MAC1B;AAAA,MACA,IAAI,UAAU;AACZ,eAAO,kBAAkB;AAAA,MAC3B;AAAA,MACA,IAAI,UAAU;AACZ,eAAO,QAAQ;AAAA,MACjB;AAAA,MACA,IAAI,iBAAiB;AACnB,eAAO,QAAQ;AAAA,MACjB;AAAA,MACA,eAAAD;AAAA,MACA,oBAAoB,MAAM;AACxB,eAAO;AAAA,UACL;AAAA,UACA,WAAW,QAAQ;AAAA,UACnB,QAAQ,iBAAiB;AAAA,UACzB,SAAS,kBAAkB;AAAA,UAC3B,sBAAsB;AAAA,UACtB,gBAAgB,QAAQ,IAAI,gBAAgB;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,oBAAoB,MASf;AACH,eAAO;AAAA,UACL,aAAa;AAAA,UACb,eAAe,QAAQ;AAAA,UACvB,YAAY,iBAAiB;AAAA,UAC7B,aAAa,kBAAkB;AAAA,UAC/B,mBAAmB;AAAA,UACnB,oBAAoB,QAAQ,IAAI,gBAAgB;AAAA,UAChD,aAAa,QAAQ;AAAA,UACrB,oBAAoB,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,sBAAsB,MAAM;AAAA,MAC5B,kBAAkB,MAAM,IAAI,QAAQ,MAAM,KAAK;AAAA,MAC/C,MAAM,MACJ,OACA,EAAE,UAAU,IAAkB,CAAC,GACJ;AAC3B,YAAI,CAAC,kBAAkB,MAAM;AAC3B,UAAAL,OAAM,6DAA6D;AACnE,kBAAQ,KAAK,qDAAqD;AAClE,iBAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,QACnC;AAEA,cAAM,OAAO,aAAa,EAAE,OAAO,WAAW,iBAAiB,CAAC;AAEhE,eAAO,EAAE,MAAiB,OAAO,KAAK;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,SACnB,SACA,kBAAkB,QAAQ,IAAI,aAAa,gBACzC,wCACA;AAEN,eAAa,IAAI,WAAW;AAAA;AAAA;AAAA;AAAA,IAI1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,WAAW,QAAQ;AAAA,IACnB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,kBAAkB;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL,IAAI,SAAS;AACX,aAAO,iBAAiB;AAAA,IAC1B;AAAA,IACA,IAAI,UAAU;AACZ,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,IAAI,UAAU;AACZ,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,IAAI,iBAAiB;AACnB,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,oBAAoB,MAAM;AACxB,aAAO;AAAA,QACL;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,QAAQ,iBAAiB;AAAA,QACzB,SAAS,kBAAkB;AAAA,QAC3B,sBAAsB;AAAA,QACtB,gBAAgB,QAAQ,IAAI,gBAAgB;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,oBAAoB,MASf;AACH,aAAO;AAAA,QACL,aAAa;AAAA,QACb,eAAe,QAAQ;AAAA,QACvB,YAAY,iBAAiB;AAAA,QAC7B,aAAa,kBAAkB;AAAA,QAC/B,mBAAmB;AAAA,QACnB,oBAAoB,QAAQ,IAAI,gBAAgB;AAAA,QAChD,aAAa,QAAQ;AAAA,QACrB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,eAAAK;AAAA,IACA,sBAAsB,MAAM;AAAA,IAC5B,kBAAkB,CAACE,WACjB,WAAW,iBAAiBA,MAAK;AAAA,IACnC,MAAM,MACJ,OACA,EAAE,WAAW,OAAO,WAAW,aAAa,KAAK,IAAkB,CAAC,GACzC;AAC3B,UAAI;AACF,YAAI,UAAe,CAAC;AACpB,YAAI,oBAA+C;AAEnD,cAAM,YAAY,gBAAgB;AAAA,UAChC;AAAA,UACA;AAAA,UACA,SAAS,IAAI,QAAQ,4BAA4B,EAAE,QAAQ,MAAM,CAAC;AAAA,QACpE,CAAC;AAED,cAAM,iBAAiB,YAAY,EAAE,GAAG,UAAU,IAAI,CAAC;AACvD,YAAI,gBAAgB;AAClB,yBAAe,UAAU;AAAA,QAC3B,OAAO;AACL,yBAAe,UAAU;AAAA,QAC3B;AAGA,YAAI,MAAM;AACR,yBAAe,WAAW,KAAK;AAC/B,yBAAe,UAAU,KAAK;AAAA,QAChC;AAEA,cAAM,eAAe,uBAAuB;AAC5C,cAAM,kBAAkB,CAAC,kBAAkB,CAAC;AAE5C,YACE,mBACA,cACA,SACA,CAAC,sBACD,gBACA;AACA,cAAI;AACF,gBAAI,CAAC,iBAAiB;AACpB,cAAAP;AAAA,gBACE;AAAA,cACF;AACA,gCAAkB,YAAY;AAAA,gBAC5B;AAAA,gBACA;AAAA,gBACA,yBAAyB,QAAQ,eAAe;AAAA,gBAChD,SAAS;AAAA,gBACT,8BACE,sCAAsC,cAAc;AAAA,gBACtD;AAAA,gBACA;AAAA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AAAA,YACH,OAAO;AACL,cAAAA;AAAA,gBACE;AAAA,cACF;AAAA,YACF;AACA,6BAAiB,MAAM;AACvB,iCAAqB,gBAAgB;AAAA,UACvC,SAAS,OAAO;AACd,YAAAA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AACA,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAEA,iCAAqB;AACrB,6BAAiB;AACjB,8BAAkB;AAAA,UACpB;AAAA,QACF,WACE,mBACA,cACA,SACA,oBACA;AACA,UAAAA,OAAM,sDAAsD;AAC5D,cAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,oBAAQ,IAAI,sDAAsD;AAAA,UACpE;AAAA,QACF;AAEA,YAAI,mBAAmB,gBAAgB;AACrC,8BAAoB;AAAA,YAClB,eAAe,MACZ,OAAO,CAACQ,UAASA,MAAK,eAAe,EACrC,IAAI,CAAC,EAAE,iBAAiB,kBAAkB,GAAGA,MAAK,MAAMA,KAAI;AAAA,UACjE;AAAA,QACF;AASA,cAAM,aAAa,kBAAkB,cAAc,KAAK,IAAI;AAC5D,cAAM,mBAAmB,aACrB,gBAAgB,aAAa,UAAU,IACvC;AAEJ,YAAI,mBAAmB,YAAY;AACjC,UAAAR;AAAA,YACE;AAAA,YACA,KAAK,UAAU;AAAA,cACb;AAAA,cACA,QAAQ,kBAAkB;AAAA,cAC1B,WAAW,kBAAkB,aAAa;AAAA,YAC5C,CAAC;AAAA,UACH;AAAA,QACF;AAEA,kBAAU,eAAe,SAAS;AAAA,UAChC,oBAAoB;AAAA,UACpB,qBAAqB;AAAA,QACvB,CAAC;AAGD,YAAI,gBAAgB;AAClB,cAAI;AACF,kBAAM,SAAS,MAAM,WAAW,MAAM,OAAO;AAAA,cAC3C,WAAW;AAAA,cACX;AAAA,YACF,CAAC;AAED,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,cAAc;AAAA,YAChB;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,EAAE,OAA4B,MAAM,KAAK;AAAA,UAClD;AAAA,QACF;AAEA,cAAM,YAAY,MAAM,YAAY,WAAW,OAAO,OAAO;AAAA,UAC3D,WAAW;AAAA,UACX;AAAA,QACF,CAAC;AAED,cAAM,WAAW,MAAM,UAAU;AAAA,UAC/B;AAAA,YACE,UAAU,CAAC,SAAS;AAAA,YACpB,eAAe;AAAA,YACf,mBAAmB,CAAC,UAAU,CAAC,OAAO;AAAA,UACxC;AAAA,UACA,YAAY;AACV,gBAAI;AACF,oBAAM,SAAS,MAAM,WAAW,MAAM,OAAO;AAAA,gBAC3C,WAAW;AAAA,gBACX;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,YACT,SAAS,OAAO;AACd,qBAAO,EAAE,OAAO,MAAM,KAAK;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAEA,eAAO,SAAS,QACZ,WACA;AAAA,UACE,GAAG;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACN,SAAS,OAAO;AACd,QAAAA;AAAA,UACE;AAAA,UACA;AAAA,QACF;AACA,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AACA,cAAM,aAAyB;AAAA,UAC7B,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,MAAM;AAAA,QACR;AACA,eAAO,EAAE,OAAO,YAAY,MAAM,KAAK;AAAA,MACzC;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AgBx0BA,IAAM,YAAY;AAmBX,IAAM,OAAqB,CAAC,MAAMS,QAAO,CAAC,MAAM;AACrD,MAAI,eAAe,OAAOA,UAAS,WAAW,EAAE,QAAQA,MAAK,IAAIA;AAEjE,MAAI,UAAU,IAAI,QAAQ,aAAa,OAAO;AAC9C,MAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,YAAQ,IAAI,gBAAgB,iCAAiC;AAAA,EAC/D;AAEA,SAAO,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAMO,IAAM,WAA6B,CAAC,KAAKA,QAAO,QAAQ;AAC7D,MAAI,eAAeA;AACnB,MAAI,OAAO,iBAAiB,UAAU;AACpC,mBAAe,EAAE,QAAQ,aAAa;AAAA,EACxC,WAAW,OAAO,aAAa,WAAW,aAAa;AACrD,iBAAa,SAAS;AAAA,EACxB;AAEA,MAAI,UAAU,IAAI,QAAQ,aAAa,OAAO;AAC9C,UAAQ,IAAI,YAAY,GAAG;AAE3B,SAAO,IAAI,SAAS,MAAM;AAAA,IACxB,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAKA,SAAS,SAAS,UAAU,aAAa;AACvC,SAAO,IAAI,SAAS,SAAS,EAAE,QAAQ,KAAK,YAAY,YAAY,CAAC;AACvE;AAEA,SAAS,YAAY,SAAkB,KAAa;AAElD,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AAGtC,QAAM,aAAa,IAAI,IAAI,KAAK,WAAW,MAAM;AAGjD,SAAO,WAAW,WAAW,WAAW;AAC1C;AAMA,eAAsB,OAAO,EAAE,SAAS,QAAQ,GAAuB;AACrE,QAAM,EAAE,QAAQ,IAAI,QAAQ;AAE5B,MAAI,EAAE,QAAQ,WAAW,UAAU,UAAU;AAC3C,WAAO,KAAK,EAAE,SAAS,qBAAqB,GAAG,GAAG;AAAA,EACpD;AAEA,QAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,QAAM,OAAQ,KAAK,IAAI,MAAM,KAAgB;AAC7C,QAAM,aAAa,YAAY,SAAS,IAAI,IAAI,OAAO;AAEvD,QAAM,QAAQ,QAAQ;AAEtB,SAAO,SAAS,UAAU;AAC5B;AAKA,eAAsB,OAAO,EAAE,SAAS,QAAQ,GAAuB;AACrE,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI,CAAC,KAAK,QAAS,QAAO,SAAS;AAEnC,QAAM,EAAE,aAAa,IAAI,IAAI,IAAI,QAAQ,GAAG;AAE5C,QAAM,QAAQ,aAAa,IAAI,OAAO;AACtC,QAAM,cAAc,aAAa,IAAI,aAAa;AAClD,QAAM,OAAO,aAAa,IAAI,MAAM,KAAK;AACzC,QAAM,iBAAiB,aAAa,IAAI,gBAAgB;AACxD,QAAM,aAAa,YAAY,SAAS,IAAI,IAAI,OAAO;AAEvD,MAAI,CAAC,aAAa,IAAI,OAAO,GAAG;AAC9B,UAAM,IAAI,kBAAkB;AAAA,EAC9B;AAEA,QAAM,iBAAiB,MAAM,KAAK,iBAAiB,KAAK;AAExD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,kBAAkB;AAAA,EAC9B;AAEA,MAAI;AACJ,MAAI,iBAA8D;AAElE,MAAI;AACF,yBAAqB,iBAChB,KAAK,MAAM,cAAc,IAC1B;AAEJ,qBAAiB,oBAAoB,kBAAkB;AAAA,EACzD,QAAQ;AACN,yBAAqB;AAAA,EACvB;AAGA,OAAK,QAAQ,IAAI,kBAAkB,IAAI;AACvC,OAAK,QAAQ,IAAI,eAAe,WAAW;AAC3C,OAAK,QAAQ,IAAI,kBAAkB,kBAAkB;AAMrD,OAAK,QAAQ,IAAI,UAAU,gBAAgB,UAAU,IAAI;AACzD,OAAK,QAAQ,IAAI,aAAa,gBAAgB,aAAa,IAAI;AAC/D,OAAK,QAAQ,IAAI,aAAa,gBAAgB,aAAa,IAAI;AAC/D,OAAK,QAAQ;AAAA,IACX;AAAA,IACA,gBAAgB,qBAAqB;AAAA,EACvC;AACA,OAAK,QAAQ,IAAI,cAAc,gBAAgB,cAAc,IAAI;AACjE,OAAK,QAAQ;AAAA,IACX;AAAA,IACA,gBAAgB,qBAAqB;AAAA,EACvC;AAEA,SAAO,SAAS,YAAY;AAAA,IAC1B,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,IAAM,oBAAN,cAAgC,SAAS;AAAA,EACvC,cAAc;AACZ,UAAM,iBAAiB,EAAE,QAAQ,KAAK,YAAY,eAAe,CAAC;AAAA,EACpE;AACF;AAEA,IAAM,oBAAN,cAAgC,SAAS;AAAA,EACvC,cAAc;AACZ,UAAM,iBAAiB,EAAE,QAAQ,KAAK,YAAY,eAAe,CAAC;AAAA,EACpE;AACF;;;AC3KA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACHP,SAAS,OAAQ,QAAQ;AACvB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,QAAI,SAAS,UAAU,CAAC;AACxB,aAAS,OAAO,QAAQ;AACtB,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAIA,IAAI,mBAAmB;AAAA,EACrB,MAAM,SAAU,OAAO;AACrB,QAAI,MAAM,CAAC,MAAM,KAAK;AACpB,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WAAO,MAAM,QAAQ,oBAAoB,kBAAkB;AAAA,EAC7D;AAAA,EACA,OAAO,SAAU,OAAO;AACtB,WAAO,mBAAmB,KAAK,EAAE;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,KAAM,WAAW,mBAAmB;AAC3C,WAAS,IAAK,MAAM,OAAO,YAAY;AACrC,QAAI,OAAO,aAAa,aAAa;AACnC;AAAA,IACF;AAEA,iBAAa,OAAO,CAAC,GAAG,mBAAmB,UAAU;AAErD,QAAI,OAAO,WAAW,YAAY,UAAU;AAC1C,iBAAW,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,UAAU,KAAK;AAAA,IACvE;AACA,QAAI,WAAW,SAAS;AACtB,iBAAW,UAAU,WAAW,QAAQ,YAAY;AAAA,IACtD;AAEA,WAAO,mBAAmB,IAAI,EAC3B,QAAQ,wBAAwB,kBAAkB,EAClD,QAAQ,SAAS,MAAM;AAE1B,QAAI,wBAAwB;AAC5B,aAAS,iBAAiB,YAAY;AACpC,UAAI,CAAC,WAAW,aAAa,GAAG;AAC9B;AAAA,MACF;AAEA,+BAAyB,OAAO;AAEhC,UAAI,WAAW,aAAa,MAAM,MAAM;AACtC;AAAA,MACF;AASA,+BAAyB,MAAM,WAAW,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IACvE;AAEA,WAAQ,SAAS,SACf,OAAO,MAAM,UAAU,MAAM,OAAO,IAAI,IAAI;AAAA,EAChD;AAEA,WAAS,IAAK,MAAM;AAClB,QAAI,OAAO,aAAa,eAAgB,UAAU,UAAU,CAAC,MAAO;AAClE;AAAA,IACF;AAIA,QAAI,UAAU,SAAS,SAAS,SAAS,OAAO,MAAM,IAAI,IAAI,CAAC;AAC/D,QAAI,MAAM,CAAC;AACX,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,QAAQ,QAAQ,CAAC,EAAE,MAAM,GAAG;AAChC,UAAI,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAEnC,UAAI;AACF,YAAI,QAAQ,mBAAmB,MAAM,CAAC,CAAC;AACvC,YAAI,KAAK,IAAI,UAAU,KAAK,OAAO,KAAK;AAExC,YAAI,SAAS,OAAO;AAClB;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AAAA,MAAC;AAAA,IACf;AAEA,WAAO,OAAO,IAAI,IAAI,IAAI;AAAA,EAC5B;AAEA,SAAO,OAAO;AAAA,IACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,SAAU,MAAM,YAAY;AAClC;AAAA,UACE;AAAA,UACA;AAAA,UACA,OAAO,CAAC,GAAG,YAAY;AAAA,YACrB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,gBAAgB,SAAU,YAAY;AACpC,eAAO,KAAK,KAAK,WAAW,OAAO,CAAC,GAAG,KAAK,YAAY,UAAU,CAAC;AAAA,MACrE;AAAA,MACA,eAAe,SAAUC,YAAW;AAClC,eAAO,KAAK,OAAO,CAAC,GAAG,KAAK,WAAWA,UAAS,GAAG,KAAK,UAAU;AAAA,MACpE;AAAA,IACF;AAAA,IACA;AAAA,MACE,YAAY,EAAE,OAAO,OAAO,OAAO,iBAAiB,EAAE;AAAA,MACtD,WAAW,EAAE,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,IAAI,MAAM,KAAK,kBAAkB,EAAE,MAAM,IAAI,CAAC;;;AD3H9C,OAAO;AAAA,EACL;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AEbP,SAAS,eAAe,kBAA4C;AA2B7D,IAAM,kBAAkB,cAAoC,CAAC,CAAC;AAE9D,IAAM,qBAAqB,MAAM,WAAW,eAAe;;;AFQlE,SAAS,8BAA8B,cAA8B;AACnE,QAAM,aAAa,aAAa,YAAY,cAAc,CAAC;AAE3D,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,EAAE;AAAA,IAC9B,CAAC,cAAc,yBAAyB,SAAS;AAAA,EACnD;AACF;AAEA,SAAS,uBACP,cACA,oBACU;AACV,MAAI,CAAC,oBAAoB;AACvB,WAAO,8BAA8B,YAAY;AAAA,EACnD;AAEA,QAAM,mBACJ,OAAO,uBAAuB,aAC1B,mBAAmB,YAAY,IAC/B;AAEN,MAAI,CAAC,kBAAkB;AACrB,WAAO,8BAA8B,YAAY;AAAA,EACnD;AAEA,SAAO,MAAM,QAAQ,gBAAgB,IACjC,mBACA,CAAC,gBAAgB;AACvB;AAUA,SAAS,oBAAwC;AAC/C,SACE,IAAQ,IAAI,mBAAmB,KAAK,IAAQ,IAAI,0BAA0B;AAE9E;AAOA,SAAS,mBAAmB,SAA6B;AACvD,MAAQ;AAAA,IACN;AAAA,IACA,sBAAsB,OAAO;AAAA,IAC7B;AAAA,MACE,oBAAI,KAAK;AAAA,MACT,OAAO,WAAW,eAAe,OAAO,SAAS,aAAa;AAAA,IAChE;AAAA,EACF;AACF;AASA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AAGD,QAAM,kBAAkB,OAAO,YAAY;AAC3C,kBAAgB,UAAU;AAE1B,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc;AAClB,UAAM,mBAAmB,oBAAI,IAAa;AAC1C,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,UAAM,UAAU,MAAM;AACpB,gBAAU,WAAW;AACrB,wBAAkB,WAAW;AAC7B,UAAI,mBAAmB;AACrB,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAC9B,UAAI,YAAa;AACjB,oBAAc;AACd,cAAQ;AACR,sBAAgB,QAAQ,IAAI;AAAA,IAC9B;AAIA,QACE,KAAK,sBAAsB,qBAC3B,OAAO,WAAW,eAClB,OAAO,yBAAyB,aAChC;AACA,wBAAkB;AAClB;AAAA,IACF;AAEA,UAAM,6BAA6B;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,2BAA2B,WAAW,GAAG;AAC3C,cAAQ;AAAA,QACN,qBAAqB,KAAK,EAAE;AAAA,MAC9B;AACA;AAAA,IACF;AAEA,UAAM,0BAA0B,MAAM;AACpC,UAAI,CAAC,YAAY,YAAa;AAE9B,iCAA2B,QAAQ,CAAC,aAAa;AAC/C,iBAAS,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,YAAY;AACvD,cAAI,iBAAiB,IAAI,OAAO,EAAG;AACnC,2BAAiB,IAAI,OAAO;AAC5B,oBAAU,QAAQ,OAAO;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAED,UAAI,iBAAiB,OAAO,GAAG;AAC7B,0BAAkB,WAAW;AAC7B,2BAAmB;AACnB,YAAI,mBAAmB;AACrB,uBAAa,iBAAiB;AAC9B,8BAAoB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,eAAW,IAAI;AAAA,MACb,CAAC,YAAY;AACX,YAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,GAAG;AACjD,4BAAkB;AAAA,QACpB;AAAA,MACF;AAAA,MACA,EAAE,WAAW,IAAI;AAAA,IACnB;AAEA,4BAAwB;AAExB,QACE,CAAC,eACD,iBAAiB,SAAS,KAC1B,OAAO,qBAAqB,aAC5B;AACA,yBAAmB,IAAI,iBAAiB,MAAM;AAC5C,gCAAwB;AAAA,MAC1B,CAAC;AACD,uBAAiB,QAAQ,SAAS,MAAM;AAAA,QACtC,WAAW;AAAA,QACX,SAAS;AAAA,MACX,CAAC;AAED,0BAAoB,WAAW,MAAM;AACnC,YAAI,CAAC,eAAe,iBAAiB,SAAS,GAAG;AAC/C,kBAAQ;AAAA,YACN,gEAAgE,KAAK,EAAE;AAAA,UACzE;AACA,kBAAQ;AAAA,QACV;AAAA,MACF,GAAG,GAAK;AAAA,IACV;AAEA,WAAO;AAAA,EACT,GAAG;AAAA,IACD,KAAK;AAAA,IACL,KAAK,aAAa;AAAA,IAClB,KAAK;AAAA,IACL;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAUA,SAAS,uBAA+B;AACtC,MAAI;AAEJ,MAAI;AACF,UAAM,aAAa,cAAgD;AACnE,mBAAe,YAAY;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,iBAAiB,YAAY;AACtC;AAMO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AACF,IAAwB,CAAC,MAAM;AAC7B,QAAM,gBAAgB,qBAAqB;AAE3C,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI;AAIF,cAAU,YAAY,EAAE;AACxB,UAAM,CAAC,IAAI,IAAI,WAAW;AAC1B,wBAEI,MAAM,MAIL,qBAED,MAAM,MAIL;AAEL,kBAAc,eAAe;AAAA,EAC/B,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,wBAAoB;AACpB,kBAAc;AAAA,EAChB;AAIA,QAAM,WAAW,OAA0B,EAAE,SAAS,OAAO,CAAC,EAAE,CAAC;AACjE,WAAS,UAAU,gBAAgB,SAAS,SAAS,eAAe,OAAO;AAC3E,QAAM,QAAQ,SAAS,QAAQ;AAE/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,mBAAmB;AAKvB,QAAM,cAAc,OAAoB,oBAAI,IAAI,CAAC;AACjD,QAAM,CAAC,WAAW,YAAY,IAAI,SAA4B,CAAC,CAAC;AAEhE,QAAM,gBAAgB,kBAAkB;AACxC,QAAM,iBAAiB;AAAA,IACrB,MAAM,kBAAkB,aAAa;AAAA,IACrC,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AAEA,QAAM,mBAAmB,YAAY,CAAC,SAAe;AACnD,QAAI,YAAY,QAAQ,IAAI,KAAK,EAAE,EAAG;AACtC,gBAAY,QAAQ,IAAI,KAAK,EAAE;AAC/B,iBAAa,CAAC,SAAS;AAAA,MACrB,GAAG;AAAA,MACH,EAAE,cAAc,MAAM,cAAc,KAAK,IAAI,EAAE;AAAA,IACjD,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkB;AAAA,IACtB,CAAC,YAA0C;AACzC,YAAM,EAAE,UAAU,YAAY,IAAI;AAAA,QAChC;AAAA,QACA,kBAAkB,kBAAkB,CAAC;AAAA,MACvC;AAEA,UAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,iBAAW,EAAE,cAAc,aAAa,KAAK,UAAU;AACrD,YAAI;AACF,iCAAuB,EAAE,GAAG,cAAc,aAAa,CAAC;AAAA,QAC1D,SAAS,OAAO;AACd,kBAAQ,MAAM,gCAAgC,KAAK;AAAA,QACrD;AAAA,MACF;AAEA,yBAAmB,WAAW;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB;AAAA,EACvB;AAEA,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU,UAAU,kBAAmB;AAE5C,QAAI,CAAC,gBAAgB;AAGnB,gCAA0B,CAAC,SAAS;AAClC,YAAI,OAAO;AACX,mBAAW,YAAY,WAAW;AAChC,cAAI,KAAK,IAAI,SAAS,aAAa,EAAE,EAAG;AACxC,cAAI,SAAS,KAAM,QAAO,IAAI,IAAI,IAAI;AACtC,eAAK,IAAI,SAAS,aAAa,IAAI,QAAQ;AAAA,QAC7C;AACA,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,UAAM,WAAW,gBAAgB;AAAA,MAC/B,CAAC,GAAI,sBAAsB,OAAO,KAAK,CAAC,CAAE;AAAA,MAC1C;AAAA,IACF,CAAC;AAED,iBAAa,CAAC,CAAC;AACf,QAAI,sBAAsB,KAAM,2BAA0B,oBAAI,IAAI,CAAC;AAEnE,QAAI,CAAC,SAAU;AAOf,eAAW,MAAM;AACf,mBAAa,WAAW;AAAA,IAC1B,GAAG,GAAG;AAAA,EACR,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,EAAAA,WAAU,MAAM;AACd,QACE,UAAU,UACV,CAAC,kBACD,qBACA,CAAC,sBAAsB,MACvB;AACA;AAAA,IACF;AAEA,oBAAgB,CAAC,CAAC,GAAG,qBAAqB,OAAO,CAAC,CAAC,CAAC;AACpD,8BAA0B,oBAAI,IAAI,CAAC;AAAA,EACrC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,kBAAmB,QAAO;AAE9B,SACE,0DACG,aAAa,IAAI,CAAC,SACjB;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE;AAAA,MACtC;AAAA,MACA;AAAA,MACA,cAAc;AAAA;AAAA,EAChB,CACD,CACH;AAEJ;;;AGtbA,OAAOC,UAAS,YAAAC,iBAAmC;AACnD,SAAS,0BAA0B;AAanC,SAAS,4BAAiD;AACxD,MAAI;AAEF,UAAM,OAAO,mBAAmB,MAAM;AACtC,UAAM,UAAU,MAAM,oBAAoB;AAC1C,WAAO,OAAO,YAAY,YAAY,UAAU;AAAA,EAClD,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,GAAwC;AACtC,QAAM,gBAAgB,0BAA0B;AAChD,QAAM,iBAAiB,sBAAsB,iBAAiB;AAC9D,QAAM,CAAC,sBAAsB,uBAAuB,IAAIC,UAAS,oBAAI,IAAI,CAAC;AAC1E,QAAM,CAAC,kBAAkB,IAAIA,UAAS,oBAAI,IAAI,CAAC;AAE/C,SACE,gBAAAC,OAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL,sBAAsB,CAAC,SAAS;AAC9B,kCAAwB,qBAAqB,IAAI;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;;;AClDA,SAAS,sBAAAC,2BAA0B;AAEnC,IAAM,SAAS,oBAAI,IAAY;AAqB/B,IAAM,kBAAkB,MAAM;AAC5B,MAAI;AACF,WAAO,QAAQ,IAAI,aAAa;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAaH,SAAS,SAAS,KAAa,SAAuB;AACpD,MAAI,CAAC,eAAgB;AAErB,MAAI,OAAO,IAAI,GAAG,EAAG;AACrB,SAAO,IAAI,GAAG;AACd,UAAQ,KAAK,OAAO;AACtB;AASA,SAAS,kBAAuC;AAE9C,SAAOA,oBAAmB,MAAM,KAAK,CAAC;AACxC;AAeO,SAAS,UAAU,YAAkC;AAC1D,QAAM,EAAE,QAAQ,YAAY,SAAS,YAAY,IAAI,gBAAgB;AAErE,MAAI,WAAW,UAAa,eAAe,QAAW;AACpD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AACd,UAAM,QAA4B,WAAW;AAE7C,QAAI,CAAC,OAAO;AAIV;AAAA,QACE;AAAA,QACA,0BAA0B,UAAU;AAAA,MACtC;AACA,aAAO;AAAA,IACT;AAEA,WAAO,MAAM,KAAK,CAAC,SAAS,MAAM,WAAW,UAAU,KAAK;AAAA,EAC9D;AAEA,QAAM,cAAsB,WAAW,eAAe,CAAC;AAGvD,QAAM,UAAuB,UAAU,cAAc;AAErD,MAAI,YAAY,SAAS,GAAG;AAG1B;AAAA,MACE;AAAA,MACA,kCAAkC,YAAY,MAAM,oRAA+Q,SAAS,MAAM;AAAA,IACpV;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,aAAqB;AACnC,QAAM,EAAE,SAAS,YAAY,IAAI,gBAAgB;AAEjD,SAAO,WAAW,eAAe,CAAC;AACpC;AAEO,SAAS,qBAA6B;AAC3C,QAAM,EAAE,WAAW,cAAc,IAAI,gBAAgB;AAErD,MAAI,CAAC,aAAa,CAAC,eAAe;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAaO,SAAS,YAAY,YAAyC;AACnE,SAAO,UAAU,UAAU,GAAG;AAChC;AAEO,SAAS,gBAAgB,YAAyC;AACvE,SAAO,UAAU,UAAU,GAAG;AAChC;AAEO,SAAS,mBAAmB,YAAyC;AAC1E,SAAO,UAAU,UAAU,GAAG,aAAa;AAC7C;AAEO,SAAS,uBACd,YACoB;AACpB,SAAO,UAAU,UAAU,GAAG,aAAa;AAC7C;","names":["parse","serialize","decode","window","undefined","regexes","ua","parser","parse","createDebug","debug","warned","import_cookie","defaultValidate","locale","parseAcceptLanguage","languageHeaderValue","options","ignoreWildcard","validate","split","map","lang","q","trimmedLocale","trim","numQ","Number","replace","isNaN","sort","q1","q2","flatMap","action","parser","sendEvent","cookie","createDebug","handleRequest","cookie","createCookie","createCookieSessionStorage","import_debug","debug","createDebug","createCookieSessionStorage","createCookie","cookie","cookie","import_debug","cookie","parse","document","debug","createDebug","import_debug","import_debug","debug","createDebug","debug","createDebug","URL","resp","import_debug","debug","createDebug","sha256","URL","resp","handleRequest","request","token","test","init","converter","useEffect","useEffect","React","useState","useState","React","useRouteLoaderData"]}
|