diff --git a/CHANGELOG.md b/CHANGELOG.md index 9397a4a..eb1a0fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.10.0-alpha.4](https://github.com/krakenjs/belter/compare/v2.9.3...v2.10.0-alpha.4) (2026-04-01) + + +### Features + +* added bfcacheAware option to watchElementForClose in belter ([1a61fb1](https://github.com/krakenjs/belter/commit/1a61fb1751ac360eec1adbf6fcc8cc466f5c8394)) +* alpha version ([8dc0186](https://github.com/krakenjs/belter/commit/8dc0186349a5301eee4cd8b20ec126732cc4b624)) +* changes ([b8f7a6c](https://github.com/krakenjs/belter/commit/b8f7a6cf1d0868401593b77c15197da51e7f3706)) +* fix eslint errors ([5a8bde4](https://github.com/krakenjs/belter/commit/5a8bde47e156403d721ce9410724a2d62257da94)) +* fix format issues ([1f61224](https://github.com/krakenjs/belter/commit/1f61224158aa5df405643d401cfbf4043f43f02f)) +* update unload behvaior to support bfcache ([3443df8](https://github.com/krakenjs/belter/commit/3443df8360e1724557c1722418f404abbdf85fe9)) +* update version ([d528fcf](https://github.com/krakenjs/belter/commit/d528fcfab8df47ee0b01c52cce7cc24aae2dac06)) + ### [2.9.3](https://github.com/krakenjs/belter/compare/v2.9.2...v2.9.3) (2026-01-07) diff --git a/dist/belter.js b/dist/belter.js index f095e06..66ed202 100644 --- a/dist/belter.js +++ b/dist/belter.js @@ -2875,9 +2875,12 @@ function isElementClosed(el) { return !(el && el.parentNode && el.ownerDocument && el.ownerDocument.documentElement && el.ownerDocument.documentElement.contains(el)); } - function watchElementForClose(element, handler) { + function watchElementForClose(element, handler, options) { + var _ref2$isBfcacheEnable = (options || {}).isBfcacheEnabled, isBfcacheEnabled = void 0 !== _ref2$isBfcacheEnable && _ref2$isBfcacheEnable; + console.log("[bfcache-belter] watchElementForClose called with isBfcacheEnabled=" + String(isBfcacheEnabled)); handler = once(handler); var terminationEvent = "onpagehide" in window ? "pagehide" : "unload"; + console.log("[bfcache-belter] terminationEvent=" + terminationEvent); var cancelled = !1; var mutationObservers = []; var interval; @@ -2887,7 +2890,7 @@ cancelled = !0; for (var _i16 = 0; _i16 < mutationObservers.length; _i16++) mutationObservers[_i16].disconnect(); interval && interval.cancel(); - sacrificialFrameWin && sacrificialFrameWin.removeEventListener(terminationEvent, elementClosed); + sacrificialFrameWin && sacrificialFrameWin.removeEventListener(terminationEvent, elementClosedOnTermination); sacrificialFrame && destroyElement(sacrificialFrame); }; var elementClosed = function() { @@ -2896,6 +2899,13 @@ cancel(); } }; + var elementClosedOnTermination = function(event) { + console.log("[bfcache-belter] sacrificial iframe " + terminationEvent + " fired, persisted=" + event.persisted + ", isBfcacheEnabled=" + String(isBfcacheEnabled)); + if (isBfcacheEnabled && "pagehide" === terminationEvent && event.persisted) console.log("[bfcache-belter] skipping elementClosed (page entering bfcache)"); else { + console.log("[bfcache-belter] calling elementClosed (real navigation)"); + elementClosed(); + } + }; if (isElementClosed(element)) { elementClosed(); return { @@ -2917,11 +2927,13 @@ } (sacrificialFrame = document.createElement("iframe")).setAttribute("name", "__detect_close_" + uniqueID() + "__"); sacrificialFrame.style.display = "none"; + console.log("[bfcache-belter] sacrificial iframe created"); awaitFrameWindow(sacrificialFrame).then((function(frameWin) { (sacrificialFrameWin = function(win) { if (!isSameDomain(win)) throw new Error("Expected window to be same domain"); return win; - }(frameWin)).addEventListener(terminationEvent, elementClosed); + }(frameWin)).addEventListener(terminationEvent, elementClosedOnTermination); + console.log("[bfcache-belter] event listener attached to sacrificial iframe for " + terminationEvent); })); element.appendChild(sacrificialFrame); interval = safeInterval((function() { @@ -2944,7 +2956,7 @@ } } function onResize(el, handler, _temp) { - var _ref2 = void 0 === _temp ? {} : _temp, _ref2$width = _ref2.width, width = void 0 === _ref2$width || _ref2$width, _ref2$height = _ref2.height, height = void 0 === _ref2$height || _ref2$height, _ref2$interval = _ref2.interval, interval = void 0 === _ref2$interval ? 100 : _ref2$interval, _ref2$win = _ref2.win, win = void 0 === _ref2$win ? window : _ref2$win; + var _ref3 = void 0 === _temp ? {} : _temp, _ref3$width = _ref3.width, width = void 0 === _ref3$width || _ref3$width, _ref3$height = _ref3.height, height = void 0 === _ref3$height || _ref3$height, _ref3$interval = _ref3.interval, interval = void 0 === _ref3$interval ? 100 : _ref3$interval, _ref3$win = _ref3.win, win = void 0 === _ref3$win ? window : _ref3$win; var currentWidth = el.offsetWidth; var currentHeight = el.offsetHeight; var canceled = !1; @@ -3081,8 +3093,8 @@ script.setAttribute(ATTRIBUTES.UID + "-auto", uid); return uid; })); - function submitForm(_ref3) { - var url = _ref3.url, target = _ref3.target, body = _ref3.body, _ref3$method = _ref3.method, method = void 0 === _ref3$method ? "post" : _ref3$method; + function submitForm(_ref4) { + var url = _ref4.url, target = _ref4.target, body = _ref4.body, _ref4$method = _ref4.method, method = void 0 === _ref4$method ? "post" : _ref4$method; var form = document.createElement("form"); form.setAttribute("target", target); form.setAttribute("method", method); diff --git a/dist/belter.min.js b/dist/belter.min.js index af745bc..017b0af 100644 --- a/dist/belter.min.js +++ b/dist/belter.min.js @@ -1,2 +1,2 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("belter",[],n):"object"==typeof exports?exports.belter=n():t.belter=n()}("undefined"!=typeof self?self:this,(function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return{}.hasOwnProperty.call(t,n)},e.p="",e(e.s=0)}([function(t,n,e){"use strict";e.r(n),e.d(n,"getUserAgent",(function(){return o})),e.d(n,"isDevice",(function(){return u})),e.d(n,"isTablet",(function(){return c})),e.d(n,"isWebView",(function(){return a})),e.d(n,"isStandAlone",(function(){return f})),e.d(n,"isFacebookWebView",(function(){return s})),e.d(n,"isInstagramWebView",(function(){return d})),e.d(n,"isMetaWebView",(function(){return l})),e.d(n,"isMetaInAppBrowser",(function(){return h})),e.d(n,"isFirefox",(function(){return p})),e.d(n,"isFirefoxIOS",(function(){return v})),e.d(n,"isEdgeIOS",(function(){return m})),e.d(n,"isOperaMini",(function(){return w})),e.d(n,"isAndroid",(function(){return y})),e.d(n,"isFirefoxAndroid",(function(){return g})),e.d(n,"isIos",(function(){return b})),e.d(n,"isIOS14",(function(){return S})),e.d(n,"isGoogleSearchApp",(function(){return E})),e.d(n,"isQQBrowser",(function(){return O})),e.d(n,"isIosWebview",(function(){return x})),e.d(n,"isSFVC",(function(){return _})),e.d(n,"isSFVCorSafari",(function(){return j})),e.d(n,"isAndroidWebview",(function(){return C})),e.d(n,"isIE",(function(){return P})),e.d(n,"isIECompHeader",(function(){return k})),e.d(n,"isElectron",(function(){return A})),e.d(n,"isIEIntranet",(function(){return M})),e.d(n,"isMacOsCna",(function(){return T})),e.d(n,"supportsPopups",(function(){return I})),e.d(n,"isChrome",(function(){return z})),e.d(n,"isSafari",(function(){return H})),e.d(n,"isIpadOs",(function(){return W})),e.d(n,"isApplePaySupported",(function(){return N})),e.d(n,"isCrossSiteTrackingEnabled",(function(){return L})),e.d(n,"getBody",(function(){return Yn})),e.d(n,"isDocumentReady",(function(){return Zn})),e.d(n,"isDocumentInteractive",(function(){return te})),e.d(n,"urlEncode",(function(){return ne})),e.d(n,"waitForWindowReady",(function(){return ee})),e.d(n,"waitForDocumentReady",(function(){return re})),e.d(n,"waitForDocumentBody",(function(){return oe})),e.d(n,"parseQuery",(function(){return ie})),e.d(n,"getQueryParam",(function(){return ue})),e.d(n,"urlWillRedirectPage",(function(){return ce})),e.d(n,"formatQuery",(function(){return ae})),e.d(n,"extendQuery",(function(){return fe})),e.d(n,"extendUrl",(function(){return se})),e.d(n,"redirect",(function(){return de})),e.d(n,"hasMetaViewPort",(function(){return le})),e.d(n,"isElementVisible",(function(){return he})),e.d(n,"getPerformance",(function(){return pe})),e.d(n,"enablePerformance",(function(){return ve})),e.d(n,"getPageRenderTime",(function(){return me})),e.d(n,"htmlEncode",(function(){return we})),e.d(n,"isBrowser",(function(){return ye})),e.d(n,"querySelectorAll",(function(){return ge})),e.d(n,"onClick",(function(){return be})),e.d(n,"getScript",(function(){return Se})),e.d(n,"isLocalStorageEnabled",(function(){return Ee})),e.d(n,"getBrowserLocales",(function(){return Oe})),e.d(n,"appendChild",(function(){return xe})),e.d(n,"getElementSafe",(function(){return _e})),e.d(n,"getElement",(function(){return je})),e.d(n,"elementReady",(function(){return Ce})),e.d(n,"PopupOpenError",(function(){return ke})),e.d(n,"popup",(function(){return Ae})),e.d(n,"writeToWindow",(function(){return Me})),e.d(n,"writeElementToWindow",(function(){return Te})),e.d(n,"setStyle",(function(){return Ie})),e.d(n,"awaitFrameLoad",(function(){return ze})),e.d(n,"awaitFrameWindow",(function(){return He})),e.d(n,"createElement",(function(){return We})),e.d(n,"iframe",(function(){return Ne})),e.d(n,"addEventListener",(function(){return Le})),e.d(n,"bindEvents",(function(){return Re})),e.d(n,"setVendorCSS",(function(){return Be})),e.d(n,"animate",(function(){return Ve})),e.d(n,"makeElementVisible",(function(){return qe})),e.d(n,"makeElementInvisible",(function(){return Je})),e.d(n,"showElement",(function(){return $e})),e.d(n,"hideElement",(function(){return Ge})),e.d(n,"destroyElement",(function(){return Ke})),e.d(n,"showAndAnimate",(function(){return Qe})),e.d(n,"animateAndHide",(function(){return Xe})),e.d(n,"addClass",(function(){return Ye})),e.d(n,"removeClass",(function(){return Ze})),e.d(n,"isElementClosed",(function(){return tr})),e.d(n,"watchElementForClose",(function(){return nr})),e.d(n,"fixScripts",(function(){return er})),e.d(n,"onResize",(function(){return rr})),e.d(n,"getResourceLoadTime",(function(){return or})),e.d(n,"isShadowElement",(function(){return ir})),e.d(n,"getShadowRoot",(function(){return ur})),e.d(n,"getShadowHost",(function(){return cr})),e.d(n,"insertShadowSlot",(function(){return ar})),e.d(n,"preventClickFocus",(function(){return fr})),e.d(n,"getStackTrace",(function(){return sr})),e.d(n,"getCurrentScript",(function(){return lr})),e.d(n,"getCurrentScriptUID",(function(){return pr})),e.d(n,"submitForm",(function(){return vr})),e.d(n,"experiment",(function(){return br})),e.d(n,"getGlobalNameSpace",(function(){return Sr})),e.d(n,"getStorage",(function(){return mr})),e.d(n,"isElement",(function(){return jt})),e.d(n,"getFunctionName",(function(){return Ct})),e.d(n,"setFunctionName",(function(){return Pt})),e.d(n,"base64encode",(function(){return kt})),e.d(n,"base64decode",(function(){return At})),e.d(n,"uniqueID",(function(){return Mt})),e.d(n,"getGlobal",(function(){return Tt})),e.d(n,"getObjectID",(function(){return It})),e.d(n,"getEmptyObject",(function(){return Ht})),e.d(n,"memoize",(function(){return Lt})),e.d(n,"promiseIdentity",(function(){return Rt})),e.d(n,"memoizePromise",(function(){return Dt})),e.d(n,"promisify",(function(){return Bt})),e.d(n,"inlineMemoize",(function(){return Ft})),e.d(n,"noop",(function(){return Ut})),e.d(n,"once",(function(){return Vt})),e.d(n,"hashStr",(function(){return qt})),e.d(n,"strHashStr",(function(){return Jt})),e.d(n,"match",(function(){return $t})),e.d(n,"awaitKey",(function(){return Gt})),e.d(n,"stringifyError",(function(){return Kt})),e.d(n,"stringifyErrorMessage",(function(){return Qt})),e.d(n,"stringify",(function(){return Xt})),e.d(n,"domainMatches",(function(){return Yt})),e.d(n,"patchMethod",(function(){return Zt})),e.d(n,"extend",(function(){return tn})),e.d(n,"values",(function(){return nn})),e.d(n,"memoizedValues",(function(){return en})),e.d(n,"perc",(function(){return rn})),e.d(n,"min",(function(){return on})),e.d(n,"max",(function(){return un})),e.d(n,"roundUp",(function(){return cn})),e.d(n,"regexMap",(function(){return an})),e.d(n,"svgToBase64",(function(){return fn})),e.d(n,"objFilter",(function(){return sn})),e.d(n,"identity",(function(){return dn})),e.d(n,"regexTokenize",(function(){return ln})),e.d(n,"promiseDebounce",(function(){return hn})),e.d(n,"safeInterval",(function(){return pn})),e.d(n,"isInteger",(function(){return vn})),e.d(n,"isFloat",(function(){return mn})),e.d(n,"serializePrimitive",(function(){return wn})),e.d(n,"deserializePrimitive",(function(){return yn})),e.d(n,"dotify",(function(){return gn})),e.d(n,"undotify",(function(){return bn})),e.d(n,"eventEmitter",(function(){return Sn})),e.d(n,"camelToDasherize",(function(){return En})),e.d(n,"dasherizeToCamel",(function(){return On})),e.d(n,"capitalizeFirstLetter",(function(){return xn})),e.d(n,"get",(function(){return _n})),e.d(n,"safeTimeout",(function(){return jn})),e.d(n,"defineLazyProp",(function(){return Cn})),e.d(n,"arrayFrom",(function(){return Pn})),e.d(n,"isObject",(function(){return kn})),e.d(n,"isObjectObject",(function(){return An})),e.d(n,"isPlainObject",(function(){return Mn})),e.d(n,"replaceObject",(function(){return Tn})),e.d(n,"copyProp",(function(){return In})),e.d(n,"regex",(function(){return zn})),e.d(n,"regexAll",(function(){return Hn})),e.d(n,"isDefined",(function(){return Wn})),e.d(n,"cycle",(function(){return Nn})),e.d(n,"debounce",(function(){return Ln})),e.d(n,"isRegex",(function(){return Rn})),e.d(n,"weakMapMemoize",(function(){return Dn})),e.d(n,"weakMapMemoizePromise",(function(){return Bn})),e.d(n,"getOrSet",(function(){return Fn})),e.d(n,"cleanup",(function(){return Un})),e.d(n,"tryCatch",(function(){return Vn})),e.d(n,"removeFromArray",(function(){return qn})),e.d(n,"assertExists",(function(){return Jn})),e.d(n,"unique",(function(){return $n})),e.d(n,"constHas",(function(){return Gn})),e.d(n,"dedupeErrors",(function(){return Kn})),e.d(n,"ExtendableError",(function(){return Qn})),e.d(n,"sanitizeUrl",(function(){return Xn})),e.d(n,"request",(function(){return xr})),e.d(n,"addHeaderBuilder",(function(){return _r})),e.d(n,"TYPES",(function(){return jr})),e.d(n,"memoized",(function(){return Cr})),e.d(n,"promise",(function(){return Pr})),e.d(n,"isPerc",(function(){return kr})),e.d(n,"isPx",(function(){return Ar})),e.d(n,"toNum",(function(){return Mr})),e.d(n,"toPx",(function(){return Tr})),e.d(n,"toCSS",(function(){return Ir})),e.d(n,"percOf",(function(){return zr})),e.d(n,"normalizeDimension",(function(){return Hr})),e.d(n,"wrapPromise",(function(){return Wr})),e.d(n,"KEY_CODES",(function(){return mt})),e.d(n,"ATTRIBUTES",(function(){return wt})),e.d(n,"UID_HASH_LENGTH",(function(){return yt})),e.d(n,"invalidProtocolRegex",(function(){return gt})),e.d(n,"htmlEntitiesRegex",(function(){return bt})),e.d(n,"htmlCtrlEntityRegex",(function(){return St})),e.d(n,"ctrlCharactersRegex",(function(){return Et})),e.d(n,"urlSchemeRegex",(function(){return Ot})),e.d(n,"relativeFirstCharacters",(function(){return xt})),e.d(n,"BLANK_URL",(function(){return _t})),e.d(n,"sfvcScreens",(function(){return r}));var r={932:{textSizeHeights:[746,742,738],textSizeHeightsNoTabs:[854,852,850,848],zoomHeight:{1.15:[746,742,738],1.25:[746,743],1.5:[746,743],1.75:[746,742,739],2:[746,742],2.5:[745,743],3:[749],3.01:[749]},maybeSafari:{1:[732],1.15:[733],1.25:[738,733],1.5:[738,732],1.75:[732],2:[738,732],2.5:[738,733],3:[743,740,734],3.01:[743,740,734]}},926:{textSizeHeights:[752,748,744,738],textSizeHeightsNoTabs:[860,858,856,854],zoomHeight:{1.15:[752,747,744,738],1.25:[753,748,744,738],1.5:[752,749,744,738],1.75:[753,747,744,739],2:[752,748,744],2.5:[753,748],3:[753,744]},maybeSafari:{2:[738],2.5:[745,738],3:[747,738]}},896:{textSizeHeights:[721,717,713,707],textSizeHeightsNoTabs:[829,827,825,823],zoomHeight:{1.15:[721,716,713,707],1.25:[721,718,713,708],1.5:[722,717,713],1.75:[721,718,712,707],2:[722,718,714,708],2.5:[720,718,713,708],3:[720,717,708]},maybeSafari:{1.5:[707],3:[714]}},852:{textSizeHeights:[666,662,658],textSizeHeightsNoTabs:[774,772,770,768],zoomHeight:{1.15:[666,662,658],1.25:[665,661,658],1.5:[666,662,659],1.75:[667,662],1.99:[663,659],2:[663,659],2.5:[665,663],3:[666,663]},maybeSafari:{1:[652],1.15:[652],1.25:[651],1.5:[653],1.75:[658,653],1.99:[655,649],2:[655,649],2.5:[658,653],3:[657,651]}},844:{textSizeHeights:[670,666,662,656],textSizeHeightsNoTabs:[778,776,774,772],zoomHeight:{1.15:[670,666,662],1.25:[670,666,663,656],1.5:[671,666,662],1.75:[670,667,662,656],2:[670,666,662],2.5:[670,663],3:[669,666,663,657]},maybeSafari:{1.15:[656],1.5:[656],2:[656],2.5:[665,655],3:[663]}},812:{textSizeHeights:[641,637,633,627],textSizeHeightsNoTabs:[749,747,745,743],zoomHeight:{1.15:[641,637,633,627],1.25:[641,638,633,628],1.5:[641,638,633,627],1.75:[641,637,634],2:[642,638,634,628],2.5:[640,638,633,628],3:[642,633]},maybeSafari:{1.75:[627],3:[636,627]}},736:{textSizeHeights:[628,624,620,614],textSizeHeightsNoTabs:[736,734,732,730],zoomHeight:{1.15:[628,624,620,614],1.25:[628,624,620,614],1.5:[629,624,620],1.75:[628,625,620,614],2:[628,624,620],2.5:[628,625,620,615],3:[627,624,615]},maybeSafari:{1.5:[614],2:[614],3:[621]}},667:{textSizeHeights:[559,555,551,545],textSizeHeightsNoTabs:[667,665,663,661],zoomHeight:{1.15:[559,555,551,545],1.25:[559,555,551,545],1.5:[560,555,551],1.75:[558,555,551],2:[560,556,552,546],2.5:[560,555,550],3:[558,555,546]},maybeSafari:{1.5:[545],1.75:[544],2.5:[545],3:[552]}}};function o(){return window.navigator.mockUserAgent||window.navigator.userAgent}var i=/ip(a|ro)d|silk|xoom|playbook|tablet|kindle|Nexus 7|GT-P10|SC-01C|SHW-M180S|SM-T320|SGH-T849|SCH-I800|SHW-M180L|SPH-P100|SGH-I987|zt180|HTC( Flyer|_Flyer)|Sprint ATP51|ViewPad7|pandigital(sprnova|nova)|Ideos S7|Dell Streak 7|Advent Vega|A101IT|A70BHT|MID7015|Next2|nook|FOLIO|MB511.*RUTEM|Mac OS.*Silk/i;function u(t){return void 0===t&&(t=o()),!!t.match(/Android|webOS|iPhone|iPad|iPod|bada|Symbian|Palm|CriOS|BlackBerry|IEMobile|WindowsMobile|Opera Mini/i)}function c(t){return void 0===t&&(t=o()),i.test(t)}function a(t){return void 0===t&&(t=o()),/(iPhone|iPod|iPad|Macintosh).*AppleWebKit(?!.*Safari)|.*WKWebView/i.test(t)||/\bwv\b/.test(t)||/Android.*Version\/(\d)\.(\d)/i.test(t)}function f(){return!0===window.navigator.standalone||window.matchMedia("(display-mode: standalone)").matches}function s(t){return void 0===t&&(t=o()),/FBAN/.test(t)||/FBAV/.test(t)}function d(t){return void 0===t&&(t=o()),/Instagram/.test(t)}function l(t){return void 0===t&&(t=o()),s(t)||d(t)}function h(t){return void 0===t&&(t=o()),/IABMV/.test(t)}function p(t){return void 0===t&&(t=o()),/Firefox/i.test(t)}function v(t){return void 0===t&&(t=o()),/FxiOS/i.test(t)}function m(t){return void 0===t&&(t=o()),/EdgiOS/i.test(t)}function w(t){return void 0===t&&(t=o()),/Opera Mini/i.test(t)}function y(t){return void 0===t&&(t=o()),/Android/.test(t)}function g(t){return void 0===t&&(t=o()),y(t)&&p(t)}function b(t){return void 0===t&&(t=o()),/iPhone|iPod|iPad/.test(t)}function S(t){return void 0===t&&(t=o()),/iPhone.*OS.*(1)?(?:(1)[0-4]| [0-9])_/.test(t)}function E(t){return void 0===t&&(t=o()),/\bGSA\b/.test(t)}function O(t){return void 0===t&&(t=o()),/QQBrowser/.test(t)}function x(t){return void 0===t&&(t=o()),!!b(t)&&(!!E(t)||/.+AppleWebKit(?!.*Safari)|.*WKWebView/.test(t))}function _(t){if(void 0===t&&(t=o()),b(t)){var n=window.innerHeight,e=Math.round(window.screen.width/window.innerWidth*100)/100,i=Math.round(n*e),u=null;if(S(t))u=r[window.outerHeight];else{if(1!==e)return!0;u=r[window.outerHeight]}return!u||(e>1&&u.zoomHeight&&u.zoomHeight[e]?-1!==u.zoomHeight[e].indexOf(i):-1!==u.textSizeHeights.indexOf(i)||-1!==u.textSizeHeightsNoTabs.indexOf(i))}return!1}function j(t){if(void 0===t&&(t=o()),b(t)){var n=_(t),e=S(t)?r[window.outerHeight]:null;if(!e)return!1;var i=window.innerHeight,u=Math.round(window.screen.width/window.innerWidth*100)/100,c=Math.round(i*u),a=e.maybeSafari,f=!1;return u>1&&a[u]&&-1!==a[u].indexOf(c)&&(f=!0),n||f}return!1}function C(t){return void 0===t&&(t=o()),!!y(t)&&/Version\/[\d.]+/.test(t)&&!w(t)}function P(){return!!window.document.documentMode||Boolean(window.navigator&&window.navigator.userAgent&&/Edge|MSIE|rv:11/i.test(window.navigator.userAgent))}function k(){var t=window.document.querySelector('meta[http-equiv="X-UA-Compatible"]'),n=window.document.querySelector('meta[content="IE=edge"]');return!(!t||!n)}function A(){return!("undefined"==typeof process||!process.versions||!process.versions.electron)}function M(){if(window.document.documentMode)try{var t=window.status;return window.status="testIntranetMode","testIntranetMode"===window.status&&(window.status=t,!0)}catch(t){return!1}return!1}function T(){var t=o();return/Macintosh.*AppleWebKit(?!.*Safari)/i.test(t)}function I(t){return void 0===t&&(t=o()),!(a(t)||x(t)||C(t)||w(t)||v(t)||g(t)||m(t)||s(t)||O(t)||A()||T()||f())}function z(t){return void 0===t&&(t=o()),/Chrome|Chromium|CriOS/.test(t)&&!/SamsungBrowser|Silk|EdgA/.test(t)}function H(t){return void 0===t&&(t=o()),/Safari/.test(t)&&!z(t)&&!/Silk|FxiOS|EdgiOS/.test(t)}function W(t){return void 0===t&&(t=o()),!(/iPhone|iPod/.test(t)||!(/iPad/.test(t)||H(t)&&navigator.maxTouchPoints>=1))}function N(){try{if(window.ApplePaySession&&window.ApplePaySession.supportsVersion(3)&&window.ApplePaySession.canMakePayments())return!0}catch(t){return!1}return!1}function L(t){return-1===window.document.cookie.indexOf(t)}function R(t,n){return(R=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function D(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,R(t,n)}function B(){return(B=Object.assign||function(t){for(var n=1;n>>0)+"__",function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var t=new WeakMap,n={};return Object.freeze(n),t.set(n,"__testvalue__"),"__testvalue__"===t.get(n)}catch(t){return!1}}())try{this.weakmap=new WeakMap}catch(t){}this.keys=[],this.values=[]}var n=t.prototype;return n._cleanupClosedWindows=function(){for(var t=this.weakmap,n=this.keys,e=0;e=3)return"stringifyError stack overflow";try{if(!t)return"";if("string"==typeof t)return t;if(t instanceof Error){var e=t&&t.stack,r=t&&t.message;if(e&&r)return-1!==e.indexOf(r)?e:r+"\n"+e;if(e)return e;if(r)return r}return t&&t.toString&&"function"==typeof t.toString?t.toString():{}.toString.call(t)}catch(t){return"Error while stringifying error: "+Kt(t,n+1)}}function Qt(t){var n="";return t?t instanceof Error?t.message||n:"string"==typeof t.message&&t.message||n:n}function Xt(t){return"string"==typeof t?t:t&&t.toString&&"function"==typeof t.toString?t.toString():{}.toString.call(t)}function Yt(t,n){var e=(t=t.split("://")[1]).indexOf(n);return-1!==e&&t.slice(e)===n}function Zt(t,n,e){var r=t[n];t[n]=function(){var t=arguments,n=this;return e({context:this,args:[].slice.call(arguments),original:r,callOriginal:function(){return r.apply(n,t)}})}}function tn(t,n){if(!n)return t;if(Object.assign)return Object.assign(t,n);for(var e in n)n.hasOwnProperty(e)&&(t[e]=n[e]);return t}function nn(t){if(Object.values)return Object.values(t);var n=[];for(var e in t)t.hasOwnProperty(e)&&n.push(t[e]);return n}Lt.clear=function(){Nt=Wt};var en=Lt(nn);function rn(t,n){return Math.round(t*n/100)}function on(){return Math.min.apply(Math,arguments)}function un(){return Math.max.apply(Math,arguments)}function cn(t,n){var e=t%n;return e?t-e+n:t}function an(t,n,e){var r=[];return t.replace(n,(function(t){r.push(e?e.apply(null,arguments):t)})),r}function fn(t){return"data:image/svg+xml;base64,"+kt(t)}function sn(t,n){void 0===n&&(n=Boolean);var e={};for(var r in t)t.hasOwnProperty(r)&&n(t[r],r)&&(e[r]=t[r]);return e}function dn(t){return t}function ln(t,n){var e=[];return t.replace(n,(function(t){return e.push(t),""})),e}function hn(t,n){var e,r;return void 0===n&&(n=50),Pt((function(){r&&clearTimeout(r);var o=e=e||new Q;return r=setTimeout((function(){e=null,r=null,Q.try(t).then((function(t){o.resolve(t)}),(function(t){o.reject(t)}))}),n),o}),Ct(t)+"::promiseDebounced")}function pn(t,n){var e;return function r(){e=setTimeout((function(){t(),r()}),n)}(),{cancel:function(){clearTimeout(e)}}}function vn(t){return Boolean(t.match(/^[0-9]+$/))}function mn(t){return Boolean(t.match(/^[0-9]+\.[0-9]+$/))}function wn(t){return t.toString()}function yn(t){return"true"===t||"false"!==t&&(vn(t)?parseInt(t,10):mn(t)?parseFloat(t):t)}function gn(t,n,e){for(var r in void 0===n&&(n=""),void 0===e&&(e={}),n=n?n+".":n,t)t.hasOwnProperty(r)&&null!=t[r]&&"function"!=typeof t[r]&&(t[r]&&Array.isArray(t[r])&&t[r].length&&t[r].every((function(t){return"object"!=typeof t}))?e[""+n+r+"[]"]=t[r].join(","):t[r]&&"object"==typeof t[r]?e=gn(t[r],""+n+r,e):e[""+n+r]=wn(t[r]));return e}function bn(t){var n={};for(var e in t)if(t.hasOwnProperty(e)&&"string"==typeof t[e]){var r=t[e];e.match(/^.+\[\]$/)?(e=e.slice(0,-2),r=r.split(",").map(yn)):r=yn(r);for(var o=n,i=e.split("."),u=0;u1?e-1:0),o=1;o1?r-1:0),i=1;i-1}(e))return e;var r=e.match(Ot);return r&>.test(r[0])?_t:e}function Yn(){var t=document.body;if(!t)throw new Error("Body element not found");return t}function Zn(){return Boolean(document.body)&&"complete"===document.readyState}function te(){return Boolean(document.body)&&"interactive"===document.readyState}function ne(t){return encodeURIComponent(t)}function ee(){return Ft(ee,(function(){return new Q((function(t){Zn()&&t(),window.addEventListener("load",(function(){return t()}))}))}))}var re=Lt((function(){return new Q((function(t){if(Zn()||te())return t();var n=setInterval((function(){if(Zn()||te())return clearInterval(n),t()}),10)}))}));function oe(){return Q.try((function(){return document.body?document.body:re().then((function(){if(document.body)return document.body;throw new Error("Document ready but document.body not present")}))}))}function ie(t){return Ft(ie,(function(){var n={};if(!t)return n;if(-1===t.indexOf("="))return n;for(var e=0,r=t.split("&");e1e3&&t.now()-(t.timing.connectEnd-t.timing.navigationStart)>0)return t}))}function ve(){return Boolean(pe())}function me(){return re().then((function(){var t=pe();if(t){var n=t.timing;return n.connectEnd&&n.domInteractive?n.domInteractive-n.connectEnd:void 0}}))}function we(t){return void 0===t&&(t=""),t.toString().replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}function ye(){return"undefined"!=typeof window&&void 0!==window.location}function ge(t,n){return void 0===n&&(n=window.document),[].slice.call(n.querySelectorAll(t))}function be(t,n){t.addEventListener("touchstart",Ut,{passive:!0}),t.addEventListener("click",n),t.addEventListener("keypress",(function(t){if(t.keyCode===mt.ENTER||t.keyCode===mt.SPACE)return n(t)}))}function Se(t){var n=t.host,e=void 0===n?window.location.host:n,r=t.path,o=t.reverse,i=void 0!==o&&o;return Ft(Se,(function(){var t=""+e+r,n=[].slice.call(document.getElementsByTagName("script"));i&&n.reverse();for(var o=0;or&&(e=null),e||(e={guid:o||Mt(),created:i}),n.__session__=e,t(e)}))}return{getState:u,getID:c,isStateFresh:function(){return c()===i},getSessionState:function(t){return a((function(n){return n.state=n.state||{},t(n.state)}))},getSessionID:function(){return a((function(t){return t.guid}))}}}),[{name:n,lifetime:r}])}function wr(){return mr({name:"belter_experiment"})}function yr(t){return wr().getSessionState((function(n){return n.loggedBeacons=n.loggedBeacons||[],-1===n.loggedBeacons.indexOf(t)&&(n.loggedBeacons.push(t),!0)}))}function gr(t){return Math.floor(Math.random()*t)}function br(t){var n,e=t.name,r=t.sample,o=void 0===r?50:r,i=t.logTreatment,u=void 0===i?Ut:i,c=t.logCheckpoint,a=void 0===c?Ut:c,f=t.sticky,s=void 0===f||f?function(t){return wr().getState((function(n){return n.throttlePercentiles=n.throttlePercentiles||{},n.throttlePercentiles[t]=n.throttlePercentiles[t]||gr(100),n.throttlePercentiles[t]}))}(e):gr(100),d=e+"_"+(n=s=50||o<=s&&s<2*o?"control":"throttle"),l=!1,h=!1;try{window.localStorage&&window.localStorage.getItem(e)&&(h=!0)}catch(t){}var p={isEnabled:function(){return"test"===n||h},isDisabled:function(){return"test"!==n&&!h},getTreatment:function(){return d},log:function(t,n){return void 0===n&&(n={}),l?(yr(d+"_"+JSON.stringify(n))&&u({name:e,treatment:d,payload:n,throttle:s}),yr(d+"_"+t+"_"+JSON.stringify(n))&&a({name:e,treatment:d,checkpoint:t,payload:n,throttle:s}),p):p},logStart:function(t){return void 0===t&&(t={}),l=!0,p.log("start",t)},logComplete:function(t){return void 0===t&&(t={}),p.log("complete",t)}};return p}function Sr(t){var n=t.name,e=t.version,r=void 0===e?"latest":e,o=Tt(),i="__"+n+"__"+r+"_global__",u=o[i]=o[i]||{};return{get:function(t,n){return n=n||{},u[t]=u[t]||n}}}function Er(t,n){(null==n||n>t.length)&&(n=t.length);for(var e=0,r=Array(n);e1&&u.zoomHeight&&u.zoomHeight[e]?-1!==u.zoomHeight[e].indexOf(i):-1!==u.textSizeHeights.indexOf(i)||-1!==u.textSizeHeightsNoTabs.indexOf(i))}return!1}function j(t){if(void 0===t&&(t=o()),b(t)){var n=_(t),e=S(t)?r[window.outerHeight]:null;if(!e)return!1;var i=window.innerHeight,u=Math.round(window.screen.width/window.innerWidth*100)/100,c=Math.round(i*u),a=e.maybeSafari,f=!1;return u>1&&a[u]&&-1!==a[u].indexOf(c)&&(f=!0),n||f}return!1}function C(t){return void 0===t&&(t=o()),!!g(t)&&/Version\/[\d.]+/.test(t)&&!w(t)}function P(){return!!window.document.documentMode||Boolean(window.navigator&&window.navigator.userAgent&&/Edge|MSIE|rv:11/i.test(window.navigator.userAgent))}function k(){var t=window.document.querySelector('meta[http-equiv="X-UA-Compatible"]'),n=window.document.querySelector('meta[content="IE=edge"]');return!(!t||!n)}function A(){return!("undefined"==typeof process||!process.versions||!process.versions.electron)}function M(){if(window.document.documentMode)try{var t=window.status;return window.status="testIntranetMode","testIntranetMode"===window.status&&(window.status=t,!0)}catch(t){return!1}return!1}function T(){var t=o();return/Macintosh.*AppleWebKit(?!.*Safari)/i.test(t)}function I(t){return void 0===t&&(t=o()),!(a(t)||x(t)||C(t)||w(t)||v(t)||y(t)||m(t)||s(t)||O(t)||A()||T()||f())}function z(t){return void 0===t&&(t=o()),/Chrome|Chromium|CriOS/.test(t)&&!/SamsungBrowser|Silk|EdgA/.test(t)}function H(t){return void 0===t&&(t=o()),/Safari/.test(t)&&!z(t)&&!/Silk|FxiOS|EdgiOS/.test(t)}function W(t){return void 0===t&&(t=o()),!(/iPhone|iPod/.test(t)||!(/iPad/.test(t)||H(t)&&navigator.maxTouchPoints>=1))}function N(){try{if(window.ApplePaySession&&window.ApplePaySession.supportsVersion(3)&&window.ApplePaySession.canMakePayments())return!0}catch(t){return!1}return!1}function L(t){return-1===window.document.cookie.indexOf(t)}function R(t,n){return(R=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function D(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,R(t,n)}function B(){return(B=Object.assign||function(t){for(var n=1;n>>0)+"__",function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var t=new WeakMap,n={};return Object.freeze(n),t.set(n,"__testvalue__"),"__testvalue__"===t.get(n)}catch(t){return!1}}())try{this.weakmap=new WeakMap}catch(t){}this.keys=[],this.values=[]}var n=t.prototype;return n._cleanupClosedWindows=function(){for(var t=this.weakmap,n=this.keys,e=0;e=3)return"stringifyError stack overflow";try{if(!t)return"";if("string"==typeof t)return t;if(t instanceof Error){var e=t&&t.stack,r=t&&t.message;if(e&&r)return-1!==e.indexOf(r)?e:r+"\n"+e;if(e)return e;if(r)return r}return t&&t.toString&&"function"==typeof t.toString?t.toString():{}.toString.call(t)}catch(t){return"Error while stringifying error: "+Kt(t,n+1)}}function Qt(t){var n="";return t?t instanceof Error?t.message||n:"string"==typeof t.message&&t.message||n:n}function Xt(t){return"string"==typeof t?t:t&&t.toString&&"function"==typeof t.toString?t.toString():{}.toString.call(t)}function Yt(t,n){var e=(t=t.split("://")[1]).indexOf(n);return-1!==e&&t.slice(e)===n}function Zt(t,n,e){var r=t[n];t[n]=function(){var t=arguments,n=this;return e({context:this,args:[].slice.call(arguments),original:r,callOriginal:function(){return r.apply(n,t)}})}}function tn(t,n){if(!n)return t;if(Object.assign)return Object.assign(t,n);for(var e in n)n.hasOwnProperty(e)&&(t[e]=n[e]);return t}function nn(t){if(Object.values)return Object.values(t);var n=[];for(var e in t)t.hasOwnProperty(e)&&n.push(t[e]);return n}Lt.clear=function(){Nt=Wt};var en=Lt(nn);function rn(t,n){return Math.round(t*n/100)}function on(){return Math.min.apply(Math,arguments)}function un(){return Math.max.apply(Math,arguments)}function cn(t,n){var e=t%n;return e?t-e+n:t}function an(t,n,e){var r=[];return t.replace(n,(function(t){r.push(e?e.apply(null,arguments):t)})),r}function fn(t){return"data:image/svg+xml;base64,"+kt(t)}function sn(t,n){void 0===n&&(n=Boolean);var e={};for(var r in t)t.hasOwnProperty(r)&&n(t[r],r)&&(e[r]=t[r]);return e}function dn(t){return t}function ln(t,n){var e=[];return t.replace(n,(function(t){return e.push(t),""})),e}function hn(t,n){var e,r;return void 0===n&&(n=50),Pt((function(){r&&clearTimeout(r);var o=e=e||new Q;return r=setTimeout((function(){e=null,r=null,Q.try(t).then((function(t){o.resolve(t)}),(function(t){o.reject(t)}))}),n),o}),Ct(t)+"::promiseDebounced")}function pn(t,n){var e;return function r(){e=setTimeout((function(){t(),r()}),n)}(),{cancel:function(){clearTimeout(e)}}}function vn(t){return Boolean(t.match(/^[0-9]+$/))}function mn(t){return Boolean(t.match(/^[0-9]+\.[0-9]+$/))}function wn(t){return t.toString()}function gn(t){return"true"===t||"false"!==t&&(vn(t)?parseInt(t,10):mn(t)?parseFloat(t):t)}function yn(t,n,e){for(var r in void 0===n&&(n=""),void 0===e&&(e={}),n=n?n+".":n,t)t.hasOwnProperty(r)&&null!=t[r]&&"function"!=typeof t[r]&&(t[r]&&Array.isArray(t[r])&&t[r].length&&t[r].every((function(t){return"object"!=typeof t}))?e[""+n+r+"[]"]=t[r].join(","):t[r]&&"object"==typeof t[r]?e=yn(t[r],""+n+r,e):e[""+n+r]=wn(t[r]));return e}function bn(t){var n={};for(var e in t)if(t.hasOwnProperty(e)&&"string"==typeof t[e]){var r=t[e];e.match(/^.+\[\]$/)?(e=e.slice(0,-2),r=r.split(",").map(gn)):r=gn(r);for(var o=n,i=e.split("."),u=0;u1?e-1:0),o=1;o1?r-1:0),i=1;i-1}(e))return e;var r=e.match(Ot);return r&&yt.test(r[0])?_t:e}function Yn(){var t=document.body;if(!t)throw new Error("Body element not found");return t}function Zn(){return Boolean(document.body)&&"complete"===document.readyState}function te(){return Boolean(document.body)&&"interactive"===document.readyState}function ne(t){return encodeURIComponent(t)}function ee(){return Ft(ee,(function(){return new Q((function(t){Zn()&&t(),window.addEventListener("load",(function(){return t()}))}))}))}var re=Lt((function(){return new Q((function(t){if(Zn()||te())return t();var n=setInterval((function(){if(Zn()||te())return clearInterval(n),t()}),10)}))}));function oe(){return Q.try((function(){return document.body?document.body:re().then((function(){if(document.body)return document.body;throw new Error("Document ready but document.body not present")}))}))}function ie(t){return Ft(ie,(function(){var n={};if(!t)return n;if(-1===t.indexOf("="))return n;for(var e=0,r=t.split("&");e1e3&&t.now()-(t.timing.connectEnd-t.timing.navigationStart)>0)return t}))}function ve(){return Boolean(pe())}function me(){return re().then((function(){var t=pe();if(t){var n=t.timing;return n.connectEnd&&n.domInteractive?n.domInteractive-n.connectEnd:void 0}}))}function we(t){return void 0===t&&(t=""),t.toString().replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}function ge(){return"undefined"!=typeof window&&void 0!==window.location}function ye(t,n){return void 0===n&&(n=window.document),[].slice.call(n.querySelectorAll(t))}function be(t,n){t.addEventListener("touchstart",Ut,{passive:!0}),t.addEventListener("click",n),t.addEventListener("keypress",(function(t){if(t.keyCode===mt.ENTER||t.keyCode===mt.SPACE)return n(t)}))}function Se(t){var n=t.host,e=void 0===n?window.location.host:n,r=t.path,o=t.reverse,i=void 0!==o&&o;return Ft(Se,(function(){var t=""+e+r,n=[].slice.call(document.getElementsByTagName("script"));i&&n.reverse();for(var o=0;or&&(e=null),e||(e={guid:o||Mt(),created:i}),n.__session__=e,t(e)}))}return{getState:u,getID:c,isStateFresh:function(){return c()===i},getSessionState:function(t){return a((function(n){return n.state=n.state||{},t(n.state)}))},getSessionID:function(){return a((function(t){return t.guid}))}}}),[{name:n,lifetime:r}])}function wr(){return mr({name:"belter_experiment"})}function gr(t){return wr().getSessionState((function(n){return n.loggedBeacons=n.loggedBeacons||[],-1===n.loggedBeacons.indexOf(t)&&(n.loggedBeacons.push(t),!0)}))}function yr(t){return Math.floor(Math.random()*t)}function br(t){var n,e=t.name,r=t.sample,o=void 0===r?50:r,i=t.logTreatment,u=void 0===i?Ut:i,c=t.logCheckpoint,a=void 0===c?Ut:c,f=t.sticky,s=void 0===f||f?function(t){return wr().getState((function(n){return n.throttlePercentiles=n.throttlePercentiles||{},n.throttlePercentiles[t]=n.throttlePercentiles[t]||yr(100),n.throttlePercentiles[t]}))}(e):yr(100),d=e+"_"+(n=s=50||o<=s&&s<2*o?"control":"throttle"),l=!1,h=!1;try{window.localStorage&&window.localStorage.getItem(e)&&(h=!0)}catch(t){}var p={isEnabled:function(){return"test"===n||h},isDisabled:function(){return"test"!==n&&!h},getTreatment:function(){return d},log:function(t,n){return void 0===n&&(n={}),l?(gr(d+"_"+JSON.stringify(n))&&u({name:e,treatment:d,payload:n,throttle:s}),gr(d+"_"+t+"_"+JSON.stringify(n))&&a({name:e,treatment:d,checkpoint:t,payload:n,throttle:s}),p):p},logStart:function(t){return void 0===t&&(t={}),l=!0,p.log("start",t)},logComplete:function(t){return void 0===t&&(t={}),p.log("complete",t)}};return p}function Sr(t){var n=t.name,e=t.version,r=void 0===e?"latest":e,o=Tt(),i="__"+n+"__"+r+"_global__",u=o[i]=o[i]||{};return{get:function(t,n){return n=n||{},u[t]=u[t]||n}}}function Er(t,n){(null==n||n>t.length)&&(n=t.length);for(var e=0,r=Array(n);e 1 && device.zoomHeight && device.zoomHeight[scale]) {\n return device.zoomHeight[scale].indexOf(computedHeight) !== -1;\n } else {\n return (\n device.textSizeHeights.indexOf(computedHeight) !== -1 ||\n device.textSizeHeightsNoTabs.indexOf(computedHeight) !== -1\n );\n }\n }\n return false;\n}\n\nexport function isSFVCorSafari(ua?: string = getUserAgent()): boolean {\n if (isIos(ua)) {\n const sfvc = isSFVC(ua);\n\n const device = isIOS14(ua) ? sfvcScreens[window.outerHeight] : null;\n\n if (!device) {\n return false;\n }\n\n const height = window.innerHeight;\n const scale =\n Math.round((window.screen.width / window.innerWidth) * 100) / 100;\n\n const computedHeight = Math.round(height * scale);\n const possibleSafariSizes = device.maybeSafari;\n\n let maybeSafari = false;\n if (\n scale > 1 &&\n possibleSafariSizes[scale] &&\n possibleSafariSizes[scale].indexOf(computedHeight) !== -1\n ) {\n maybeSafari = true;\n }\n\n return sfvc || maybeSafari;\n }\n return false;\n}\n\nexport function isAndroidWebview(ua?: string = getUserAgent()): boolean {\n if (isAndroid(ua)) {\n return /Version\\/[\\d.]+/.test(ua) && !isOperaMini(ua);\n }\n return false;\n}\n\nexport function isIE(): boolean {\n if (window.document.documentMode) {\n return true;\n }\n\n return Boolean(\n window.navigator &&\n window.navigator.userAgent &&\n /Edge|MSIE|rv:11/i.test(window.navigator.userAgent)\n );\n}\n\nexport function isIECompHeader(): boolean {\n const mHttp = window.document.querySelector(\n 'meta[http-equiv=\"X-UA-Compatible\"]'\n );\n const mContent = window.document.querySelector('meta[content=\"IE=edge\"]');\n if (mHttp && mContent) {\n return true;\n }\n return false;\n}\n\nexport function isElectron(): boolean {\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.electron\n ) {\n return true;\n }\n return false;\n}\n\nexport function isIEIntranet(): boolean {\n // This status check only works for older versions of IE with document.documentMode set\n\n if (window.document.documentMode) {\n try {\n const status = window.status;\n\n window.status = \"testIntranetMode\";\n\n if (window.status === \"testIntranetMode\") {\n window.status = status;\n\n return true;\n }\n\n return false;\n } catch (err) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function isMacOsCna(): boolean {\n const userAgent = getUserAgent();\n return /Macintosh.*AppleWebKit(?!.*Safari)/i.test(userAgent);\n}\n\nexport function supportsPopups(ua?: string = getUserAgent()): boolean {\n return !(\n isWebView(ua) ||\n isIosWebview(ua) ||\n isAndroidWebview(ua) ||\n isOperaMini(ua) ||\n isFirefoxIOS(ua) ||\n isFirefoxAndroid(ua) ||\n isEdgeIOS(ua) ||\n isFacebookWebView(ua) ||\n isQQBrowser(ua) ||\n isElectron() ||\n isMacOsCna() ||\n isStandAlone()\n );\n}\n\nexport function isChrome(ua?: string = getUserAgent()): boolean {\n return (\n /Chrome|Chromium|CriOS/.test(ua) && !/SamsungBrowser|Silk|EdgA/.test(ua)\n );\n}\n\nexport function isSafari(ua?: string = getUserAgent()): boolean {\n return /Safari/.test(ua) && !isChrome(ua) && !/Silk|FxiOS|EdgiOS/.test(ua);\n}\n\nexport function isIpadOs(ua?: string = getUserAgent()): boolean {\n // Safari on iOS13+ on an iPad will return a useragent that is the same as Safari on MacOS\n // Adding the maxTouchPoints will determine that it is a touch device\n if (!/iPhone|iPod/.test(ua)) {\n if (/iPad/.test(ua) || (isSafari(ua) && navigator.maxTouchPoints >= 1)) {\n return true;\n }\n }\n return false;\n}\n\nexport function isApplePaySupported(): boolean {\n try {\n if (\n window.ApplePaySession &&\n window.ApplePaySession.supportsVersion(3) &&\n window.ApplePaySession.canMakePayments()\n ) {\n return true;\n }\n } catch (e) {\n return false;\n }\n\n return false;\n}\n\nexport function isCrossSiteTrackingEnabled(expectedCookieKey: string): boolean {\n return window.document.cookie.indexOf(expectedCookieKey) === -1;\n}\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","/* @flow */\n\nexport function isPromise(item : mixed) : boolean {\n try {\n if (!item) {\n return false;\n }\n\n if (typeof Promise !== 'undefined' && item instanceof Promise) {\n return true;\n }\n\n if (typeof window !== 'undefined' && typeof window.Window === 'function' && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && typeof window.constructor === 'function' && item instanceof window.constructor) {\n return false;\n }\n\n const toString = ({}).toString;\n\n if (toString) {\n const name = toString.call(item);\n\n if (name === '[object Window]' || name === '[object global]' || name === '[object DOMWindow]') {\n return false;\n }\n }\n\n if (typeof item.then === 'function') {\n return true;\n }\n } catch (err) {\n return false;\n }\n\n return false;\n}\n","/* @flow */\n\nimport type { ZalgoPromise } from './promise';\n\nconst dispatchedErrors = [];\nconst possiblyUnhandledPromiseHandlers : Array<(mixed, promise? : ZalgoPromise) => void> = [];\n\nexport function dispatchPossiblyUnhandledError(err : mixed, promise : ZalgoPromise) {\n\n if (dispatchedErrors.indexOf(err) !== -1) {\n return;\n }\n\n dispatchedErrors.push(err);\n\n setTimeout(() => {\n if (__DEBUG__) {\n // $FlowFixMe\n throw new Error(`${ err.stack || err.toString() }\\n\\nFrom promise:\\n\\n${ promise.stack }`);\n }\n\n throw err;\n }, 1);\n\n for (let j = 0; j < possiblyUnhandledPromiseHandlers.length; j++) {\n // $FlowFixMe\n possiblyUnhandledPromiseHandlers[j](err, promise);\n }\n}\n\nexport function onPossiblyUnhandledException(handler : (mixed, promise? : ZalgoPromise) => void) : {| cancel : () => void |} {\n possiblyUnhandledPromiseHandlers.push(handler);\n\n return {\n cancel() {\n possiblyUnhandledPromiseHandlers.splice(possiblyUnhandledPromiseHandlers.indexOf(handler), 1);\n }\n };\n}\n","/* @flow */\n\nimport type { ZalgoPromise } from './promise';\n\nlet activeCount = 0;\nlet flushPromise;\n\nfunction flushActive() {\n if (!activeCount && flushPromise) {\n const promise = flushPromise;\n flushPromise = null;\n promise.resolve();\n }\n}\n\nexport function startActive() {\n activeCount += 1;\n}\n\nexport function endActive() {\n activeCount -= 1;\n flushActive();\n}\n\nexport function awaitActive(Zalgo : Class>) : ZalgoPromise { // eslint-disable-line no-undef\n const promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\n/* eslint no-use-before-define: off */\n\nimport { isPromise } from './utils';\nimport { onPossiblyUnhandledException, dispatchPossiblyUnhandledError } from './exceptions';\nimport { startActive, endActive, awaitActive } from './flush';\n\nexport class ZalgoPromise {\n\n resolved : boolean;\n rejected : boolean;\n errorHandled : boolean;\n value : R;\n error : mixed;\n // eslint-disable-next-line flowtype/no-mutable-array\n handlers : Array<{|\n promise : ZalgoPromise<*>,\n onSuccess : void | (result : R) => mixed,\n onError : void | (error : mixed) => mixed\n |}>;\n dispatching : boolean;\n stack : string;\n\n constructor(handler : ?(resolve : (result : R) => void, reject : (error : mixed) => void) => void) {\n\n this.resolved = false;\n this.rejected = false;\n this.errorHandled = false;\n\n this.handlers = [];\n\n if (handler) {\n\n let result;\n let error;\n let resolved = false;\n let rejected = false;\n let isAsync = false;\n\n startActive();\n\n try {\n handler(res => {\n if (isAsync) {\n this.resolve(res);\n } else {\n resolved = true;\n result = res;\n }\n\n }, err => {\n if (isAsync) {\n this.reject(err);\n } else {\n rejected = true;\n error = err;\n }\n });\n\n } catch (err) {\n endActive();\n this.reject(err);\n return;\n }\n\n endActive();\n\n isAsync = true;\n\n if (resolved) {\n // $FlowFixMe\n this.resolve(result);\n } else if (rejected) {\n this.reject(error);\n }\n }\n\n if (__DEBUG__) {\n try {\n throw new Error(`ZalgoPromise`);\n } catch (err) {\n this.stack = err.stack;\n }\n }\n }\n\n resolve(result : R) : ZalgoPromise {\n if (this.resolved || this.rejected) {\n return this;\n }\n\n if (isPromise(result)) {\n throw new Error('Can not resolve promise with another promise');\n }\n\n this.resolved = true;\n this.value = result;\n this.dispatch();\n\n return this;\n }\n\n reject(error : mixed) : ZalgoPromise {\n if (this.resolved || this.rejected) {\n return this;\n }\n\n if (isPromise(error)) {\n throw new Error('Can not reject promise with another promise');\n }\n\n if (!error) {\n // $FlowFixMe\n const err = (error && typeof error.toString === 'function' ? error.toString() : Object.prototype.toString.call(error));\n error = new Error(`Expected reject to be called with Error, got ${ err }`);\n }\n\n this.rejected = true;\n this.error = error;\n\n if (!this.errorHandled) {\n setTimeout(() => {\n if (!this.errorHandled) {\n dispatchPossiblyUnhandledError(error, this);\n }\n }, 1);\n }\n\n this.dispatch();\n\n return this;\n }\n\n asyncReject(error : mixed) : ZalgoPromise {\n this.errorHandled = true;\n this.reject(error);\n return this;\n }\n\n dispatch() {\n\n const { dispatching, resolved, rejected, handlers } = this;\n\n if (dispatching) {\n return;\n }\n\n if (!resolved && !rejected) {\n return;\n }\n\n this.dispatching = true;\n startActive();\n\n const chain = (firstPromise : ZalgoPromise, secondPromise : ZalgoPromise) => {\n return firstPromise.then(res => {\n secondPromise.resolve(res);\n }, err => {\n secondPromise.reject(err);\n });\n };\n\n for (let i = 0; i < handlers.length; i++) {\n\n const { onSuccess, onError, promise } = handlers[i];\n\n let result;\n\n if (resolved) {\n\n try {\n result = onSuccess ? onSuccess(this.value) : this.value;\n } catch (err) {\n promise.reject(err);\n continue;\n }\n\n } else if (rejected) {\n\n if (!onError) {\n promise.reject(this.error);\n continue;\n }\n\n try {\n result = onError(this.error);\n } catch (err) {\n promise.reject(err);\n continue;\n }\n }\n\n if (result instanceof ZalgoPromise && (result.resolved || result.rejected)) {\n const promiseResult : ZalgoPromise<*> = result;\n\n if (promiseResult.resolved) {\n promise.resolve(promiseResult.value);\n } else {\n promise.reject(promiseResult.error);\n }\n\n promiseResult.errorHandled = true;\n\n } else if (isPromise(result)) {\n\n if (result instanceof ZalgoPromise && (result.resolved || result.rejected)) {\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n } else {\n // $FlowFixMe\n chain(result, promise);\n }\n\n } else {\n\n promise.resolve(result);\n }\n }\n\n handlers.length = 0;\n this.dispatching = false;\n endActive();\n }\n\n then(onSuccess : void | (result : R) => (ZalgoPromise | Y), onError : void | (error : mixed) => (ZalgoPromise | Y)) : ZalgoPromise {\n\n if (onSuccess && typeof onSuccess !== 'function' && !onSuccess.call) {\n throw new Error('Promise.then expected a function for success handler');\n }\n\n if (onError && typeof onError !== 'function' && !onError.call) {\n throw new Error('Promise.then expected a function for error handler');\n }\n\n const promise = new ZalgoPromise();\n\n this.handlers.push({\n promise,\n onSuccess,\n onError\n });\n\n this.errorHandled = true;\n\n this.dispatch();\n\n return promise;\n }\n\n catch(onError : (error : mixed) => ZalgoPromise | Y) : ZalgoPromise {\n // $FlowFixMe incompatible-call\n const resultPromise : ZalgoPromise = this.then(undefined, onError);\n return resultPromise;\n }\n\n finally(onFinally : () => mixed) : ZalgoPromise {\n\n if (onFinally && typeof onFinally !== 'function' && !onFinally.call) {\n throw new Error('Promise.finally expected a function');\n }\n\n return this.then((result) => {\n return ZalgoPromise.try(onFinally)\n .then(() => {\n return result;\n });\n }, (err) => {\n return ZalgoPromise.try(onFinally)\n .then(() => {\n throw err;\n });\n });\n }\n\n timeout(time : number, err : ?Error) : ZalgoPromise {\n\n if (this.resolved || this.rejected) {\n return this;\n }\n\n const timeout = setTimeout(() => {\n\n if (this.resolved || this.rejected) {\n return;\n }\n\n this.reject(err || new Error(`Promise timed out after ${ time }ms`));\n\n }, time);\n\n return this.then(result => {\n clearTimeout(timeout);\n return result;\n });\n }\n\n // $FlowFixMe\n toPromise() : Promise {\n // $FlowFixMe\n if (typeof Promise === 'undefined') {\n throw new TypeError(`Could not find Promise`);\n }\n // $FlowFixMe\n return Promise.resolve(this); // eslint-disable-line compat/compat\n }\n\n lazy() : ZalgoPromise {\n this.errorHandled = true;\n return this;\n }\n\n static resolve(value : ZalgoPromise | Y) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n // $FlowFixMe incompatible-type-arg\n const result : ZalgoPromise = value;\n return result;\n }\n\n if (isPromise(value)) {\n // $FlowFixMe\n return new ZalgoPromise((resolve, reject) => value.then(resolve, reject));\n }\n\n return new ZalgoPromise().resolve(value);\n }\n\n static reject(error : mixed) : ZalgoPromise {\n return new ZalgoPromise().reject(error);\n }\n\n static asyncReject(error : mixed) : ZalgoPromise {\n return new ZalgoPromise().asyncReject(error);\n }\n\n static all>(promises : X) : ZalgoPromise<$TupleMap(ZalgoPromise | Y) => Y>> { // eslint-disable-line no-undef\n\n const promise = new ZalgoPromise();\n let count = promises.length;\n // eslint-disable-next-line no-undef, unicorn/prefer-spread\n const results = ([] : $TupleMap(ZalgoPromise | Y) => Y>).slice();\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n const chain = (i : number, firstPromise : ZalgoPromise, secondPromise : ZalgoPromise) => {\n return firstPromise.then(res => {\n results[i] = res;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n secondPromise.reject(err);\n });\n };\n\n for (let i = 0; i < promises.length; i++) {\n const prom = promises[i];\n\n if (prom instanceof ZalgoPromise) {\n if (prom.resolved) {\n results[i] = prom.value;\n count -= 1;\n continue;\n }\n } else if (!isPromise(prom)) {\n results[i] = prom;\n count -= 1;\n continue;\n }\n\n chain(i, ZalgoPromise.resolve(prom), promise);\n }\n\n if (count === 0) {\n promise.resolve(results);\n }\n\n return promise;\n }\n\n static hash(promises : O) : ZalgoPromise<$ObjMap(ZalgoPromise | Y) => Y>> { // eslint-disable-line no-undef\n const result = {};\n const awaitPromises = [];\n\n for (const key in promises) {\n if (promises.hasOwnProperty(key)) {\n const value = promises[key];\n\n if (isPromise(value)) {\n awaitPromises.push(value.then(res => {\n result[key] = res;\n }));\n } else {\n result[key] = value;\n }\n }\n }\n\n return ZalgoPromise.all(awaitPromises).then(() => result);\n }\n\n static map(items : $ReadOnlyArray, method : (T) => (ZalgoPromise | X)) : ZalgoPromise<$ReadOnlyArray> {\n // $FlowFixMe\n return ZalgoPromise.all(items.map(method));\n }\n\n static onPossiblyUnhandledException(handler : (err : mixed) => void) : {| cancel : () => void |} {\n return onPossiblyUnhandledException(handler);\n }\n\n static try>(method : (...args : $ReadOnlyArray) => (ZalgoPromise | Y), context? : C, args? : A) : ZalgoPromise {\n\n if (method && typeof method !== 'function' && !method.call) {\n throw new Error('Promise.try expected a function');\n }\n\n let result : ZalgoPromise | Y;\n\n startActive();\n\n try {\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n // $FlowFixMe incompatible-call\n const resultPromise = ZalgoPromise.resolve(result);\n\n return resultPromise;\n }\n\n static delay(delay : number) : ZalgoPromise {\n return new ZalgoPromise(resolve => {\n setTimeout(resolve, delay);\n });\n }\n\n static isPromise(value : mixed) : boolean {\n\n if (value && value instanceof ZalgoPromise) {\n return true;\n }\n\n return isPromise(value);\n }\n\n static flush() : ZalgoPromise {\n return awaitActive(ZalgoPromise);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from \"./util\";\nimport type {\n CrossDomainWindowType,\n SameDomainWindowType,\n DomainMatcher,\n} from \"./types\";\nimport { PROTOCOL, WILDCARD } from \"./constants\";\n\nconst IE_WIN_ACCESS_ERROR = \"Call was rejected by callee.\\r\\n\";\n\nexport function getActualProtocol(win: SameDomainWindowType = window): ?string {\n return win.location.protocol;\n}\n\nexport function getProtocol(win: SameDomainWindowType = window): ?string {\n if (win.mockDomain) {\n const protocol = win.mockDomain.split(\"//\")[0];\n\n if (protocol) {\n return protocol;\n }\n }\n\n return getActualProtocol(win);\n}\n\nexport function isFileProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.ABOUT;\n}\n\nexport function isMockProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.MOCK;\n}\n\nexport function getParent(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n if (!win) {\n return;\n }\n\n try {\n if (win.parent && win.parent !== win) {\n return win.parent;\n }\n } catch (err) {\n // pass\n }\n}\n\nexport function getOpener(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n if (!win) {\n return;\n }\n\n // Make sure we're not actually an iframe which has had window.open() called on us\n if (getParent(win)) {\n return;\n }\n\n try {\n return win.opener;\n } catch (err) {\n // pass\n }\n}\n\nexport function canReadFromWindow(\n win: CrossDomainWindowType | SameDomainWindowType\n): boolean {\n try {\n // $FlowFixMe\n noop(win && win.location && win.location.href);\n return true;\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function getActualDomain(win?: SameDomainWindowType = window): string {\n const location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n const protocol = getActualProtocol(win);\n\n if (!protocol) {\n throw new Error(`Can not read window protocol`);\n }\n\n if (protocol === PROTOCOL.FILE) {\n return `${PROTOCOL.FILE}//`;\n }\n\n if (protocol === PROTOCOL.ABOUT) {\n const parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${PROTOCOL.ABOUT}//`;\n }\n\n const host = location.host;\n\n if (!host) {\n throw new Error(`Can not read window host`);\n }\n\n return `${protocol}//${host}`;\n}\n\nexport function getDomain(win?: SameDomainWindowType = window): string {\n const domain = getActualDomain(win);\n\n if (domain && win.mockDomain && win.mockDomain.indexOf(PROTOCOL.MOCK) === 0) {\n return win.mockDomain;\n }\n\n return domain;\n}\n\nexport function isBlankDomain(win: CrossDomainWindowType): boolean {\n try {\n // $FlowFixMe\n if (!win.location.href) {\n return true;\n }\n\n if (win.location.href === \"about:blank\") {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isActuallySameDomain(win: CrossDomainWindowType): boolean {\n try {\n if (win === window) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n const desc = Object.getOwnPropertyDescriptor(win, \"location\");\n\n if (desc && desc.enumerable === false) {\n return false;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (isAboutProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (isMockProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(\n win: CrossDomainWindowType | SameDomainWindowType\n): boolean {\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n if (win === window) {\n return true;\n }\n\n // $FlowFixMe\n if (isAboutProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n\n // $FlowFixMe\n if (getDomain(window) === getDomain(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function assertSameDomain(\n win: CrossDomainWindowType | SameDomainWindowType\n): SameDomainWindowType {\n if (!isSameDomain(win)) {\n throw new Error(`Expected window to be same domain`);\n }\n\n // $FlowFixMe\n return win;\n}\n\nexport function getParents(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n try {\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n if (!parent || !child) {\n return false;\n }\n\n const childParent = getParent(child);\n\n if (childParent) {\n return childParent === parent;\n }\n\n if (getParents(child).indexOf(parent) !== -1) {\n return true;\n }\n\n return false;\n}\n\nexport function getFrames(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n let frames;\n\n try {\n frames = win.frames;\n } catch (err) {\n frames = win;\n }\n\n let len;\n\n try {\n len = frames.length;\n } catch (err) {\n // pass\n }\n\n if (len === 0) {\n return result;\n }\n\n if (len) {\n for (let i = 0; i < len; i++) {\n let frame;\n\n try {\n frame = frames[i];\n } catch (err) {\n continue;\n }\n\n result.push(frame);\n }\n\n return result;\n }\n\n for (let i = 0; i < 100; i++) {\n let frame;\n\n try {\n frame = frames[i];\n } catch (err) {\n return result;\n }\n\n if (!frame) {\n return result;\n }\n\n result.push(frame);\n }\n\n return result;\n}\n\nexport function getAllChildFrames(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n for (const frame of getFrames(win)) {\n result.push(frame);\n\n for (const childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n try {\n if (win.top) {\n return win.top;\n }\n } catch (err) {\n // pass\n }\n\n if (getParent(win) === win) {\n return win;\n }\n\n try {\n if (isAncestorParent(window, win) && window.top) {\n return window.top;\n }\n } catch (err) {\n // pass\n }\n\n try {\n if (isAncestorParent(win, window) && window.top) {\n return window.top;\n }\n } catch (err) {\n // pass\n }\n\n for (const frame of getAllChildFrames(win)) {\n try {\n if (frame.top) {\n return frame.top;\n }\n } catch (err) {\n // pass\n }\n\n if (getParent(frame) === frame) {\n return frame;\n }\n }\n}\n\nexport function getNextOpener(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(\n win?: CrossDomainWindowType = window\n): CrossDomainWindowType {\n const opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n let result = [...getAllChildFrames(top), top];\n\n // Win may be in shadow dom\n if (result.indexOf(win) === -1) {\n result = [...result, win, ...getAllChildFrames(win)];\n }\n\n return result;\n}\n\nexport function getAllWindows(\n win?: CrossDomainWindowType = window\n): $ReadOnlyArray {\n const frames = getAllFramesInWindow(win);\n const opener = getNextOpener(win);\n\n if (opener) {\n return [...getAllWindows(opener), ...frames];\n } else {\n return frames;\n }\n}\n\nexport function isTop(win: CrossDomainWindowType): boolean {\n return win === getTop(win);\n}\n\nexport function isFrameWindowClosed(frame: HTMLIFrameElement): boolean {\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n const doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n let parent = frame;\n\n while (parent.parentNode && parent.parentNode !== parent) {\n parent = parent.parentNode;\n }\n\n // $FlowFixMe\n if (!parent.host || !doc.documentElement.contains(parent.host)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection: $ReadOnlyArray, item: T): number {\n for (let i = 0; i < collection.length; i++) {\n try {\n if (collection[i] === item) {\n return i;\n }\n } catch (err) {\n // pass\n }\n }\n\n return -1;\n}\n\nconst iframeWindows = [];\nconst iframeFrames = [];\n\nexport function isWindowClosed(\n win: CrossDomainWindowType,\n allowMock: boolean = true\n): boolean {\n try {\n if (win === window) {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (!win) {\n return true;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n } catch (err) {\n // I love you so much IE\n\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return false;\n }\n\n return true;\n }\n\n if (allowMock && isSameDomain(win)) {\n try {\n // $FlowFixMe\n if (win.mockclosed) {\n return true;\n }\n } catch (err) {\n // pass\n }\n }\n\n // Mobile safari\n\n try {\n if (!win.parent || !win.top) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n // Yes, this actually happens in IE. win === win errors out when the window\n // is from an iframe, and the iframe was removed from the page.\n\n try {\n noop(win === win); // eslint-disable-line no-self-compare\n } catch (err) {\n return true;\n }\n\n // IE orphaned frame\n\n const iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n const frame = iframeFrames[iframeIndex];\n\n if (frame && isFrameWindowClosed(frame)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction cleanIframes() {\n for (let i = 0; i < iframeWindows.length; i++) {\n let closed = false;\n\n try {\n closed = iframeWindows[i].closed;\n } catch (err) {\n // pass\n }\n\n if (closed) {\n iframeFrames.splice(i, 1);\n iframeWindows.splice(i, 1);\n }\n }\n}\n\nexport function linkFrameWindow(frame: HTMLIFrameElement) {\n cleanIframes();\n\n if (frame && frame.contentWindow) {\n try {\n iframeWindows.push(frame.contentWindow);\n iframeFrames.push(frame);\n } catch (err) {\n // pass\n }\n }\n}\n\nexport function getUserAgent(win: ?SameDomainWindowType): string {\n win = win || window;\n return win.navigator.mockUserAgent || win.navigator.userAgent;\n}\n\nexport function getFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const winFrames = getFrames(win);\n\n for (const childFrame of winFrames) {\n try {\n if (\n isSameDomain(childFrame) &&\n // $FlowFixMe\n childFrame.name === name &&\n winFrames.indexOf(childFrame) !== -1\n ) {\n return childFrame;\n }\n } catch (err) {\n // pass\n }\n }\n\n try {\n // $FlowFixMe\n if (winFrames.indexOf(win.frames[name]) !== -1) {\n // $FlowFixMe\n return win.frames[name];\n }\n } catch (err) {\n // pass\n }\n\n try {\n if (winFrames.indexOf(win[name]) !== -1) {\n return win[name];\n }\n } catch (err) {\n // pass\n }\n}\n\nexport function findChildFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (const childFrame of getFrames(win)) {\n const namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n const top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(\n win: CrossDomainWindowType,\n frame: CrossDomainWindowType\n): boolean {\n const frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (const childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n return parent === getOpener(child);\n}\n\nexport function getAncestor(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n win = win || window;\n\n const opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n const parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const results = [];\n\n let ancestor = win;\n\n while (ancestor) {\n ancestor = getAncestor(ancestor);\n if (ancestor) {\n results.push(ancestor);\n }\n }\n\n return results;\n}\n\nexport function isAncestor(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n const actualParent = getAncestor(child);\n\n if (actualParent) {\n if (actualParent === parent) {\n return true;\n }\n\n return false;\n }\n\n if (child === parent) {\n return false;\n }\n\n if (getTop(child) === child) {\n return false;\n }\n\n for (const frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup(win?: CrossDomainWindowType = window): boolean {\n return Boolean(getOpener(win));\n}\n\nexport function isIframe(win?: CrossDomainWindowType = window): boolean {\n return Boolean(getParent(win));\n}\n\nexport function isFullpage(win?: CrossDomainWindowType = window): boolean {\n return Boolean(!isIframe(win) && !isPopup(win));\n}\n\nfunction anyMatch(collection1, collection2): boolean {\n for (const item1 of collection1) {\n for (const item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(\n win: CrossDomainWindowType = window\n): number {\n let distance = 0;\n let parent = win;\n\n while (parent) {\n parent = getParent(parent);\n if (parent) {\n distance += 1;\n }\n }\n\n return distance;\n}\n\nexport function getNthParent(\n win: CrossDomainWindowType,\n n: number = 1\n): ?CrossDomainWindowType {\n let parent = win;\n\n for (let i = 0; i < n; i++) {\n if (!parent) {\n return;\n }\n\n parent = getParent(parent);\n }\n\n return parent;\n}\n\nexport function getNthParentFromTop(\n win: CrossDomainWindowType,\n n: number = 1\n): ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(\n win1: CrossDomainWindowType,\n win2: CrossDomainWindowType\n): boolean {\n const top1 = getTop(win1) || win1;\n const top2 = getTop(win2) || win2;\n\n try {\n if (top1 && top2) {\n if (top1 === top2) {\n return true;\n }\n\n return false;\n }\n } catch (err) {\n // pass\n }\n\n const allFrames1 = getAllFramesInWindow(win1);\n const allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n const opener1 = getOpener(top1);\n const opener2 = getOpener(top2);\n\n if (opener1 && anyMatch(getAllFramesInWindow(opener1), allFrames2)) {\n return false;\n }\n\n if (opener2 && anyMatch(getAllFramesInWindow(opener2), allFrames1)) {\n return false;\n }\n\n return false;\n}\n\nexport function matchDomain(\n pattern: DomainMatcher,\n origin: DomainMatcher\n): boolean {\n if (typeof pattern === \"string\") {\n if (typeof origin === \"string\") {\n return pattern === WILDCARD || origin === pattern;\n }\n\n if (isRegex(origin)) {\n return false;\n }\n\n if (Array.isArray(origin)) {\n return false;\n }\n }\n\n if (isRegex(pattern)) {\n if (isRegex(origin)) {\n return pattern.toString() === origin.toString();\n }\n\n if (Array.isArray(origin)) {\n return false;\n }\n\n // $FlowFixMe\n return Boolean(origin.match(pattern));\n }\n\n if (Array.isArray(pattern)) {\n if (Array.isArray(origin)) {\n return JSON.stringify(pattern) === JSON.stringify(origin);\n }\n\n if (isRegex(origin)) {\n return false;\n }\n\n return pattern.some((subpattern) => matchDomain(subpattern, origin));\n }\n\n return false;\n}\n\nexport function stringifyDomainPattern(pattern: DomainMatcher): string {\n if (Array.isArray(pattern)) {\n return `(${pattern.join(\" | \")})`;\n } else if (isRegex(pattern)) {\n return `RegExp(${pattern.toString()})`;\n } else {\n return pattern.toString();\n }\n}\n\nexport function getDomainFromUrl(url: string): string {\n let domain;\n\n if (url.match(/^(https?|mock|file):\\/\\//)) {\n domain = url;\n } else {\n return getDomain();\n }\n\n domain = domain.split(\"/\").slice(0, 3).join(\"/\");\n\n return domain;\n}\n\nexport function onCloseWindow(\n win: CrossDomainWindowType,\n callback: Function,\n delay: number = 1000,\n maxtime: number = Infinity\n): {| cancel: () => void |} {\n let timeout;\n\n const check = () => {\n if (isWindowClosed(win)) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n return callback();\n }\n\n if (maxtime <= 0) {\n clearTimeout(timeout);\n } else {\n maxtime -= delay;\n timeout = setTimeout(check, delay);\n }\n };\n\n check();\n\n return {\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n },\n };\n}\n\n// eslint-disable-next-line complexity\nexport function isWindow(obj: Object): boolean {\n try {\n if (obj === window) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n // $FlowFixMe method-unbinding\n if (Object.prototype.toString.call(obj) === \"[object Window]\") {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (window.Window && obj instanceof window.Window) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.self === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.parent === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.top === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n // eslint-disable-next-line no-self-compare\n if (noop(obj === obj) === \"__unlikely_value__\") {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (\n obj &&\n obj.__cross_domain_utils_window_check__ === \"__unlikely_value__\"\n ) {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (\"postMessage\" in obj && \"self\" in obj && \"location\" in obj) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.location !== \"undefined\"\n );\n}\n\nexport function isCurrentDomain(domain: string): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n return getDomain() === domain;\n}\n\nexport function isMockDomain(domain: string): boolean {\n return domain.indexOf(PROTOCOL.MOCK) === 0;\n}\n\nexport function normalizeMockUrl(url: string): string {\n if (!isMockDomain(getDomainFromUrl(url))) {\n return url;\n }\n\n if (!__TEST__) {\n throw new Error(`Mock urls not supported out of test mode`);\n }\n\n return url.replace(/^mock:\\/\\/[^/]+/, getActualDomain(window));\n}\n\nexport function getFrameForWindow(win: CrossDomainWindowType): ?HTMLElement {\n if (isSameDomain(win)) {\n return assertSameDomain(win).frameElement;\n }\n\n for (const frame of document.querySelectorAll(\"iframe\")) {\n if (frame && frame.contentWindow && frame.contentWindow === win) {\n return frame;\n }\n }\n}\n\nexport function closeWindow(win: CrossDomainWindowType) {\n if (isIframe(win)) {\n const frame = getFrameForWindow(win);\n if (frame && frame.parentElement) {\n frame.parentElement.removeChild(frame);\n return;\n }\n }\n\n try {\n win.close();\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n\nexport const PROTOCOL = {\n MOCK: (\"mock:\": \"mock:\"),\n FILE: (\"file:\": \"file:\"),\n ABOUT: (\"about:\": \"about:\"),\n};\n\nexport const WILDCARD = \"*\";\n\nexport const WINDOW_TYPE = {\n IFRAME: (\"iframe\": \"iframe\"),\n POPUP: (\"popup\": \"popup\"),\n};\n","/* @flow */\n\nexport function safeIndexOf(collection : $ReadOnlyArray, item : T) : number {\n for (let i = 0; i < collection.length; i++) {\n\n try {\n if (collection[i] === item) {\n return i;\n }\n } catch (err) {\n // pass\n }\n }\n\n return -1;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : $ReadOnlyArray) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from '@krakenjs/cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nexport class CrossDomainSafeWeakMap {\n\n name : string;\n weakmap : ?WeakMap;\n // eslint-disable-next-line flowtype/no-mutable-array\n keys : Array;\n // eslint-disable-next-line flowtype/no-mutable-array\n values : Array;\n\n constructor() {\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__`;\n\n if (hasNativeWeakMap()) {\n try {\n this.weakmap = new WeakMap();\n } catch (err) {\n // pass\n }\n }\n\n this.keys = [];\n this.values = [];\n }\n\n _cleanupClosedWindows() {\n\n const weakmap = this.weakmap;\n const keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n const value = keys[i];\n\n if (isWindow(value) && isWindowClosed(value)) {\n\n if (weakmap) {\n try {\n weakmap.delete(value);\n } catch (err) {\n // pass\n }\n }\n\n keys.splice(i, 1);\n this.values.splice(i, 1);\n\n i -= 1;\n }\n }\n }\n\n isSafeToReadWrite(key : K) : boolean {\n\n if (isWindow(key)) {\n return false;\n }\n\n try {\n noop(key && key.self);\n noop(key && key[this.name]);\n } catch (err) {\n return false;\n }\n\n return true;\n }\n\n set(key : K, value : V) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n weakmap.set(key, value);\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const name = this.name;\n const entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n Object.defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n\n return;\n\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const values = this.values;\n const index = safeIndexOf(keys, key);\n\n if (index === -1) {\n keys.push(key);\n values.push(value);\n } else {\n values[index] = value;\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n\n return;\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n weakmap.delete(key);\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return true;\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const index = safeIndexOf(this.keys, key);\n return index !== -1;\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n const value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n\nexport function hasNativeWeakMap() : boolean {\n\n if (typeof WeakMap === 'undefined') {\n return false;\n }\n\n if (typeof Object.freeze === 'undefined') {\n return false;\n }\n\n try {\n\n const testWeakMap = new WeakMap();\n const testKey = {};\n const testValue = '__testvalue__';\n\n Object.freeze(testKey);\n\n testWeakMap.set(testKey, testValue);\n\n if (testWeakMap.get(testKey) === testValue) {\n return true;\n }\n\n return false;\n\n } catch (err) {\n\n return false;\n }\n}\n","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nimport isNativeReflectConstruct from \"@babel/runtime/helpers/esm/isNativeReflectConstruct\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"@babel/runtime/helpers/esm/getPrototypeOf\";\nimport setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nimport isNativeFunction from \"@babel/runtime/helpers/esm/isNativeFunction\";\nimport construct from \"@babel/runtime/helpers/esm/construct\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","/* @flow */\n\nexport const KEY_CODES = {\n ENTER: 13,\n SPACE: 32,\n};\n\nexport const ATTRIBUTES = {\n UID: \"data-uid\",\n};\n\nexport const UID_HASH_LENGTH = 30;\n\n/* eslint-disable no-control-regex*/\nexport const invalidProtocolRegex: RegExp =\n /([^\\w]*)(javascript|data|vbscript)/im;\nexport const htmlEntitiesRegex: RegExp = /&#(\\w+)(^\\w|;)?/g;\nexport const htmlCtrlEntityRegex: RegExp = /&(newline|tab);/gi;\nexport const ctrlCharactersRegex: RegExp =\n /[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim;\nexport const urlSchemeRegex: RegExp = /^.+(:|:)/gim;\nexport const relativeFirstCharacters = [\".\", \"/\"];\nexport const BLANK_URL = \"about:blank\";\n/* eslint-enable no-control-regex*/\n","/* @flow */\n/* eslint max-lines: 0 */\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport { WeakMap } from \"@krakenjs/cross-domain-safe-weakmap/src\";\n\nimport {\n BLANK_URL,\n ctrlCharactersRegex,\n htmlCtrlEntityRegex,\n htmlEntitiesRegex,\n invalidProtocolRegex,\n relativeFirstCharacters,\n urlSchemeRegex,\n} from \"./constants\";\nimport type { CancelableType } from \"./types\";\n\nexport function isElement(element: mixed): boolean {\n let passed = false;\n\n try {\n if (element instanceof window.Element) {\n passed = true;\n } else if (\n element !== null &&\n typeof element === \"object\" &&\n element.nodeType === 1 &&\n typeof element.style === \"object\" &&\n typeof element.ownerDocument === \"object\"\n ) {\n passed = true;\n }\n } catch (_) {\n // we don't have an element\n }\n\n return passed;\n}\n\nexport function getFunctionName(fn: T): string {\n return fn.name || fn.__name__ || fn.displayName || \"anonymous\";\n}\n\nexport function setFunctionName(fn: T, name: string): T {\n try {\n delete fn.name;\n fn.name = name;\n } catch (err) {\n // pass\n }\n\n fn.__name__ = fn.displayName = name;\n return fn;\n}\n\nexport function base64encode(str: string): string {\n if (typeof btoa === \"function\") {\n return btoa(\n encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (m, p1) => {\n return String.fromCharCode(parseInt(p1, 16));\n })\n ).replace(/[=]/g, \"\");\n }\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"utf8\").toString(\"base64\").replace(/[=]/g, \"\");\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str: string): string {\n if (typeof atob === \"function\") {\n return decodeURIComponent(\n // $FlowFixMe[method-unbinding]\n Array.prototype.map\n .call(atob(str), (c) => {\n // eslint-disable-next-line prefer-template\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n }\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"base64\").toString(\"utf8\");\n }\n\n throw new Error(`Can not find window.atob or Buffer`);\n}\n\nexport function uniqueID(): string {\n const chars = \"0123456789abcdef\";\n\n const randomID = \"xxxxxxxxxx\".replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n const timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace(\"T\", \".\")\n )\n .replace(/[^a-zA-Z0-9]/g, \"\")\n .toLowerCase();\n\n return `uid_${randomID}_${timeID}`;\n}\n\nexport function getGlobal(): Object {\n if (typeof window !== \"undefined\") {\n return window;\n }\n if (typeof global !== \"undefined\") {\n return global;\n }\n if (typeof __GLOBAL__ !== \"undefined\") {\n return __GLOBAL__;\n }\n throw new Error(`No global found`);\n}\n\nlet objectIDs;\n\nexport function getObjectID(obj: Object): string {\n objectIDs = objectIDs || new WeakMap();\n\n if (\n obj === null ||\n obj === undefined ||\n (typeof obj !== \"object\" && typeof obj !== \"function\")\n ) {\n throw new Error(`Invalid object`);\n }\n\n let uid = objectIDs.get(obj);\n\n if (!uid) {\n uid = `${typeof obj}:${uniqueID()}`;\n objectIDs.set(obj, uid);\n }\n\n return uid;\n}\n\nfunction serializeArgs(args: $ReadOnlyArray): string {\n try {\n // $FlowFixMe[method-unbinding]\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n // Treat each distinct function as unique for purposes of memoization\n // e.g. even if someFunction.stringify() is the same, we may use a different memoize cache\n // if the actual function is different.\n if (typeof val === \"function\") {\n return `memoize[${getObjectID(val)}]`;\n }\n\n // By default JSON.stringify(domElement) returns '{}'. This ensures that stays true even for non-standard\n // elements (e.g. React-rendered dom elements) with custom properties\n if (isElement(val)) {\n return {};\n }\n\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\nexport function getEmptyObject(): {||} {\n // $FlowFixMe\n return {};\n}\n\ntype MemoizeOptions = {|\n name?: string,\n time?: number,\n thisNamespace?: boolean,\n|};\n\nconst getDefaultMemoizeOptions = (): MemoizeOptions => {\n // $FlowFixMe\n return {};\n};\n\nexport type Memoized = F & {| reset: () => void |};\n\nlet memoizeGlobalIndex = 0;\nlet memoizeGlobalIndexValidFrom = 0;\n\nexport function memoize(\n method: F,\n options?: MemoizeOptions = getDefaultMemoizeOptions()\n): Memoized {\n const { thisNamespace = false, time: cacheTime } = options;\n\n let simpleCache;\n let thisCache;\n\n let memoizeIndex = memoizeGlobalIndex;\n memoizeGlobalIndex += 1;\n\n const memoizedFunction = function memoizedFunction(...args): mixed {\n if (memoizeIndex < memoizeGlobalIndexValidFrom) {\n simpleCache = null;\n thisCache = null;\n memoizeIndex = memoizeGlobalIndex;\n memoizeGlobalIndex += 1;\n }\n\n let cache;\n\n if (thisNamespace) {\n thisCache = thisCache || new WeakMap();\n cache = thisCache.getOrSet(this, getEmptyObject);\n } else {\n cache = simpleCache = simpleCache || {};\n }\n\n let cacheKey;\n\n try {\n cacheKey = serializeArgs(args);\n } catch {\n return method.apply(this, arguments);\n }\n\n let cacheResult = cache[cacheKey];\n\n if (cacheResult && cacheTime && Date.now() - cacheResult.time < cacheTime) {\n delete cache[cacheKey];\n cacheResult = null;\n }\n\n if (cacheResult) {\n return cacheResult.value;\n }\n\n const time = Date.now();\n const value = method.apply(this, arguments);\n\n cache[cacheKey] = { time, value };\n\n return value;\n };\n\n memoizedFunction.reset = () => {\n simpleCache = null;\n thisCache = null;\n };\n\n // $FlowFixMe\n const result: F = memoizedFunction;\n\n return setFunctionName(\n result,\n `${options.name || getFunctionName(method)}::memoized`\n );\n}\n\nmemoize.clear = () => {\n memoizeGlobalIndexValidFrom = memoizeGlobalIndex;\n};\n\nexport function promiseIdentity(\n item: ZalgoPromise | T\n): ZalgoPromise {\n // $FlowFixMe\n return ZalgoPromise.resolve(item);\n}\n\nexport function memoizePromise(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => ZalgoPromise\n // eslint-disable-next-line flowtype/no-weak-types\n): (...args: $ReadOnlyArray) => ZalgoPromise {\n let cache = {};\n\n function memoizedPromiseFunction(\n // eslint-disable-next-line flowtype/no-weak-types\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n const key: string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = ZalgoPromise.try(() => method.apply(this, arguments)).finally(\n () => {\n delete cache[key];\n }\n );\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return setFunctionName(\n memoizedPromiseFunction,\n `${getFunctionName(method)}::promiseMemoized`\n );\n}\n\ntype PromisifyOptions = {|\n name?: string,\n|};\n\nconst getDefaultPromisifyOptions = (): PromisifyOptions => {\n // $FlowFixMe\n return {};\n};\n\nexport function promisify(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => R,\n options: PromisifyOptions = getDefaultPromisifyOptions()\n // eslint-disable-next-line flowtype/no-weak-types\n): (...args: $ReadOnlyArray) => ZalgoPromise {\n function promisifiedFunction(): ZalgoPromise {\n return ZalgoPromise.try(method, this, arguments);\n }\n\n if (options.name) {\n promisifiedFunction.displayName = `${options.name}:promisified`;\n }\n\n return setFunctionName(\n promisifiedFunction,\n `${getFunctionName(method)}::promisified`\n );\n}\n\nexport function inlineMemoize(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => R,\n // eslint-disable-next-line flowtype/no-weak-types\n logic: (...args: $ReadOnlyArray) => R,\n // eslint-disable-next-line flowtype/no-weak-types\n args: $ReadOnlyArray = []\n): R {\n // $FlowFixMe\n const cache: {| [string]: R |} = (method.__inline_memoize_cache__ =\n // $FlowFixMe\n method.__inline_memoize_cache__ || {});\n const key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n const result = (cache[key] = logic(...args));\n\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args: $ReadOnlyArray) {\n // pass\n}\n\nexport function once(method: Function): Function {\n let called = false;\n\n const onceFunction = function (): mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\n\n return setFunctionName(onceFunction, `${getFunctionName(method)}::once`);\n}\n\nexport function hashStr(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash += str[i].charCodeAt(0) * Math.pow((i % 10) + 1, 5);\n }\n return Math.floor(Math.pow(Math.sqrt(hash), 5));\n}\n\nexport function strHashStr(str: string): string {\n let hash = \"\";\n\n for (let i = 0; i < str.length; i++) {\n let total = str[i].charCodeAt(0) * i;\n\n if (str[i + 1]) {\n total += str[i + 1].charCodeAt(0) * (i - 1);\n }\n\n hash += String.fromCharCode(97 + (Math.abs(total) % 26));\n }\n\n return hash;\n}\n\nexport function match(str: string, pattern: RegExp): ?string {\n const regmatch = str.match(pattern);\n if (regmatch) {\n return regmatch[1];\n }\n}\n\nexport function awaitKey(obj: Object, key: string): ZalgoPromise {\n return new ZalgoPromise((resolve) => {\n let value = obj[key];\n\n if (value) {\n return resolve(value);\n }\n\n delete obj[key];\n\n Object.defineProperty(obj, key, {\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get(): T {\n return value;\n },\n });\n });\n}\n\nexport function stringifyError(err: mixed, level: number = 1): string {\n if (level >= 3) {\n return \"stringifyError stack overflow\";\n }\n\n try {\n if (!err) {\n // $FlowFixMe[method-unbinding]\n return ``;\n }\n\n if (typeof err === \"string\") {\n return err;\n }\n\n if (err instanceof Error) {\n const stack = err && err.stack;\n const message = err && err.message;\n\n if (stack && message) {\n if (stack.indexOf(message) !== -1) {\n return stack;\n } else {\n return `${message}\\n${stack}`;\n }\n } else if (stack) {\n return stack;\n } else if (message) {\n return message;\n }\n }\n\n if (err && err.toString && typeof err.toString === \"function\") {\n // $FlowFixMe\n return err.toString();\n }\n\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(err);\n } catch (newErr) {\n return `Error while stringifying error: ${stringifyError(\n newErr,\n level + 1\n )}`;\n }\n}\n\nexport function stringifyErrorMessage(err: mixed): string {\n // $FlowFixMe[method-unbinding]\n const defaultMessage = ``;\n\n if (!err) {\n return defaultMessage;\n }\n\n if (err instanceof Error) {\n return err.message || defaultMessage;\n }\n\n if (typeof err.message === \"string\") {\n return err.message || defaultMessage;\n }\n\n return defaultMessage;\n}\n\nexport function stringify(item: mixed): string {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && item.toString && typeof item.toString === \"function\") {\n // $FlowFixMe\n return item.toString();\n }\n\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname: string, domain: string): boolean {\n hostname = hostname.split(\"://\")[1];\n const index = hostname.indexOf(domain);\n return index !== -1 && hostname.slice(index) === domain;\n}\n\nexport function patchMethod(obj: Object, name: string, handler: Function) {\n const original = obj[name];\n\n obj[name] = function patchedMethod(): mixed {\n return handler({\n context: this,\n // $FlowFixMe[method-unbinding]\n args: Array.prototype.slice.call(arguments),\n original,\n callOriginal: () => original.apply(this, arguments),\n });\n };\n}\n\nexport function extend(obj: T, source: Object): T {\n if (!source) {\n return obj;\n }\n\n if (Object.assign) {\n return Object.assign(obj, source);\n }\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n obj[key] = source[key];\n }\n }\n\n return obj;\n}\n\nexport function values(obj: { [string]: T }): $ReadOnlyArray {\n if (Object.values) {\n // $FlowFixMe\n return Object.values(obj);\n }\n\n const result: Array = [];\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n // $FlowFixMe[escaped-generic]\n result.push(obj[key]);\n }\n }\n\n // $FlowFixMe\n return result;\n}\n\n// eslint-disable-next-line no-undef\nexport const memoizedValues: ({ [string]: T }) => $ReadOnlyArray =\n memoize(values);\n\nexport function perc(pixels: number, percentage: number): number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args: $ReadOnlyArray): number {\n return Math.min(...args);\n}\n\nexport function max(...args: $ReadOnlyArray): number {\n return Math.max(...args);\n}\n\nexport function roundUp(num: number, nearest: number): number {\n const remainder = num % nearest;\n return remainder ? num - remainder + nearest : num;\n}\n\nexport function regexMap(\n str: string,\n regexp: RegExp,\n handler: () => T\n): $ReadOnlyArray {\n const results = [];\n\n // $FlowFixMe\n str.replace(regexp, function regexMapMatcher(item) {\n results.push(handler ? handler.apply(null, arguments) : item);\n });\n\n // $FlowFixMe\n return results;\n}\n\nexport function svgToBase64(svg: string): string {\n return `data:image/svg+xml;base64,${base64encode(svg)}`;\n}\n\nexport function objFilter(\n obj: { [string]: T },\n filter?: (T, ?string) => mixed = Boolean\n): { [string]: R } {\n const result = {};\n\n for (const key in obj) {\n if (!obj.hasOwnProperty(key) || !filter(obj[key], key)) {\n continue;\n }\n\n result[key] = obj[key];\n }\n\n return result;\n}\n\nexport function identity(item: T): T {\n return item;\n}\n\nexport function regexTokenize(\n text: string,\n regexp: RegExp\n): $ReadOnlyArray {\n const result = [];\n text.replace(regexp, (token) => {\n result.push(token);\n return \"\";\n });\n return result;\n}\n\nexport function promiseDebounce(\n method: () => ZalgoPromise | T,\n delay: number = 50\n): () => ZalgoPromise {\n let promise;\n let timeout;\n\n const promiseDebounced = function (): ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n const localPromise = (promise = promise || new ZalgoPromise());\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n (result) => {\n localPromise.resolve(result);\n },\n (err) => {\n localPromise.reject(err);\n }\n );\n }, delay);\n\n return localPromise;\n };\n\n return setFunctionName(\n promiseDebounced,\n `${getFunctionName(method)}::promiseDebounced`\n );\n}\n\nexport function safeInterval(\n method: Function,\n time: number\n): {| cancel: () => void |} {\n let timeout;\n\n function loop() {\n timeout = setTimeout(() => {\n method();\n loop();\n }, time);\n }\n\n loop();\n\n return {\n cancel() {\n clearTimeout(timeout);\n },\n };\n}\n\nexport function isInteger(str: string): boolean {\n return Boolean(str.match(/^[0-9]+$/));\n}\n\nexport function isFloat(str: string): boolean {\n return Boolean(str.match(/^[0-9]+\\.[0-9]+$/));\n}\n\nexport function serializePrimitive(value: string | number | boolean): string {\n return value.toString();\n}\n\nexport function deserializePrimitive(value: string): string | number | boolean {\n if (value === \"true\") {\n return true;\n } else if (value === \"false\") {\n return false;\n } else if (isInteger(value)) {\n return parseInt(value, 10);\n } else if (isFloat(value)) {\n return parseFloat(value);\n } else {\n return value;\n }\n}\n\nexport function dotify(\n obj: Object,\n prefix: string = \"\",\n newobj: Object = {}\n): { [string]: string } {\n prefix = prefix ? `${prefix}.` : prefix;\n for (const key in obj) {\n if (\n !obj.hasOwnProperty(key) ||\n obj[key] === undefined ||\n obj[key] === null ||\n typeof obj[key] === \"function\"\n ) {\n continue;\n } else if (\n obj[key] &&\n Array.isArray(obj[key]) &&\n obj[key].length &&\n obj[key].every((val) => typeof val !== \"object\")\n ) {\n newobj[`${prefix}${key}[]`] = obj[key].join(\",\");\n } else if (obj[key] && typeof obj[key] === \"object\") {\n newobj = dotify(obj[key], `${prefix}${key}`, newobj);\n } else {\n newobj[`${prefix}${key}`] = serializePrimitive(obj[key]);\n }\n }\n return newobj;\n}\n\nexport function undotify(obj: { [string]: string }): Object {\n const result = {};\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || typeof obj[key] !== \"string\") {\n continue;\n }\n\n let value = obj[key];\n\n if (key.match(/^.+\\[\\]$/)) {\n key = key.slice(0, -2);\n value = value.split(\",\").map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n const parts = key.split(\".\");\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i + 1 === parts.length;\n const isIndex = !isLast && isInteger(parts[i + 1]);\n\n if (\n part === \"constructor\" ||\n part === \"prototype\" ||\n part === \"__proto__\"\n ) {\n throw new Error(`Disallowed key: ${part}`);\n }\n\n if (isLast) {\n // $FlowFixMe\n keyResult[part] = value;\n } else {\n // $FlowFixMe\n keyResult = keyResult[part] = keyResult[part] || (isIndex ? [] : {});\n }\n }\n }\n\n return result;\n}\n\nexport type EventEmitterType = {|\n on: (eventName: string, handler: Function) => CancelableType,\n once: (eventName: string, handler: Function) => CancelableType,\n trigger: (\n eventName: string,\n ...args: $ReadOnlyArray\n ) => ZalgoPromise,\n triggerOnce: (\n eventName: string,\n ...args: $ReadOnlyArray\n ) => ZalgoPromise,\n reset: () => void,\n|};\n\nexport function eventEmitter(): EventEmitterType {\n const triggered = {};\n let handlers = {};\n\n const emitter = {\n on(eventName: string, handler: Function): CancelableType {\n const handlerList = (handlers[eventName] = handlers[eventName] || []);\n\n handlerList.push(handler);\n\n let cancelled = false;\n\n return {\n cancel() {\n if (!cancelled) {\n cancelled = true;\n handlerList.splice(handlerList.indexOf(handler), 1);\n }\n },\n };\n },\n\n once(eventName: string, handler: Function): CancelableType {\n const listener = emitter.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(\n eventName: string,\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n const handlerList = handlers[eventName];\n const promises = [];\n\n if (handlerList) {\n for (const handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(\n eventName: string,\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return emitter.trigger(eventName, ...args);\n },\n\n reset() {\n handlers = {};\n },\n };\n\n return emitter;\n}\n\nexport function camelToDasherize(string: string): string {\n return string.replace(/([A-Z])/g, (g) => {\n return `-${g.toLowerCase()}`;\n });\n}\n\nexport function dasherizeToCamel(string: string): string {\n return string.replace(/-([a-z])/g, (g) => {\n return g[1].toUpperCase();\n });\n}\n\nexport function capitalizeFirstLetter(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n}\n\nexport function get(item: Object, path: string, def: mixed): mixed {\n if (!path) {\n return def;\n }\n\n const pathParts = path.split(\".\");\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n // If we have an object, we can get the key\n if (typeof item === \"object\" && item !== null) {\n item = item[pathParts[i]];\n\n // Otherwise, we should return the default (undefined if not provided)\n } else {\n return def;\n }\n }\n\n // If our final result is undefined, we should return the default\n\n return item === undefined ? def : item;\n}\n\nexport function safeTimeout(method: Function, time: number) {\n const interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(\n obj: Object | $ReadOnlyArray,\n key: string | number,\n getter: () => T\n) {\n if (Array.isArray(obj)) {\n if (typeof key !== \"number\") {\n throw new TypeError(`Array key must be number`);\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n if (typeof key !== \"string\") {\n throw new TypeError(`Object key must be string`);\n }\n }\n\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: true,\n get: () => {\n // $FlowFixMe\n delete obj[key];\n const value = getter();\n // $FlowFixMe\n obj[key] = value;\n return value;\n },\n set: (value: T) => {\n // $FlowFixMe\n delete obj[key];\n // $FlowFixMe\n obj[key] = value;\n },\n });\n}\n\n// eslint-disable-next-line no-undef\nexport function arrayFrom(item: Iterable): $ReadOnlyArray {\n // $FlowFixMe[method-unbinding]\n return Array.prototype.slice.call(item);\n}\n\nexport function isObject(item: mixed): boolean {\n return typeof item === \"object\" && item !== null;\n}\n\nexport function isObjectObject(obj: mixed): boolean {\n return (\n // $FlowFixMe[method-unbinding]\n isObject(obj) && Object.prototype.toString.call(obj) === \"[object Object]\"\n );\n}\n\nexport function isPlainObject(obj: mixed): boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n const constructor = obj.constructor;\n\n if (typeof constructor !== \"function\") {\n return false;\n }\n\n const prototype = constructor.prototype;\n\n if (!isObjectObject(prototype)) {\n return false;\n }\n\n if (!prototype.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n\n return true;\n}\n\nexport function replaceObject | Object>(\n item: T,\n replacer: (mixed, string | number, string) => mixed,\n fullKey: string = \"\"\n): T {\n if (Array.isArray(item)) {\n const length = item.length;\n const result: Array = [];\n\n for (let i = 0; i < length; i++) {\n defineLazyProp(result, i, () => {\n const itemKey = fullKey ? `${fullKey}.${i}` : `${i}`;\n const el = item[i];\n\n let child = replacer(el, i, itemKey);\n\n if (isPlainObject(child) || Array.isArray(child)) {\n // $FlowFixMe\n child = replaceObject(child, replacer, itemKey);\n }\n\n return child;\n });\n }\n\n // $FlowFixMe\n return result;\n } else if (isPlainObject(item)) {\n const result = {};\n\n for (const key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n const itemKey = fullKey ? `${fullKey}.${key}` : `${key}`;\n // $FlowFixMe\n const el = item[key];\n\n let child = replacer(el, key, itemKey);\n\n if (isPlainObject(child) || Array.isArray(child)) {\n // $FlowFixMe\n child = replaceObject(child, replacer, itemKey);\n }\n\n return child;\n });\n }\n\n // $FlowFixMe\n return result;\n } else {\n throw new Error(`Pass an object or array`);\n }\n}\n\nexport function copyProp(\n source: Object,\n target: Object,\n name: string,\n def: mixed\n) {\n if (source.hasOwnProperty(name)) {\n const descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {|\n text: string,\n groups: $ReadOnlyArray,\n start: number,\n end: number,\n length: number,\n replace: (text: string) => string,\n|};\n\nexport function regex(\n pattern: string | RegExp,\n string: string,\n start: number = 0\n): ?RegexResultType {\n if (typeof pattern === \"string\") {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n const result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n const index: number = result.index;\n const regmatch = result[0];\n\n return {\n text: regmatch,\n groups: result.slice(1),\n start: start + index,\n end: start + index + regmatch.length,\n length: regmatch.length,\n\n replace(text: string): string {\n if (!regmatch) {\n return \"\";\n }\n\n return `${regmatch.slice(0, start + index)}${text}${regmatch.slice(\n index + regmatch.length\n )}`;\n },\n };\n}\n\nexport function regexAll(\n pattern: string | RegExp,\n string: string\n): $ReadOnlyArray {\n const matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const regmatch = regex(pattern, string, start);\n\n if (!regmatch) {\n break;\n }\n\n matches.push(regmatch);\n start = match.end;\n }\n\n return matches;\n}\n\nexport function isDefined(value: ?mixed): boolean {\n return value !== null && value !== undefined;\n}\n\nexport function cycle(method: Function): ZalgoPromise {\n return ZalgoPromise.try(method).then(() => cycle(method));\n}\n\nexport function debounce(\n method: (...args: $ReadOnlyArray) => T,\n time: number = 100\n): (...args: $ReadOnlyArray) => void {\n let timeout;\n\n const debounceWrapper = function () {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n\n return setFunctionName(\n debounceWrapper,\n `${getFunctionName(method)}::debounced`\n );\n}\n\nexport function isRegex(item: mixed): boolean {\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(item) === \"[object RegExp]\";\n}\n\ntype FunctionProxy = (method: T) => T;\n\nexport const weakMapMemoize: FunctionProxy<*> = (\n // eslint-disable-next-line flowtype/no-weak-types\n method: (arg: any) => R\n // eslint-disable-next-line flowtype/no-weak-types\n): ((...args: $ReadOnlyArray) => R) => {\n const weakmap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n return function weakmapMemoized(arg: any): R {\n return weakmap.getOrSet(arg, () => method.call(this, arg));\n };\n};\n\ntype FunctionPromiseProxy<\n R: mixed,\n T: (...args: $ReadOnlyArray) => ZalgoPromise\n> = (T) => T;\n\nexport const weakMapMemoizePromise: FunctionPromiseProxy<*, *> = (\n // eslint-disable-next-line flowtype/no-weak-types\n method: (arg: any) => ZalgoPromise\n // eslint-disable-next-line flowtype/no-weak-types\n): ((...args: $ReadOnlyArray) => ZalgoPromise) => {\n const weakmap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n return function weakmapMemoizedPromise(arg: any): ZalgoPromise {\n return weakmap.getOrSet(arg, () =>\n method.call(this, arg).finally(() => {\n weakmap.delete(arg);\n })\n );\n };\n};\n\nexport function getOrSet(\n obj: O,\n key: string,\n getter: () => T\n): T {\n if (obj.hasOwnProperty(key)) {\n return obj[key];\n }\n\n const val = getter();\n obj[key] = val;\n return val;\n}\n\nexport type CleanupType = {|\n set: (string, T) => T, // eslint-disable-line no-undef\n register: (Function) => {| cancel: () => void |},\n all: (err?: mixed) => ZalgoPromise,\n|};\n\nexport function cleanup(obj: Object): CleanupType {\n const tasks = [];\n let cleaned = false;\n let cleanErr;\n\n const cleaner = {\n set(name: string, item: T): T {\n if (!cleaned) {\n obj[name] = item;\n cleaner.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method: Function): {| cancel: () => void |} {\n const task = once(() => method(cleanErr));\n\n if (cleaned) {\n method(cleanErr);\n } else {\n tasks.push(task);\n }\n\n return {\n cancel: () => {\n const index = tasks.indexOf(task);\n if (index !== -1) {\n tasks.splice(index, 1);\n }\n },\n };\n },\n\n all(err?: mixed): ZalgoPromise {\n cleanErr = err;\n\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.shift();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n },\n };\n\n return cleaner;\n}\n\nexport function tryCatch(\n fn: () => T\n): {| result: T, error: void |} | {| result: void, error: mixed |} {\n let result;\n let error;\n\n try {\n result = fn();\n } catch (err) {\n error = err;\n }\n\n // $FlowFixMe\n return { result, error };\n}\n\n// eslint-disable-next-line flowtype/no-mutable-array\nexport function removeFromArray>(arr: T, item: X) {\n const index = arr.indexOf(item);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n}\n\nexport function assertExists(name: string, thing: void | null | T): T {\n if (thing === null || typeof thing === \"undefined\") {\n throw new Error(`Expected ${name} to be present`);\n }\n\n return thing;\n}\n\nexport function unique(arr: $ReadOnlyArray): $ReadOnlyArray {\n const result = {};\n for (const item of arr) {\n result[item] = true;\n }\n return Object.keys(result);\n}\n\nexport const constHas = (\n constant: T,\n value: X\n): boolean => {\n return memoizedValues(constant).indexOf(value) !== -1;\n};\n\nexport function dedupeErrors(handler: (mixed) => T): (mixed) => T | void {\n const seenErrors = [];\n const seenStringifiedErrors = {};\n\n return (err) => {\n if (seenErrors.indexOf(err) !== -1) {\n return;\n }\n\n seenErrors.push(err);\n\n const stringifiedError = stringifyError(err);\n if (seenStringifiedErrors[stringifiedError]) {\n return;\n }\n\n seenStringifiedErrors[stringifiedError] = true;\n return handler(err);\n };\n}\n\nexport class ExtendableError extends Error {\n constructor(message: string) {\n super(message);\n // eslint-disable-next-line unicorn/custom-error-definition\n this.name = this.constructor.name;\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error(message).stack;\n }\n }\n}\n\nfunction isRelativeUrlWithoutProtocol(url: string): boolean {\n return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n\nfunction decodeHtmlCharacters(str: string): string {\n const removedNullByte: string = str.replace(ctrlCharactersRegex, \"\");\n return removedNullByte.replace(htmlEntitiesRegex, (matchRegex, dec) => {\n return String.fromCharCode(dec);\n });\n}\n\nexport function sanitizeUrl(url?: string): string {\n if (!url) {\n return BLANK_URL;\n }\n\n const sanitizedUrl = decodeHtmlCharacters(url)\n .replace(htmlCtrlEntityRegex, \"\")\n .replace(ctrlCharactersRegex, \"\")\n .trim();\n\n if (!sanitizedUrl) {\n return BLANK_URL;\n }\n\n if (isRelativeUrlWithoutProtocol(sanitizedUrl)) {\n return sanitizedUrl;\n }\n\n const urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n\n if (!urlSchemeParseResults) {\n return sanitizedUrl;\n }\n\n const urlScheme = urlSchemeParseResults[0];\n\n if (invalidProtocolRegex.test(urlScheme)) {\n return BLANK_URL;\n }\n\n return sanitizedUrl;\n}\n","/* @flow */\n/* eslint max-lines: off */\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport {\n linkFrameWindow,\n isWindowClosed,\n assertSameDomain,\n type SameDomainWindowType,\n type CrossDomainWindowType,\n} from \"@krakenjs/cross-domain-utils/src\";\nimport { WeakMap } from \"@krakenjs/cross-domain-safe-weakmap/src\";\n\nimport {\n isElement,\n inlineMemoize,\n memoize,\n noop,\n stringify,\n capitalizeFirstLetter,\n once,\n extend,\n safeInterval,\n uniqueID,\n arrayFrom,\n ExtendableError,\n strHashStr,\n} from \"./util\";\nimport { isDevice } from \"./device\";\nimport { KEY_CODES, ATTRIBUTES, UID_HASH_LENGTH } from \"./constants\";\nimport type { CancelableType } from \"./types\";\n\ntype ElementRefType = string | HTMLElement;\n\nexport function getBody(): HTMLBodyElement {\n // eslint-disable-next-line compat/compat\n const body = document.body;\n\n if (!body) {\n throw new Error(`Body element not found`);\n }\n\n return body;\n}\n\nexport function isDocumentReady(): boolean {\n // eslint-disable-next-line compat/compat\n return Boolean(document.body) && document.readyState === \"complete\";\n}\n\nexport function isDocumentInteractive(): boolean {\n // eslint-disable-next-line compat/compat\n return Boolean(document.body) && document.readyState === \"interactive\";\n}\n\nexport function urlEncode(str: string): string {\n return encodeURIComponent(str);\n}\n\nexport function waitForWindowReady(): ZalgoPromise {\n return inlineMemoize(waitForWindowReady, (): ZalgoPromise => {\n return new ZalgoPromise((resolve) => {\n if (isDocumentReady()) {\n resolve();\n }\n\n window.addEventListener(\"load\", () => resolve());\n });\n });\n}\n\ntype WaitForDocumentReady = () => ZalgoPromise;\n\nexport const waitForDocumentReady: WaitForDocumentReady = memoize(() => {\n return new ZalgoPromise((resolve) => {\n if (isDocumentReady() || isDocumentInteractive()) {\n return resolve();\n }\n\n const interval = setInterval(() => {\n if (isDocumentReady() || isDocumentInteractive()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n});\n\nexport function waitForDocumentBody(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (document.body) {\n return document.body;\n }\n\n return waitForDocumentReady().then(() => {\n if (document.body) {\n return document.body;\n }\n\n throw new Error(\"Document ready but document.body not present\");\n });\n });\n}\n\nexport function parseQuery(queryString: string): Object {\n return inlineMemoize(\n parseQuery,\n (): Object => {\n const params = {};\n\n if (!queryString) {\n return params;\n }\n\n if (queryString.indexOf(\"=\") === -1) {\n return params;\n }\n\n for (let pair of queryString.split(\"&\")) {\n pair = pair.split(\"=\");\n\n if (pair[0] && pair[1]) {\n params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n\n return params;\n },\n [queryString]\n );\n}\n\nexport function getQueryParam(name: string): string {\n return parseQuery(window.location.search.slice(1))[name];\n}\n\nexport function urlWillRedirectPage(url: string): boolean {\n if (url.indexOf(\"#\") === -1) {\n return true;\n }\n\n if (url.indexOf(\"#\") === 0) {\n return false;\n }\n\n if (url.split(\"#\")[0] === window.location.href.split(\"#\")[0]) {\n return false;\n }\n\n return true;\n}\n\nexport type Query = {\n [string]: boolean | string,\n};\n\nexport function formatQuery(obj: Query = {}): string {\n return Object.keys(obj)\n .filter((key) => {\n return typeof obj[key] === \"string\" || typeof obj[key] === \"boolean\";\n })\n .map((key) => {\n const val = obj[key];\n\n if (typeof val !== \"string\" && typeof val !== \"boolean\") {\n throw new TypeError(`Invalid type for query`);\n }\n\n return `${urlEncode(key)}=${urlEncode(val.toString())}`;\n })\n .join(\"&\");\n}\n\nexport function extendQuery(originalQuery: string, props: Query = {}): string {\n if (!props || !Object.keys(props).length) {\n return originalQuery;\n }\n\n return formatQuery({\n ...parseQuery(originalQuery),\n ...props,\n });\n}\n\nexport function extendUrl(\n url: string,\n options: {| query?: Query, hash?: Query |}\n): string {\n const query = options.query || {};\n const hash = options.hash || {};\n\n let originalUrl;\n let originalQuery;\n let originalHash;\n\n [originalUrl, originalHash] = url.split(\"#\");\n [originalUrl, originalQuery] = originalUrl.split(\"?\");\n\n const queryString = extendQuery(originalQuery, query);\n const hashString = extendQuery(originalHash, hash);\n\n if (queryString) {\n originalUrl = `${originalUrl}?${queryString}`;\n }\n\n if (hashString) {\n originalUrl = `${originalUrl}#${hashString}`;\n }\n\n return originalUrl;\n}\n\nexport function redirect(\n url: string,\n win: CrossDomainWindowType = window\n): ZalgoPromise {\n return new ZalgoPromise((resolve) => {\n win.location = url;\n if (!urlWillRedirectPage(url)) {\n resolve();\n }\n });\n}\n\nexport function hasMetaViewPort(): boolean {\n const meta = document.querySelector(\"meta[name=viewport]\");\n\n if (isDevice() && window.screen.width < 660 && !meta) {\n return false;\n }\n\n return true;\n}\n\nexport function isElementVisible(el: HTMLElement): boolean {\n return Boolean(\n el.offsetWidth || el.offsetHeight || el.getClientRects().length\n );\n}\n\nexport function getPerformance(): ?Performance {\n return inlineMemoize(getPerformance, (): ?Performance => {\n const performance = window.performance;\n\n if (\n performance &&\n performance.now &&\n performance.timing &&\n performance.timing.connectEnd &&\n performance.timing.navigationStart &&\n Math.abs(performance.now() - Date.now()) > 1000 &&\n performance.now() -\n (performance.timing.connectEnd - performance.timing.navigationStart) >\n 0\n ) {\n return performance;\n }\n });\n}\n\nexport function enablePerformance(): boolean {\n return Boolean(getPerformance());\n}\n\nexport function getPageRenderTime(): ZalgoPromise {\n return waitForDocumentReady().then(() => {\n const performance = getPerformance();\n\n if (!performance) {\n return;\n }\n\n const timing = performance.timing;\n\n if (timing.connectEnd && timing.domInteractive) {\n return timing.domInteractive - timing.connectEnd;\n }\n });\n}\n\nexport function htmlEncode(html: string = \"\"): string {\n return html\n .toString()\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n .replace(/\\//g, \"/\");\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && window.location !== undefined;\n}\n\nexport function querySelectorAll(\n selector: string,\n doc: HTMLElement = window.document\n): $ReadOnlyArray {\n // $FlowFixMe[method-unbinding]\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\n/**\n * Sets up event handlers for click events and\n * enter/space keypresses.\n * @callback handler\n * @param {HTMLElement} element\n * @param {handler} handler\n */\nexport function onClick(element: HTMLElement, handler: (Event) => void) {\n element.addEventListener(\"touchstart\", noop, { passive: true });\n element.addEventListener(\"click\", handler);\n element.addEventListener(\"keypress\", (event: Event) => {\n if (\n // $FlowFixMe\n event.keyCode === KEY_CODES.ENTER ||\n // $FlowFixMe\n event.keyCode === KEY_CODES.SPACE\n ) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({\n host = window.location.host,\n path,\n reverse = false,\n}: {|\n host?: string,\n path: string,\n reverse?: boolean,\n|}): ?HTMLScriptElement {\n return inlineMemoize(\n getScript,\n (): ?HTMLScriptElement => {\n const url = `${host}${path}`;\n // $FlowFixMe[method-unbinding]\n const scripts = Array.prototype.slice.call(\n document.getElementsByTagName(\"script\")\n );\n\n if (reverse) {\n scripts.reverse();\n }\n\n for (const script of scripts) {\n if (!script.src) {\n continue;\n }\n\n const src = script.src.replace(/^https?:\\/\\//, \"\").split(\"?\")[0];\n\n if (src === url) {\n return script;\n }\n }\n },\n [path]\n );\n}\n\nexport function isLocalStorageEnabled(): boolean {\n return inlineMemoize(isLocalStorageEnabled, () => {\n try {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n if (window.localStorage) {\n const value = Math.random().toString();\n window.localStorage.setItem(\"__test__localStorage__\", value);\n const result = window.localStorage.getItem(\"__test__localStorage__\");\n window.localStorage.removeItem(\"__test__localStorage__\");\n if (value === result) {\n return true;\n }\n }\n } catch (err) {\n // pass\n }\n return false;\n });\n}\n\nexport function getBrowserLocales(): $ReadOnlyArray<{|\n country?: string,\n lang: string,\n|}> {\n const nav = window.navigator;\n\n const locales = nav.languages ? [...nav.languages] : [];\n\n if (nav.language) {\n locales.push(nav.language);\n }\n\n if (nav.userLanguage) {\n locales.push(nav.userLanguage);\n }\n\n return locales\n .map((locale) => {\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n const [lang, country] = locale.split(/[-_]/);\n return { country, lang };\n }\n\n if (locale && locale.match(/^[a-z]{2}$/)) {\n return { lang: locale };\n }\n\n return null;\n })\n .filter(Boolean);\n}\n\nexport function appendChild(container: HTMLElement, child: HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function getElementSafe(\n id: ElementRefType,\n doc: Document | HTMLElement = document\n): ?HTMLElement {\n if (isElement(id)) {\n // $FlowFixMe\n return id;\n }\n\n if (typeof id === \"string\") {\n return doc.querySelector(id);\n }\n}\n\nexport function getElement(\n id: ElementRefType,\n doc: Document | HTMLElement = document\n): HTMLElement {\n const element = getElementSafe(id, doc);\n\n if (element) {\n return element;\n }\n\n throw new Error(`Can not find element: ${stringify(id)}`);\n}\n\nexport function elementReady(id: ElementRefType): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n const name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(\n new Error(`Document is ready and element ${name} does not exist`)\n );\n }\n\n const interval = setInterval(() => {\n el = getElementSafe(id);\n\n if (el) {\n resolve(el);\n clearInterval(interval);\n return;\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(\n new Error(`Document is ready and element ${name} does not exist`)\n );\n }\n }, 10);\n });\n}\n\n// eslint-disable-next-line unicorn/custom-error-definition\nexport class PopupOpenError extends ExtendableError {}\n\ntype PopupOptions = {|\n name?: string,\n width?: number,\n height?: number,\n top?: number,\n left?: number,\n status?: 0 | 1,\n resizable?: 0 | 1,\n toolbar?: 0 | 1,\n menubar?: 0 | 1,\n scrollbars?: 0 | 1,\n closeOnUnload?: 0 | 1,\n|};\n\nexport function popup(\n url: string,\n options?: PopupOptions\n): CrossDomainWindowType {\n // $FlowFixMe\n options = options || {};\n\n const { closeOnUnload = 1, name = \"\", width, height } = options;\n\n let top = 0;\n let left = 0;\n\n if (width) {\n if (window.outerWidth) {\n left = Math.round((window.outerWidth - width) / 2) + window.screenX;\n } else if (window.screen.width) {\n left = Math.round((window.screen.width - width) / 2);\n }\n }\n\n if (height) {\n if (window.outerHeight) {\n top = Math.round((window.outerHeight - height) / 2) + window.screenY;\n } else if (window.screen.height) {\n top = Math.round((window.screen.height - height) / 2);\n }\n }\n\n delete options.closeOnUnload;\n delete options.name;\n\n if (width && height) {\n // $FlowFixMe\n options = {\n top,\n left,\n width,\n height,\n status: 1,\n toolbar: 0,\n menubar: 0,\n resizable: 1,\n scrollbars: 1,\n ...options,\n };\n }\n\n const params = Object.keys(options)\n // eslint-disable-next-line array-callback-return\n .map((key) => {\n // $FlowFixMe\n if (options[key] !== null && options[key] !== undefined) {\n return `${key}=${stringify(options[key])}`;\n }\n })\n .filter(Boolean)\n .join(\",\");\n\n let win;\n\n try {\n win = window.open(url, name, params);\n } catch (err) {\n throw new PopupOpenError(\n `Can not open popup window - ${err.stack || err.message}`\n );\n }\n\n if (isWindowClosed(win)) {\n const err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n if (closeOnUnload) {\n window.addEventListener(\"beforeunload\", () => {\n win.close();\n });\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", () => {\n win.close();\n });\n } else {\n window.addEventListener(\"unload\", () => {\n win.close();\n });\n }\n }\n\n return win;\n}\n\nexport function writeToWindow(win: SameDomainWindowType, html: string) {\n try {\n win.document.open();\n win.document.write(html);\n win.document.close();\n } catch (err) {\n try {\n win.location = `javascript: document.open(); document.write(${JSON.stringify(\n html\n )}); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(\n win: SameDomainWindowType,\n el: HTMLElement\n) {\n const tag = el.tagName.toLowerCase();\n\n if (tag !== \"html\") {\n throw new Error(`Expected element to be html, got ${tag}`);\n }\n\n const documentElement = win.document.documentElement;\n\n for (const child of arrayFrom(documentElement.children)) {\n documentElement.removeChild(child);\n }\n\n for (const child of arrayFrom(el.children)) {\n documentElement.appendChild(child);\n }\n}\n\nexport function setStyle(\n el: HTMLElement,\n styleText: string,\n doc: Document = window.document\n) {\n // $FlowFixMe\n if (el.styleSheet) {\n // $FlowFixMe\n el.styleSheet.cssText = styleText;\n } else {\n el.appendChild(doc.createTextNode(styleText));\n }\n}\n\nexport type ElementOptionsType = {|\n style?: { [string]: string },\n id?: string,\n class?: ?$ReadOnlyArray,\n attributes?: { [string]: string },\n styleSheet?: ?string,\n html?: ?string,\n|};\n\nlet awaitFrameLoadPromises: WeakMap<\n HTMLIFrameElement,\n ZalgoPromise\n>;\n\nexport function awaitFrameLoad(\n frame: HTMLIFrameElement\n): ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n const promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n const promise = new ZalgoPromise((resolve, reject) => {\n frame.addEventListener(\"load\", () => {\n linkFrameWindow(frame);\n resolve(frame);\n });\n\n frame.addEventListener(\"error\", (err: Event) => {\n if (frame.contentWindow) {\n resolve(frame);\n } else {\n reject(err);\n }\n });\n });\n\n awaitFrameLoadPromises.set(frame, promise);\n\n return promise;\n}\n\nexport function awaitFrameWindow(\n frame: HTMLIFrameElement\n): ZalgoPromise {\n return awaitFrameLoad(frame).then((loadedFrame) => {\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nconst getDefaultCreateElementOptions = (): ElementOptionsType => {\n // $FlowFixMe\n return {};\n};\n\nexport function createElement(\n tag: string = \"div\",\n options: ElementOptionsType = getDefaultCreateElementOptions(),\n container: ?HTMLElement\n): HTMLElement {\n tag = tag.toLowerCase();\n const element = document.createElement(tag);\n\n if (options.style) {\n extend(element.style, options.style);\n }\n\n if (options.class) {\n element.className = options.class.join(\" \");\n }\n\n if (options.id) {\n element.setAttribute(\"id\", options.id);\n }\n\n if (options.attributes) {\n for (const key of Object.keys(options.attributes)) {\n element.setAttribute(key, options.attributes[key]);\n }\n }\n\n if (options.styleSheet) {\n setStyle(element, options.styleSheet);\n }\n\n if (container) {\n appendChild(container, element);\n }\n\n if (options.html) {\n if (tag === \"iframe\") {\n // $FlowFixMe\n if (!container || !element.contentWindow) {\n throw new Error(\n `Iframe html can not be written unless container provided and iframe in DOM`\n );\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\ntype StringMap = {|\n [string]: string,\n|};\n\nexport type IframeElementOptionsType = {|\n style?: StringMap,\n class?: ?$ReadOnlyArray,\n attributes?: StringMap,\n styleSheet?: ?string,\n html?: ?string,\n url?: ?string,\n|};\n\nconst getDefaultIframeOptions = (): IframeElementOptionsType => {\n // $FlowFixMe\n return {};\n};\n\nconst getDefaultStringMap = (): StringMap => {\n // $FlowFixMe\n return {};\n};\n\nexport function iframe(\n options: IframeElementOptionsType = getDefaultIframeOptions(),\n container: ?HTMLElement\n): HTMLIFrameElement {\n const attributes = options.attributes || getDefaultStringMap();\n const style = options.style || getDefaultStringMap();\n\n // $FlowFixMe\n const newAttributes = {\n allowTransparency: \"true\",\n ...attributes,\n };\n\n // $FlowFixMe\n const newStyle = {\n backgroundColor: \"transparent\",\n border: \"none\",\n ...style,\n };\n\n const frame = createElement(\"iframe\", {\n attributes: newAttributes,\n style: newStyle,\n html: options.html,\n class: options.class,\n });\n\n const isIE = window.navigator.userAgent.match(/MSIE|Edge/i);\n\n if (!frame.hasAttribute(\"id\")) {\n frame.setAttribute(\"id\", uniqueID());\n }\n\n // $FlowFixMe\n awaitFrameLoad(frame);\n\n if (container) {\n const el = getElement(container);\n el.appendChild(frame);\n }\n\n if (options.url || isIE) {\n frame.setAttribute(\"src\", options.url || \"about:blank\");\n }\n\n // $FlowFixMe\n return frame;\n}\n\nexport function addEventListener(\n obj: HTMLElement,\n event: string,\n handler: (event: Event) => void\n): CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n },\n };\n}\n\nexport function bindEvents(\n element: HTMLElement,\n eventNames: $ReadOnlyArray,\n handler: (event: Event) => void\n): CancelableType {\n handler = once(handler);\n\n for (const eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (const eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n }),\n };\n}\n\nconst VENDOR_PREFIXES = [\"webkit\", \"moz\", \"ms\", \"o\"];\n\nexport function setVendorCSS(\n element: HTMLElement,\n name: string,\n value: string\n) {\n // $FlowFixMe\n element.style[name] = value;\n\n const capitalizedName = capitalizeFirstLetter(name);\n\n for (const prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${prefix}${capitalizedName}`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [\n \"animationstart\",\n \"webkitAnimationStart\",\n \"oAnimationStart\",\n \"MSAnimationStart\",\n];\nconst ANIMATION_END_EVENTS = [\n \"animationend\",\n \"webkitAnimationEnd\",\n \"oAnimationEnd\",\n \"MSAnimationEnd\",\n];\n\nexport function animate(\n element: ElementRefType,\n name: string,\n clean: (Function) => void,\n timeout: number = 1000\n): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n const el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n // eslint-disable-next-line prefer-const\n let startTimeout;\n let endTimeout;\n // eslint-disable-next-line prefer-const\n let startEvent;\n // eslint-disable-next-line prefer-const\n let endEvent;\n\n function cleanUp() {\n clearTimeout(startTimeout);\n clearTimeout(endTimeout);\n startEvent.cancel();\n endEvent.cancel();\n }\n\n startEvent = bindEvents(el, ANIMATION_START_EVENTS, (event) => {\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n clearTimeout(startTimeout);\n\n event.stopPropagation();\n\n startEvent.cancel();\n hasStarted = true;\n\n endTimeout = setTimeout(() => {\n cleanUp();\n resolve();\n }, timeout);\n });\n\n endEvent = bindEvents(el, ANIMATION_END_EVENTS, (event) => {\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n if (\n // $FlowFixMe\n typeof event.animationName === \"string\" &&\n event.animationName !== name\n ) {\n return reject(\n `Expected animation name to be ${name}, found ${event.animationName}`\n );\n }\n\n return resolve();\n });\n\n setVendorCSS(el, \"animationName\", name);\n\n startTimeout = setTimeout(() => {\n if (!hasStarted) {\n cleanUp();\n return resolve();\n }\n }, 200);\n\n if (clean) {\n clean(cleanUp);\n }\n });\n}\n\nexport function makeElementVisible(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"\");\n}\n\nexport function makeElementInvisible(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"hidden\", \"important\");\n}\n\nexport function showElement(element: HTMLElement) {\n element.style.setProperty(\"display\", \"\");\n}\n\nexport function hideElement(element: HTMLElement) {\n element.style.setProperty(\"display\", \"none\", \"important\");\n}\n\nexport function destroyElement(element: HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(\n element: HTMLElement,\n name: string,\n clean: (Function) => void\n): ZalgoPromise {\n const animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(\n element: HTMLElement,\n name: string,\n clean: (Function) => void\n): ZalgoPromise {\n return animate(element, name, clean).then(() => {\n hideElement(element);\n });\n}\n\nexport function addClass(element: HTMLElement, name: string) {\n element.classList.add(name);\n}\n\nexport function removeClass(element: HTMLElement, name: string) {\n element.classList.remove(name);\n}\n\nexport function isElementClosed(el: HTMLElement): boolean {\n if (\n !el ||\n !el.parentNode ||\n !el.ownerDocument ||\n !el.ownerDocument.documentElement ||\n !el.ownerDocument.documentElement.contains(el)\n ) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(\n element: HTMLElement,\n handler: () => mixed\n): CancelableType {\n handler = once(handler);\n const terminationEvent = \"onpagehide\" in window ? \"pagehide\" : \"unload\";\n\n let cancelled = false;\n const mutationObservers = [];\n // eslint-disable-next-line prefer-const\n let interval;\n // eslint-disable-next-line prefer-const\n let sacrificialFrame;\n let sacrificialFrameWin;\n\n const cancel = () => {\n cancelled = true;\n for (const observer of mutationObservers) {\n observer.disconnect();\n }\n if (interval) {\n interval.cancel();\n }\n if (sacrificialFrameWin) {\n // eslint-disable-next-line no-use-before-define\n sacrificialFrameWin.removeEventListener(terminationEvent, elementClosed);\n }\n if (sacrificialFrame) {\n destroyElement(sacrificialFrame);\n }\n };\n\n const elementClosed = () => {\n if (!cancelled) {\n handler();\n cancel();\n }\n };\n\n if (isElementClosed(element)) {\n elementClosed();\n return { cancel };\n }\n\n // Strategy 1: Mutation observer\n\n if (window.MutationObserver) {\n let mutationElement = element.parentElement;\n while (mutationElement) {\n const mutationObserver = new window.MutationObserver(() => {\n if (isElementClosed(element)) {\n elementClosed();\n }\n });\n\n mutationObserver.observe(mutationElement, { childList: true });\n mutationObservers.push(mutationObserver);\n mutationElement = mutationElement.parentElement;\n }\n }\n\n // Strategy 2: Sacrificial iframe\n\n sacrificialFrame = document.createElement(\"iframe\");\n sacrificialFrame.setAttribute(\"name\", `__detect_close_${uniqueID()}__`);\n sacrificialFrame.style.display = \"none\";\n awaitFrameWindow(sacrificialFrame).then((frameWin) => {\n sacrificialFrameWin = assertSameDomain(frameWin);\n sacrificialFrameWin.addEventListener(terminationEvent, elementClosed);\n });\n element.appendChild(sacrificialFrame);\n\n // Strategy 3: Poller\n\n const check = () => {\n if (isElementClosed(element)) {\n elementClosed();\n }\n };\n interval = safeInterval(check, 1000);\n\n return { cancel };\n}\n\nexport function fixScripts(el: HTMLElement, doc: Document = window.document) {\n for (const script of querySelectorAll(\"script\", el)) {\n const parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n const newScript = doc.createElement(\"script\");\n newScript.text = script.textContent;\n parentNode.replaceChild(newScript, script);\n }\n}\n\ntype OnResizeOptions = {|\n width?: boolean,\n height?: boolean,\n interval?: number,\n win?: SameDomainWindowType,\n|};\n\nexport function onResize(\n el: HTMLElement,\n handler: ({| width: number, height: number |}) => void,\n {\n width = true,\n height = true,\n interval = 100,\n win = window,\n }: OnResizeOptions = {}\n): {| cancel: () => void |} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n let canceled = false;\n\n handler({ width: currentWidth, height: currentHeight });\n\n const check = () => {\n if (canceled || !isElementVisible(el)) {\n return;\n }\n\n const newWidth = el.offsetWidth;\n const newHeight = el.offsetHeight;\n\n if (\n (width && newWidth !== currentWidth) ||\n (height && newHeight !== currentHeight)\n ) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n win.addEventListener(\"resize\", check);\n\n if (typeof win.ResizeObserver !== \"undefined\") {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n timeout = safeInterval(check, interval * 10);\n } else if (typeof win.MutationObserver !== \"undefined\") {\n observer = new win.MutationObserver(check);\n observer.observe(el, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: false,\n });\n timeout = safeInterval(check, interval * 10);\n } else {\n timeout = safeInterval(check, interval);\n }\n\n return {\n cancel: () => {\n canceled = true;\n observer.disconnect();\n window.removeEventListener(\"resize\", check);\n timeout.cancel();\n },\n };\n}\n\nexport function getResourceLoadTime(url: string): ?number {\n const performance = getPerformance();\n\n if (!performance) {\n return;\n }\n\n // $FlowFixMe[method-unbinding]\n if (typeof performance.getEntries !== \"function\") {\n return;\n }\n\n const entries = performance.getEntries();\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n\n if (\n entry &&\n entry.name &&\n entry.name.indexOf(url) === 0 &&\n typeof entry.duration === \"number\"\n ) {\n return Math.floor(entry.duration);\n }\n }\n}\n\nexport function isShadowElement(element: Node): boolean {\n while (element.parentNode) {\n element = element.parentNode;\n }\n\n return element.toString() === \"[object ShadowRoot]\";\n}\n\nexport function getShadowRoot(element: Node): ?Node {\n while (element.parentNode) {\n element = element.parentNode;\n }\n\n if (isShadowElement(element)) {\n return element;\n }\n}\n\nexport function getShadowHost(element: Node): ?HTMLElement {\n const shadowRoot = getShadowRoot(element);\n\n // $FlowFixMe\n if (shadowRoot && shadowRoot.host) {\n // $FlowFixMe\n return shadowRoot.host;\n }\n}\n\nexport function insertShadowSlot(element: HTMLElement): HTMLElement {\n const shadowHost = getShadowHost(element);\n\n if (!shadowHost) {\n throw new Error(`Element is not in shadow dom`);\n }\n\n const slotName = `shadow-slot-${uniqueID()}`;\n const slot = document.createElement(\"slot\");\n slot.setAttribute(\"name\", slotName);\n element.appendChild(slot);\n\n const slotProvider = document.createElement(\"div\");\n slotProvider.setAttribute(\"slot\", slotName);\n shadowHost.appendChild(slotProvider);\n\n if (isShadowElement(shadowHost)) {\n return insertShadowSlot(slotProvider);\n }\n\n return slotProvider;\n}\n\nexport function preventClickFocus(el: HTMLElement) {\n const onFocus = (event: Event) => {\n el.removeEventListener(\"focus\", onFocus);\n event.preventDefault();\n el.blur();\n return false;\n };\n\n el.addEventListener(\"mousedown\", () => {\n el.addEventListener(\"focus\", onFocus);\n setTimeout(() => {\n el.removeEventListener(\"focus\", onFocus);\n }, 1);\n });\n}\n\nexport function getStackTrace(): string {\n try {\n throw new Error(\"_\");\n } catch (err) {\n return err.stack || \"\";\n }\n}\n\nfunction inferCurrentScript(): ?HTMLScriptElement {\n try {\n const stack = getStackTrace();\n const stackDetails = /.*at [^(]*\\((.*):(.+):(.+)\\)$/gi.exec(stack);\n const scriptLocation = stackDetails && stackDetails[1];\n\n if (!scriptLocation) {\n return;\n }\n\n // $FlowFixMe[method-unbinding]\n for (const script of Array.prototype.slice\n .call(document.getElementsByTagName(\"script\"))\n .reverse()) {\n if (script.src && script.src === scriptLocation) {\n return script;\n }\n }\n } catch (err) {\n // pass\n }\n}\n\nlet currentScript =\n // eslint-disable-next-line compat/compat\n typeof document !== \"undefined\" ? document.currentScript : null;\n\ntype GetCurrentScript = () => HTMLScriptElement;\n\nexport const getCurrentScript: GetCurrentScript = memoize(() => {\n if (currentScript) {\n return currentScript;\n }\n\n currentScript = inferCurrentScript();\n\n if (currentScript) {\n return currentScript;\n }\n\n throw new Error(\"Can not determine current script\");\n});\n\nconst currentUID = uniqueID();\n\ntype GetCurrentScriptUID = () => string;\n\nexport const getCurrentScriptUID: GetCurrentScriptUID = memoize(() => {\n let script;\n\n try {\n script = getCurrentScript();\n } catch (err) {\n return currentUID;\n }\n\n let uid = script.getAttribute(ATTRIBUTES.UID);\n\n if (uid && typeof uid === \"string\") {\n return uid;\n }\n\n uid = script.getAttribute(`${ATTRIBUTES.UID}-auto`);\n\n if (uid && typeof uid === \"string\") {\n return uid;\n }\n\n if (script.src) {\n const { src, dataset } = script;\n const stringToHash = JSON.stringify({ src, dataset });\n const hashedString = strHashStr(stringToHash);\n const hashResult = hashedString.slice(\n hashedString.length - UID_HASH_LENGTH\n );\n\n uid = `uid_${hashResult}`;\n } else {\n uid = uniqueID();\n }\n\n script.setAttribute(`${ATTRIBUTES.UID}-auto`, uid);\n\n return uid;\n});\n\ntype SubmitFormOptions = {|\n url: string,\n target: string,\n body?: {| [string]: string | boolean |},\n method?: string,\n|};\n\nexport function submitForm({\n url,\n target,\n body,\n method = \"post\",\n}: SubmitFormOptions) {\n const form = document.createElement(\"form\");\n form.setAttribute(\"target\", target);\n form.setAttribute(\"method\", method);\n form.setAttribute(\"action\", url);\n form.style.display = \"none\";\n\n if (body) {\n for (const key of Object.keys(body)) {\n const input = document.createElement(\"input\");\n input.setAttribute(\"name\", key);\n input.setAttribute(\"value\", body[key]?.toString());\n form.appendChild(input);\n }\n }\n\n getBody().appendChild(form);\n form.submit();\n getBody().removeChild(form);\n}\n","/* @flow */\n\nimport { uniqueID, getGlobal, inlineMemoize } from \"./util\";\nimport { isLocalStorageEnabled } from \"./dom\";\n\ntype Getter = (handler: (Object) => T) => T;\n\nexport type Storage = {|\n getState: Getter<*>,\n getID: () => string,\n isStateFresh: () => boolean,\n getSessionState: Getter<*>,\n getSessionID: () => string,\n|};\n\nconst DEFAULT_SESSION_STORAGE = 20 * 60 * 1000;\n\nexport function getStorage({\n name,\n lifetime = DEFAULT_SESSION_STORAGE,\n // a sticky session id helps to identify sdk sessions that were created by other sdks\n // like the situation where the Braintree SDK loads the PP SDK\n stickySessionId,\n}: {|\n name: string,\n lifetime?: number,\n stickySessionId?: string,\n|}): Storage {\n return inlineMemoize(\n getStorage,\n () => {\n const STORAGE_KEY = `__${name}_storage__`;\n const newStateID = uniqueID();\n\n let accessedStorage;\n\n function getState(handler: (storage: Object) => T): T {\n const localStorageEnabled = isLocalStorageEnabled();\n let storage;\n\n if (accessedStorage) {\n storage = accessedStorage;\n }\n\n if (!storage && localStorageEnabled) {\n const rawStorage = window.localStorage.getItem(STORAGE_KEY);\n\n if (rawStorage) {\n storage = JSON.parse(rawStorage);\n }\n }\n\n if (!storage) {\n storage = getGlobal()[STORAGE_KEY];\n }\n\n if (!storage) {\n storage = {\n id: newStateID,\n };\n }\n\n if (!storage.id) {\n storage.id = newStateID;\n }\n\n accessedStorage = storage;\n\n const result = handler(storage);\n\n if (localStorageEnabled) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(storage));\n } else {\n getGlobal()[STORAGE_KEY] = storage;\n }\n\n accessedStorage = null;\n\n return result;\n }\n\n function getID(): string {\n return getState((storage) => storage.id);\n }\n\n function isStateFresh(): boolean {\n return getID() === newStateID;\n }\n\n function getSession(handler: (state: Object) => T): T {\n return getState((storage) => {\n let session = storage.__session__;\n const now = Date.now();\n\n if (session && now - session.created > lifetime) {\n session = null;\n }\n\n if (!session) {\n session = {\n guid: stickySessionId || uniqueID(),\n created: now,\n };\n }\n\n storage.__session__ = session;\n\n return handler(session);\n });\n }\n\n function getSessionState(handler: (state: Object) => T): T {\n return getSession((session) => {\n session.state = session.state || {};\n return handler(session.state);\n });\n }\n\n function getSessionID(): string {\n return getSession((session) => session.guid);\n }\n\n return {\n getState,\n getID,\n isStateFresh,\n getSessionState,\n getSessionID,\n };\n },\n [{ name, lifetime }]\n );\n}\n","/* @flow */\n\nimport { noop } from \"./util\";\nimport { getStorage } from \"./storage\";\n\nfunction getBelterExperimentStorage(): Object {\n return getStorage({ name: \"belter_experiment\" });\n}\n\nfunction isEventUnique(name: string): boolean {\n return getBelterExperimentStorage().getSessionState((state) => {\n state.loggedBeacons = state.loggedBeacons || [];\n\n if (state.loggedBeacons.indexOf(name) === -1) {\n state.loggedBeacons.push(name);\n return true;\n }\n\n return false;\n });\n}\n\ntype Payload = {\n [string]: ?(string | boolean),\n};\n\nexport type Experiment = {|\n isEnabled: () => boolean,\n isDisabled: () => boolean,\n getTreatment: () => string,\n log: (string, payload?: Payload) => Experiment,\n logStart: (payload?: Payload) => Experiment,\n logComplete: (payload?: Payload) => Experiment,\n|};\n\nfunction getRandomInteger(range: number): number {\n return Math.floor(Math.random() * range);\n}\n\nfunction getThrottlePercentile(name: string): number {\n return getBelterExperimentStorage().getState((state) => {\n state.throttlePercentiles = state.throttlePercentiles || {};\n state.throttlePercentiles[name] =\n state.throttlePercentiles[name] || getRandomInteger(100);\n return state.throttlePercentiles[name];\n });\n}\n\nconst THROTTLE_GROUP = {\n TEST: \"test\",\n CONTROL: \"control\",\n THROTTLE: \"throttle\",\n};\n\ntype ExperimentOptions = {|\n name: string,\n sample?: number,\n logTreatment?: ({|\n name: string,\n treatment: string,\n payload: Payload,\n throttle: number,\n |}) => void,\n logCheckpoint?: ({|\n name: string,\n treatment: string,\n checkpoint: string,\n payload: Payload,\n throttle: number,\n |}) => void,\n sticky?: boolean,\n|};\n\nexport function experiment({\n name,\n sample = 50,\n logTreatment = noop,\n logCheckpoint = noop,\n sticky = true,\n}: ExperimentOptions): Experiment {\n const throttle = sticky ? getThrottlePercentile(name) : getRandomInteger(100);\n\n let group;\n\n if (throttle < sample && !__TEST__) {\n group = THROTTLE_GROUP.TEST;\n } else if (sample >= 50 || (sample <= throttle && throttle < sample * 2)) {\n group = THROTTLE_GROUP.CONTROL;\n } else {\n group = THROTTLE_GROUP.THROTTLE;\n }\n\n const treatment = `${name}_${group}`;\n\n let started = false;\n let forced = false;\n\n try {\n if (window.localStorage && window.localStorage.getItem(name)) {\n forced = true;\n }\n } catch (err) {\n // pass\n }\n\n const exp = {\n isEnabled(): boolean {\n return group === THROTTLE_GROUP.TEST || forced;\n },\n\n isDisabled(): boolean {\n return group !== THROTTLE_GROUP.TEST && !forced;\n },\n\n getTreatment(): string {\n return treatment;\n },\n\n log(checkpoint: string, payload?: Payload = {}): Experiment {\n if (!started) {\n return exp;\n }\n\n if (isEventUnique(`${treatment}_${JSON.stringify(payload)}`)) {\n logTreatment({ name, treatment, payload, throttle });\n }\n\n if (\n isEventUnique(`${treatment}_${checkpoint}_${JSON.stringify(payload)}`)\n ) {\n logCheckpoint({ name, treatment, checkpoint, payload, throttle });\n }\n\n return exp;\n },\n\n logStart(payload?: Payload = {}): Experiment {\n started = true;\n return exp.log(`start`, payload);\n },\n\n logComplete(payload?: Payload = {}): Experiment {\n return exp.log(`complete`, payload);\n },\n };\n\n return exp;\n}\n","/* @flow */\n\nimport { getGlobal } from \"./util\";\n\nexport function getGlobalNameSpace({\n name,\n version = \"latest\",\n}: {|\n name: string,\n version?: string,\n|}): {| get: (string, defValue?: T) => T |} {\n const global = getGlobal();\n const globalKey = `__${name}__${version}_global__`;\n\n const namespace = (global[globalKey] = global[globalKey] || {});\n\n return {\n get: (key: string, defValue?: T): T => {\n // $FlowFixMe\n defValue = defValue || {};\n const item = (namespace[key] = namespace[key] || defValue);\n return item;\n },\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport { type SameDomainWindowType } from \"@krakenjs/cross-domain-utils/src\";\n\ntype RequestOptionsType = {|\n url: string,\n method?: string,\n headers?: { [key: string]: string },\n json?: $ReadOnlyArray | Object,\n data?: { [key: string]: string },\n body?: string,\n win?: SameDomainWindowType,\n timeout?: number,\n|};\n\ntype ResponseType = {|\n status: number,\n headers: { [string]: string },\n body: Object,\n|};\n\nconst HEADERS = {\n CONTENT_TYPE: \"content-type\",\n ACCEPT: \"accept\",\n};\n\nconst headerBuilders = [];\n\nfunction parseHeaders(rawHeaders: string = \"\"): { [string]: string } {\n const result = {};\n for (const line of rawHeaders.trim().split(\"\\n\")) {\n const [key, ...values] = line.split(\":\");\n result[key.toLowerCase()] = values.join(\":\").trim();\n }\n return result;\n}\n\nexport function request({\n url,\n method = \"get\",\n headers = {},\n json,\n data,\n body,\n win = window,\n timeout = 0,\n}: RequestOptionsType): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n if ((json && data) || (json && body) || (data && json)) {\n throw new Error(\n `Only options.json or options.data or options.body should be passed`\n );\n }\n\n const normalizedHeaders = {};\n\n for (const key of Object.keys(headers)) {\n normalizedHeaders[key.toLowerCase()] = headers[key];\n }\n\n if (json) {\n normalizedHeaders[HEADERS.CONTENT_TYPE] =\n normalizedHeaders[HEADERS.CONTENT_TYPE] || \"application/json\";\n } else if (data || body) {\n normalizedHeaders[HEADERS.CONTENT_TYPE] =\n normalizedHeaders[HEADERS.CONTENT_TYPE] ||\n \"application/x-www-form-urlencoded; charset=utf-8\";\n }\n\n normalizedHeaders[HEADERS.ACCEPT] =\n normalizedHeaders[HEADERS.ACCEPT] || \"application/json\";\n\n for (const headerBuilder of headerBuilders) {\n const builtHeaders = headerBuilder();\n\n for (const key of Object.keys(builtHeaders)) {\n normalizedHeaders[key.toLowerCase()] = builtHeaders[key];\n }\n }\n\n const xhr = new win.XMLHttpRequest();\n\n xhr.addEventListener(\n \"load\",\n function xhrLoad(): void {\n const responseHeaders = parseHeaders(this.getAllResponseHeaders());\n\n if (!this.status) {\n return reject(\n new Error(\n `Request to ${method.toLowerCase()} ${url} failed: no response status code.`\n )\n );\n }\n\n const contentType = responseHeaders[\"content-type\"];\n const isJSON =\n contentType &&\n (contentType.indexOf(\"application/json\") === 0 ||\n contentType.indexOf(\"text/json\") === 0);\n let responseBody = this.responseText;\n\n try {\n responseBody = JSON.parse(responseBody);\n } catch (err) {\n if (isJSON) {\n return reject(new Error(`Invalid json: ${this.responseText}.`));\n }\n }\n\n const res = {\n status: this.status,\n headers: responseHeaders,\n body: responseBody,\n };\n\n return resolve(res);\n },\n false\n );\n\n xhr.addEventListener(\n \"error\",\n (evt) => {\n reject(\n new Error(\n `Request to ${method.toLowerCase()} ${url} failed: ${evt.toString()}.`\n )\n );\n },\n false\n );\n\n xhr.open(method, url, true);\n\n for (const key in normalizedHeaders) {\n if (normalizedHeaders.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, normalizedHeaders[key]);\n }\n }\n\n if (json) {\n body = JSON.stringify(json);\n } else if (data) {\n body = Object.keys(data)\n .map((key) => {\n return `${encodeURIComponent(key)}=${\n data ? encodeURIComponent(data[key]) : \"\"\n }`;\n })\n .join(\"&\");\n }\n\n xhr.timeout = timeout;\n xhr.ontimeout = function xhrTimeout() {\n reject(\n new Error(`Request to ${method.toLowerCase()} ${url} has timed out`)\n );\n };\n\n xhr.send(body);\n });\n}\n\nexport function addHeaderBuilder(method: () => { [string]: string }) {\n headerBuilders.push(method);\n}\n","/* @flow */\n\n// export something to force webpack to see this as an ES module\nexport const TYPES = true;\n\ndeclare var __TEST__: boolean;\n\nexport type JSONPrimitive = string | boolean | number;\nexport type JSONObject =\n | { [string]: JSONPrimitive | JSONObject }\n | $ReadOnlyArray;\nexport type JSONType = JSONObject | JSONPrimitive;\n\nexport type CancelableType = {|\n cancel: () => void,\n|};\n","/* @flow */\n\nimport { memoize, promisify } from \"./util\";\n\nexport function memoized(target: Object, name: string, descriptor: Object) {\n descriptor.value = memoize(descriptor.value, { name, thisNamespace: true });\n}\n\nexport function promise(target: Object, name: string, descriptor: Object) {\n descriptor.value = promisify(descriptor.value, { name });\n}\n","/* @flow */\n\nexport function isPerc(str: string): boolean {\n return typeof str === \"string\" && /^[0-9]+%$/.test(str);\n}\n\nexport function isPx(str: string): boolean {\n return typeof str === \"string\" && /^[0-9]+px$/.test(str);\n}\n\nexport function toNum(val: string | number): number {\n if (typeof val === \"number\") {\n return val;\n }\n\n const match = val.match(/^([0-9]+)(px|%)$/);\n\n if (!match) {\n throw new Error(`Could not match css value from ${val}`);\n }\n\n return parseInt(match[1], 10);\n}\n\nexport function toPx(val: number | string): string {\n return `${toNum(val)}px`;\n}\n\nexport function toCSS(val: number | string): string {\n if (typeof val === \"number\") {\n return toPx(val);\n }\n\n return isPerc(val) ? val : toPx(val);\n}\n\nexport function percOf(num: number, perc: string): number {\n return parseInt((num * toNum(perc)) / 100, 10);\n}\n\nexport function normalizeDimension(dim: string | number, max: number): number {\n if (typeof dim === \"number\") {\n return dim;\n } else if (isPerc(dim)) {\n return percOf(max, dim);\n } else if (isPx(dim)) {\n return toNum(dim);\n } else {\n throw new Error(`Can not normalize dimension: ${dim}`);\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\n\nimport { noop, tryCatch, removeFromArray } from \"./util\";\n\ntype Prom = Promise | ZalgoPromise; // eslint-disable-line no-restricted-globals, promise/no-native\n\n// eslint-disable-next-line no-undef\ntype Handler = >(\n name: string,\n // eslint-disable-next-line no-undef\n fn?: (...args: A) => T\n // eslint-disable-next-line no-undef\n) => (...args: A) => T;\ntype Wrapper = ({|\n expect: Handler,\n avoid: Handler,\n expectError: Handler,\n error: Handler,\n wait: () => Prom,\n|}) => Prom | void;\n\nexport function wrapPromise(\n method: Wrapper,\n { timeout = 5000 }: {| timeout?: number |} = {}\n): ZalgoPromise {\n const expected: Array<{| name: string, handler: Handler |}> = [];\n const promises: Array<{| name: string, promise: ZalgoPromise<*> |}> = [];\n\n return new ZalgoPromise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (expected.length) {\n reject(\n new Error(`Expected ${expected[0].name} to be called in ${timeout}ms`)\n );\n }\n\n if (promises.length) {\n reject(\n new Error(\n `Expected ${promises[0].name} promise to complete in ${timeout}ms`\n )\n );\n }\n }, timeout);\n\n // $FlowFixMe[escaped-generic]\n const expect: Handler = (name, handler = noop) => {\n const exp = { name, handler };\n // $FlowFixMe\n expected.push(exp);\n\n // $FlowFixMe\n return function expectWrapper(...args): * {\n removeFromArray(expected, exp);\n\n // $FlowFixMe\n const { result, error } = tryCatch(() => handler.call(this, ...args));\n\n if (error) {\n promises.push({ name, promise: ZalgoPromise.asyncReject(error) });\n throw error;\n }\n\n // $FlowFixMe[escaped-generic]\n promises.push({ name, promise: ZalgoPromise.resolve(result) });\n\n // $FlowFixMe[escaped-generic]\n return result;\n };\n };\n\n // $FlowFixMe[escaped-generic]\n const avoid: Handler = (name: string, fn = noop) => {\n // $FlowFixMe\n return function avoidWrapper(...args): * {\n promises.push({\n name,\n promise: ZalgoPromise.asyncReject(\n new Error(`Expected ${name} to not be called`)\n ),\n });\n // $FlowFixMe\n return fn.call(this, ...args);\n };\n };\n\n // $FlowFixMe[escaped-generic]\n const expectError: Handler = (name, handler = noop) => {\n const exp = { name, handler };\n // $FlowFixMe\n expected.push(exp);\n\n // $FlowFixMe\n return function expectErrorWrapper(...args): * {\n removeFromArray(expected, exp);\n\n // $FlowFixMe\n const { result, error } = tryCatch(() => handler.call(this, ...args));\n\n if (error) {\n throw error;\n }\n\n promises.push({\n name,\n // $FlowFixMe[escaped-generic]\n promise: ZalgoPromise.resolve(result).then(() => {\n throw new Error(`Expected ${name} to throw an error`);\n }, noop),\n });\n\n // $FlowFixMe[escaped-generic]\n return result;\n };\n };\n\n const wait = () => {\n return ZalgoPromise.try(() => {\n if (promises.length) {\n const prom = promises[0];\n return prom.promise\n .finally(() => {\n removeFromArray(promises, prom);\n })\n .then(wait);\n }\n }).then(() => {\n if (expected.length) {\n return ZalgoPromise.delay(10).then(wait);\n }\n });\n };\n\n promises.push({\n name: \"wrapPromise handler\",\n promise: ZalgoPromise.try(() =>\n method({\n expect,\n avoid,\n expectError,\n error: avoid,\n wait: () => ZalgoPromise.resolve(),\n })\n ),\n });\n\n wait()\n .finally(() => {\n clearTimeout(timer);\n })\n .then(resolve, reject);\n });\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://belter/webpack/universalModuleDefinition","webpack://belter/webpack/bootstrap","webpack://belter/./src/screenHeights.js","webpack://belter/./src/device.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://belter/./node_modules/@krakenjs/zalgo-promise/src/utils.js","webpack://belter/./node_modules/@krakenjs/zalgo-promise/src/exceptions.js","webpack://belter/./node_modules/@krakenjs/zalgo-promise/src/flush.js","webpack://belter/./node_modules/@krakenjs/zalgo-promise/src/promise.js","webpack://belter/./node_modules/@krakenjs/cross-domain-utils/src/utils.js","webpack://belter/./node_modules/@krakenjs/cross-domain-utils/src/constants.js","webpack://belter/./node_modules/@krakenjs/cross-domain-safe-weakmap/src/util.js","webpack://belter/./node_modules/@krakenjs/cross-domain-safe-weakmap/src/weakmap.js","webpack://belter/./node_modules/@krakenjs/cross-domain-safe-weakmap/src/native.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/construct.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","webpack://belter/./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","webpack://belter/./src/constants.js","webpack://belter/./src/util.js","webpack://belter/./src/dom.js","webpack://belter/./src/storage.js","webpack://belter/./src/experiment.js","webpack://belter/./src/global.js","webpack://belter/./src/http.js","webpack://belter/./src/types.js","webpack://belter/./src/decorators.js","webpack://belter/./src/css.js","webpack://belter/./src/test.js"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","hasOwnProperty","p","s","sfvcScreens","textSizeHeights","textSizeHeightsNoTabs","zoomHeight","maybeSafari","getUserAgent","window","navigator","mockUserAgent","userAgent","TABLET_PATTERN","isDevice","match","isTablet","test","isWebView","ua","isStandAlone","standalone","matchMedia","matches","isFacebookWebView","isInstagramWebView","isMetaWebView","isMetaInAppBrowser","isFirefox","isFirefoxIOS","isEdgeIOS","isOperaMini","isAndroid","isFirefoxAndroid","isIos","isIOS14","isGoogleSearchApp","isQQBrowser","isIosWebview","isSFVC","height","innerHeight","scale","Math","round","screen","width","innerWidth","computedHeight","device","outerHeight","indexOf","isSFVCorSafari","sfvc","possibleSafariSizes","isAndroidWebview","isIE","document","documentMode","Boolean","isIECompHeader","mHttp","querySelector","mContent","isElectron","process","versions","electron","isIEIntranet","status","err","isMacOsCna","supportsPopups","isChrome","isSafari","isIpadOs","maxTouchPoints","isApplePaySupported","ApplePaySession","supportsVersion","canMakePayments","e","isCrossSiteTrackingEnabled","expectedCookieKey","cookie","_setPrototypeOf","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","prototype","constructor","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","Window","toString","then","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","Error","dispatch","_this2","setTimeout","push","j","dispatchPossiblyUnhandledError","asyncReject","chain","firstPromise","secondPromise","_handlers$i","onSuccess","onError","promiseResult","catch","undefined","finally","onFinally","try","timeout","time","_this3","clearTimeout","toPromise","TypeError","lazy","all","promises","count","results","slice","prom","hash","awaitPromises","_loop","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","IE_WIN_ACCESS_ERROR","getActualProtocol","win","location","protocol","getProtocol","mockDomain","split","isAboutProtocol","canReadFromWindow","getActualDomain","PROTOCOL","parent","getParent","host","getDomain","domain","isSameDomain","desc","getOwnPropertyDescriptor","isMockProtocol","isActuallySameDomain","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","top","iframeIndex","collection","safeIndexOf","frame","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","isWindow","obj","__cross_domain_utils_window_check__","CrossDomainSafeWeakMap","weakmap","keys","values","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","_getPrototypeOf","getPrototypeOf","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Date","_construct","Parent","Class","isNativeReflectConstruct","a","instance","Function","_wrapNativeSuper","_cache","Map","Wrapper","configurable","objectIDs","KEY_CODES","ENTER","SPACE","ATTRIBUTES","UID","UID_HASH_LENGTH","invalidProtocolRegex","htmlEntitiesRegex","htmlCtrlEntityRegex","ctrlCharactersRegex","urlSchemeRegex","relativeFirstCharacters","BLANK_URL","isElement","element","passed","Element","nodeType","style","_","getFunctionName","fn","__name__","displayName","setFunctionName","base64encode","str","btoa","encodeURIComponent","replace","p1","String","fromCharCode","parseInt","Buffer","from","base64decode","atob","decodeURIComponent","Array","charCodeAt","join","uniqueID","chars","charAt","floor","toISOString","toLowerCase","getGlobal","global","__GLOBAL__","getObjectID","uid","serializeArgs","JSON","stringify","subkey","val","getEmptyObject","memoizeGlobalIndex","memoizeGlobalIndexValidFrom","memoize","options","simpleCache","thisCache","_options$thisNamespac","thisNamespace","cacheTime","memoizeIndex","memoizedFunction","_len","_key","cache","cacheKey","_unused","cacheResult","now","reset","promiseIdentity","memoizePromise","memoizedPromiseFunction","_arguments","_len2","_key2","promisify","promisifiedFunction","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","hashStr","pow","sqrt","strHashStr","total","abs","pattern","regmatch","awaitKey","stringifyError","level","newErr","stringifyErrorMessage","defaultMessage","domainMatches","hostname","patchMethod","original","_arguments2","callOriginal","extend","clear","memoizedValues","perc","pixels","percentage","min","max","roundUp","num","nearest","remainder","regexMap","regexp","svgToBase64","svg","objFilter","filter","identity","regexTokenize","text","token","promiseDebounce","localPromise","safeInterval","loop","isInteger","isFloat","serializePrimitive","deserializePrimitive","parseFloat","dotify","prefix","newobj","isArray","every","undotify","keyResult","parts","part","isLast","isIndex","eventEmitter","triggered","emitter","on","eventName","handlerList","cancelled","listener","trigger","_len3","_key3","_i2","triggerOnce","_len4","_key4","concat","camelToDasherize","string","g","dasherizeToCamel","toUpperCase","capitalizeFirstLetter","path","def","pathParts","safeTimeout","interval","defineLazyProp","arrayFrom","isObject","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","_loop2","itemKey","child","_loop3","copyProp","descriptor","regex","start","RegExp","groups","end","regexAll","isDefined","cycle","debounce","_arguments3","isRegex","weakMapMemoize","arg","_this4","weakMapMemoizePromise","_this5","cleanup","cleanErr","tasks","cleaned","cleaner","register","task","shift","tryCatch","removeFromArray","arr","assertExists","thing","unique","_i4","constHas","constant","dedupeErrors","seenErrors","seenStringifiedErrors","stringifiedError","ExtendableError","_Error","_this6","captureStackTrace","sanitizeUrl","url","sanitizedUrl","matchRegex","dec","trim","isRelativeUrlWithoutProtocol","urlSchemeParseResults","getBody","body","isDocumentReady","readyState","isDocumentInteractive","urlEncode","waitForWindowReady","addEventListener","waitForDocumentReady","setInterval","clearInterval","waitForDocumentBody","parseQuery","queryString","params","_queryString$split2","pair","getQueryParam","search","urlWillRedirectPage","href","formatQuery","extendQuery","originalQuery","props","extendUrl","originalUrl","originalHash","query","_url$split","_originalUrl$split","hashString","redirect","hasMetaViewPort","meta","isElementVisible","el","offsetWidth","offsetHeight","getClientRects","getPerformance","performance","timing","connectEnd","navigationStart","enablePerformance","getPageRenderTime","domInteractive","htmlEncode","html","isBrowser","querySelectorAll","selector","onClick","passive","event","keyCode","getScript","_ref","_ref$host","_ref$reverse","reverse","scripts","getElementsByTagName","script","src","isLocalStorageEnabled","localStorage","setItem","getItem","removeItem","getBrowserLocales","nav","locales","languages","language","userLanguage","locale","_locale$split","country","lang","appendChild","container","getElementSafe","id","getElement","elementReady","awaitFrameLoadPromises","PopupOpenError","_ExtendableError","popup","_options$closeOnUnloa","closeOnUnload","_options$name","left","outerWidth","screenX","screenY","toolbar","menubar","resizable","scrollbars","open","close","writeToWindow","write","err2","writeElementToWindow","tag","tagName","_i6","_arrayFrom2","children","removeChild","_i8","_arrayFrom4","setStyle","styleText","styleSheet","cssText","createTextNode","awaitFrameLoad","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","createElement","class","className","setAttribute","attributes","_i0","_Object$keys2","innerHTML","iframe","allowTransparency","backgroundColor","border","hasAttribute","removeEventListener","bindEvents","eventNames","_i10","_i12","VENDOR_PREFIXES","setVendorCSS","capitalizedName","_i14","ANIMATION_START_EVENTS","ANIMATION_END_EVENTS","animate","clean","startTimeout","endTimeout","startEvent","endEvent","hasStarted","cleanUp","animationName","stopPropagation","makeElementVisible","setProperty","makeElementInvisible","showElement","hideElement","destroyElement","showAndAnimate","animation","animateAndHide","addClass","classList","add","removeClass","remove","isElementClosed","watchElementForClose","_ref2$isBfcacheEnable","isBfcacheEnabled","console","log","terminationEvent","sacrificialFrame","sacrificialFrameWin","mutationObservers","_i16","disconnect","elementClosedOnTermination","elementClosed","persisted","MutationObserver","mutationElement","parentElement","mutationObserver","observe","childList","display","frameWin","assertSameDomain","fixScripts","_i18","_querySelectorAll2","newScript","textContent","replaceChild","onResize","_temp","_ref3","_ref3$width","_ref3$height","_ref3$interval","_ref3$win","currentWidth","currentHeight","canceled","observer","check","newWidth","newHeight","ResizeObserver","subtree","characterData","getResourceLoadTime","getEntries","entries","duration","isShadowElement","getShadowRoot","getShadowHost","shadowRoot","insertShadowSlot","shadowHost","slotName","slot","slotProvider","preventClickFocus","onFocus","preventDefault","blur","getStackTrace","currentScript","getCurrentScript","stackDetails","exec","scriptLocation","_i20","_Array$prototype$slic2","inferCurrentScript","currentUID","getCurrentScriptUID","getAttribute","hashedString","dataset","submitForm","_ref4","_ref4$method","form","_i22","_Object$keys4","_body$key","input","submit","getStorage","_ref$lifetime","lifetime","stickySessionId","accessedStorage","STORAGE_KEY","newStateID","getState","storage","localStorageEnabled","rawStorage","parse","getID","getSession","session","__session__","created","guid","isStateFresh","getSessionState","state","getSessionID","getBelterExperimentStorage","isEventUnique","loggedBeacons","getRandomInteger","range","experiment","group","_ref$sample","sample","_ref$logTreatment","logTreatment","_ref$logCheckpoint","logCheckpoint","_ref$sticky","sticky","throttle","throttlePercentiles","getThrottlePercentile","treatment","started","forced","exp","isEnabled","isDisabled","getTreatment","checkpoint","payload","logStart","logComplete","getGlobalNameSpace","_ref$version","version","globalKey","namespace","defValue","headerBuilders","request","_ref$method","_ref$headers","headers","json","data","_ref$win","_ref$timeout","normalizedHeaders","builtHeaders","headerBuilder","xhr","XMLHttpRequest","responseHeaders","rawHeaders","_rawHeaders$trim$spli2","_line$split","_arrayLikeToArray","parseHeaders","getAllResponseHeaders","contentType","isJSON","responseBody","responseText","evt","setRequestHeader","ontimeout","send","addHeaderBuilder","TYPES","memoized","isPerc","isPx","toNum","toPx","toCSS","percOf","normalizeDimension","dim","wrapPromise","expected","timer","expect","_tryCatch","_handler","avoid","_fn","expectError","_tryCatch2","_handler2","wait"],"mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,SAAU,GAAIH,GACK,iBAAZC,QACdA,QAAgB,OAAID,IAEpBD,EAAa,OAAIC,IARnB,CASoB,oBAATK,KAAuBA,KAAOC,MAAO,WAChD,O,YCTE,IAAIC,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUR,QAGnC,IAAIC,EAASK,EAAiBE,GAAY,CACzCC,EAAGD,EACHE,GAAG,EACHV,QAAS,IAUV,OANAW,EAAQH,GAAUI,KAAKX,EAAOD,QAASC,EAAQA,EAAOD,QAASO,GAG/DN,EAAOS,GAAI,EAGJT,EAAOD,QA0Df,OArDAO,EAAoBM,EAAIF,EAGxBJ,EAAoBO,EAAIR,EAGxBC,EAAoBQ,EAAI,SAASf,EAASgB,EAAMC,GAC3CV,EAAoBW,EAAElB,EAASgB,IAClCG,OAAOC,eAAepB,EAASgB,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEV,EAAoBgB,EAAI,SAASvB,GACX,oBAAXwB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAepB,EAASwB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAepB,EAAS,aAAc,CAAE0B,OAAO,KAQvDnB,EAAoBoB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnB,EAAoBmB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFAxB,EAAoBgB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnB,EAAoBQ,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvB,EAAoB2B,EAAI,SAASjC,GAChC,IAAIgB,EAAShB,GAAUA,EAAO4B,WAC7B,WAAwB,OAAO5B,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAM,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASiB,EAAQC,GAAY,MAAOjB,GAAiBkB,eAAezB,KAAKuB,EAAQC,IAGzG7B,EAAoB+B,EAAI,GAIjB/B,EAAoBA,EAAoBgC,EAAI,G,0kSChF9C,IAAMC,EAAc,CAIzB,IAAO,CACLC,gBAAiB,CAAC,IAAK,IAAK,KAC5BC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,KACnB,KAAQ,CAAC,IAAK,KACd,IAAO,CAAC,IAAK,KACb,KAAQ,CAAC,IAAK,IAAK,KACnB,EAAK,CAAC,IAAK,KACX,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,KACN,KAAQ,CAAC,MAEXC,YAAa,CACX,EAAK,CAAC,KACN,KAAQ,CAAC,KACT,KAAQ,CAAC,IAAK,KACd,IAAO,CAAC,IAAK,KACb,KAAQ,CAAC,KACT,EAAK,CAAC,IAAK,KACX,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,IAAK,KAChB,KAAQ,CAAC,IAAK,IAAK,OASvB,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,IAAK,KACvB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,EAAK,CAAC,IAAK,IAAK,KAChB,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,MAEbC,YAAa,CACX,EAAK,CAAC,KACN,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,OAUf,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,KAClB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,EAAK,CAAC,IAAK,IAAK,IAAK,KACrB,IAAO,CAAC,IAAK,IAAK,IAAK,KACvB,EAAK,CAAC,IAAK,IAAK,MAElBC,YAAa,CACX,IAAO,CAAC,KACR,EAAK,CAAC,OAOV,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,KAC5BC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,KACnB,KAAQ,CAAC,IAAK,IAAK,KACnB,IAAO,CAAC,IAAK,IAAK,KAClB,KAAQ,CAAC,IAAK,KACd,KAAQ,CAAC,IAAK,KACd,EAAK,CAAC,IAAK,KACX,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,MAEbC,YAAa,CACX,EAAK,CAAC,KACN,KAAQ,CAAC,KACT,KAAQ,CAAC,KACT,IAAO,CAAC,KACR,KAAQ,CAAC,IAAK,KACd,KAAQ,CAAC,IAAK,KACd,EAAK,CAAC,IAAK,KACX,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,OAUf,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,KACnB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,KAClB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,EAAK,CAAC,IAAK,IAAK,KAChB,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,IAAK,IAAK,IAAK,MAEvBC,YAAa,CACX,KAAQ,CAAC,KACT,IAAO,CAAC,KACR,EAAK,CAAC,KACN,IAAO,CAAC,IAAK,KACb,EAAK,CAAC,OAUV,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,IAAK,KACvB,KAAQ,CAAC,IAAK,IAAK,KACnB,EAAK,CAAC,IAAK,IAAK,IAAK,KACrB,IAAO,CAAC,IAAK,IAAK,IAAK,KACvB,EAAK,CAAC,IAAK,MAEbC,YAAa,CACX,KAAQ,CAAC,KACT,EAAK,CAAC,IAAK,OAUf,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,KAClB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,EAAK,CAAC,IAAK,IAAK,KAChB,IAAO,CAAC,IAAK,IAAK,IAAK,KACvB,EAAK,CAAC,IAAK,IAAK,MAElBC,YAAa,CACX,IAAO,CAAC,KACR,EAAK,CAAC,KACN,EAAK,CAAC,OAWV,IAAO,CACLH,gBAAiB,CAAC,IAAK,IAAK,IAAK,KACjCC,sBAAuB,CAAC,IAAK,IAAK,IAAK,KACvCC,WAAY,CACV,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,KAAQ,CAAC,IAAK,IAAK,IAAK,KACxB,IAAO,CAAC,IAAK,IAAK,KAClB,KAAQ,CAAC,IAAK,IAAK,KACnB,EAAK,CAAC,IAAK,IAAK,IAAK,KACrB,IAAO,CAAC,IAAK,IAAK,KAClB,EAAK,CAAC,IAAK,IAAK,MAElBC,YAAa,CACX,IAAO,CAAC,KACR,KAAQ,CAAC,KACT,IAAO,CAAC,KACR,EAAK,CAAC,QC7ML,SAASC,IACd,OAAOC,OAAOC,UAAUC,eAAiBF,OAAOC,UAAUE,UAG5D,IAAMC,EACJ,gTAEK,SAASC,EAASF,GACvB,YADyC,IAAlBA,MAAqBJ,OAE1CI,EAAUG,MACR,wGASC,SAASC,EAASJ,GACvB,YADyC,IAAlBA,MAAqBJ,KACrCK,EAAeI,KAAKL,GAGtB,SAASM,EAAUC,GACxB,YADmC,IAAXA,MAAcX,KAEpC,qEAAqES,KACnEE,IAEF,SAASF,KAAKE,IACd,gCAAgCF,KAAKE,GAIlC,SAASC,IACd,OACkC,IAAhCX,OAAOC,UAAUW,YACjBZ,OAAOa,WAAW,8BAA8BC,QAI7C,SAASC,EAAkBL,GAChC,YAD2C,IAAXA,MAAcX,KACvC,OAAOS,KAAKE,IAAO,OAAOF,KAAKE,GAGjC,SAASM,EAAmBN,GACjC,YAD4C,IAAXA,MAAcX,KACxC,YAAYS,KAAKE,GAGnB,SAASO,EAAcP,GAC5B,YADuC,IAAXA,MAAcX,KACnCgB,EAAkBL,IAAOM,EAAmBN,GAG9C,SAASQ,EAAmBR,GACjC,YAD4C,IAAXA,MAAcX,KACxC,QAAQS,KAAKE,GAGf,SAASS,EAAUT,GACxB,YADmC,IAAXA,MAAcX,KAC/B,WAAWS,KAAKE,GAGlB,SAASU,EAAaV,GAC3B,YADsC,IAAXA,MAAcX,KAClC,SAASS,KAAKE,GAGhB,SAASW,EAAUX,GACxB,YADmC,IAAXA,MAAcX,KAC/B,UAAUS,KAAKE,GAGjB,SAASY,EAAYZ,GAC1B,YADqC,IAAXA,MAAcX,KACjC,cAAcS,KAAKE,GAGrB,SAASa,EAAUb,GACxB,YADmC,IAAXA,MAAcX,KAC/B,UAAUS,KAAKE,GAGjB,SAASc,EAAiBd,GAC/B,YAD0C,IAAXA,MAAcX,KACtCwB,EAAUb,IAAOS,EAAUT,GAG7B,SAASe,EAAMf,GACpB,YAD+B,IAAXA,MAAcX,KAC3B,mBAAmBS,KAAKE,GAG1B,SAASgB,EAAQhB,GACtB,YADiC,IAAXA,MAAcX,KAC7B,uCAAuCS,KAAKE,GAG9C,SAASiB,EAAkBjB,GAChC,YAD2C,IAAXA,MAAcX,KACvC,UAAUS,KAAKE,GAGjB,SAASkB,EAAYlB,GAC1B,YADqC,IAAXA,MAAcX,KACjC,YAAYS,KAAKE,GAGnB,SAASmB,EAAanB,GAC3B,YADsC,IAAXA,MAAcX,OACrC0B,EAAMf,OACJiB,EAAkBjB,IAGf,wCAAwCF,KAAKE,IAKjD,SAASoB,EAAOpB,GACrB,QADgC,IAAXA,MAAcX,KAC/B0B,EAAMf,GAAK,CACb,IAAMqB,EAAS/B,OAAOgC,YAChBC,EACJC,KAAKC,MAAOnC,OAAOoC,OAAOC,MAAQrC,OAAOsC,WAAc,KAAO,IAC1DC,EAAiBL,KAAKC,MAAMJ,EAASE,GAEvCO,EAAS,KACb,GAAId,EAAQhB,GACV8B,EAAS9C,EAAYM,OAAOyC,iBACvB,CACL,GAAc,IAAVR,EACF,OAAO,EAGTO,EAAS9C,EAAYM,OAAOyC,aAG9B,OAAKD,IAIDP,EAAQ,GAAKO,EAAO3C,YAAc2C,EAAO3C,WAAWoC,IACO,IAAtDO,EAAO3C,WAAWoC,GAAOS,QAAQH,IAGc,IAApDC,EAAO7C,gBAAgB+C,QAAQH,KAC2B,IAA1DC,EAAO5C,sBAAsB8C,QAAQH,IAI3C,OAAO,EAGF,SAASI,EAAejC,GAC7B,QADwC,IAAXA,MAAcX,KACvC0B,EAAMf,GAAK,CACb,IAAMkC,EAAOd,EAAOpB,GAEd8B,EAASd,EAAQhB,GAAMhB,EAAYM,OAAOyC,aAAe,KAE/D,IAAKD,EACH,OAAO,EAGT,IAAMT,EAAS/B,OAAOgC,YAChBC,EACJC,KAAKC,MAAOnC,OAAOoC,OAAOC,MAAQrC,OAAOsC,WAAc,KAAO,IAE1DC,EAAiBL,KAAKC,MAAMJ,EAASE,GACrCY,EAAsBL,EAAO1C,YAE/BA,GAAc,EASlB,OAPEmC,EAAQ,GACRY,EAAoBZ,KACoC,IAAxDY,EAAoBZ,GAAOS,QAAQH,KAEnCzC,GAAc,GAGT8C,GAAQ9C,EAEjB,OAAO,EAGF,SAASgD,EAAiBpC,GAC/B,YAD0C,IAAXA,MAAcX,OACzCwB,EAAUb,IACL,kBAAkBF,KAAKE,KAAQY,EAAYZ,GAK/C,SAASqC,IACd,QAAI/C,OAAOgD,SAASC,cAIbC,QACLlD,OAAOC,WACLD,OAAOC,UAAUE,WACjB,mBAAmBK,KAAKR,OAAOC,UAAUE,YAIxC,SAASgD,IACd,IAAMC,EAAQpD,OAAOgD,SAASK,cAC5B,sCAEIC,EAAWtD,OAAOgD,SAASK,cAAc,2BAC/C,SAAID,IAASE,GAMR,SAASC,IACd,QACqB,oBAAZC,UACPA,QAAQC,WACRD,QAAQC,SAASC,UAOd,SAASC,IAGd,GAAI3D,OAAOgD,SAASC,aAClB,IACE,IAAMW,EAAS5D,OAAO4D,OAItB,OAFA5D,OAAO4D,OAAS,mBAEM,qBAAlB5D,OAAO4D,SACT5D,OAAO4D,OAASA,GAET,GAIT,MAAOC,GACP,OAAO,EAIX,OAAO,EAGF,SAASC,IACd,IAAM3D,EAAYJ,IAClB,MAAO,sCAAsCS,KAAKL,GAG7C,SAAS4D,EAAerD,GAC7B,YADwC,IAAXA,MAAcX,OAEzCU,EAAUC,IACVmB,EAAanB,IACboC,EAAiBpC,IACjBY,EAAYZ,IACZU,EAAaV,IACbc,EAAiBd,IACjBW,EAAUX,IACVK,EAAkBL,IAClBkB,EAAYlB,IACZ6C,KACAO,KACAnD,KAIG,SAASqD,EAAStD,GACvB,YADkC,IAAXA,MAAcX,KAEnC,wBAAwBS,KAAKE,KAAQ,2BAA2BF,KAAKE,GAIlE,SAASuD,EAASvD,GACvB,YADkC,IAAXA,MAAcX,KAC9B,SAASS,KAAKE,KAAQsD,EAAStD,KAAQ,oBAAoBF,KAAKE,GAGlE,SAASwD,EAASxD,GAGvB,YAHkC,IAAXA,MAAcX,OAGhC,cAAcS,KAAKE,MAClB,OAAOF,KAAKE,IAAQuD,EAASvD,IAAOT,UAAUkE,gBAAkB,IAOjE,SAASC,IACd,IACE,GACEpE,OAAOqE,iBACPrE,OAAOqE,gBAAgBC,gBAAgB,IACvCtE,OAAOqE,gBAAgBE,kBAEvB,OAAO,EAET,MAAOC,GACP,OAAO,EAGT,OAAO,EAGF,SAASC,EAA2BC,GACzC,OAA8D,IAAvD1E,OAAOgD,SAAS2B,OAAOjC,QAAQgC,GC3SzB,SAASE,EAAgBxG,EAAGoB,GAMzC,OALAoF,EAAkBvG,OAAOwG,gBAAkB,SAAyBzG,EAAGoB,GAErE,OADApB,EAAE0G,UAAYtF,EACPpB,IAGcA,EAAGoB,GCLb,SAASuF,EAAeC,EAAUC,GAC/CD,EAASE,UAAY7G,OAAOY,OAAOgG,EAAWC,WAC9CF,EAASE,UAAUC,YAAcH,EACjCH,EAAeG,EAAUC,GCJZ,SAASG,IAetB,OAdAA,EAAW/G,OAAOgH,QAAU,SAAUC,GACpC,IAAK,IAAI3H,EAAI,EAAGA,EAAI4H,UAAUC,OAAQ7H,IAAK,CACzC,IAAI8H,EAASF,UAAU5H,GAEvB,IAAK,IAAIuB,KAAOuG,GACVpH,IAAiBkB,eAAezB,KAAK2H,EAAQvG,KAC/CoG,EAAOpG,GAAOuG,EAAOvG,IAK3B,OAAOoG,IAGOI,MAAMnI,KAAMgI,WCbvB,SAASI,EAAUC,GACtB,IACI,IAAKA,EACD,OAAO,EAGX,GAAuB,oBAAZC,SAA2BD,aAAgBC,QAClD,OAAO,EAGX,GAAsB,oBAAX7F,QAAmD,mBAAlBA,OAAO8F,QAAyBF,aAAgB5F,OAAO8F,OAC/F,OAAO,EAGX,GAAsB,oBAAX9F,QAAwD,mBAAvBA,OAAOmF,aAA8BS,aAAgB5F,OAAOmF,YACpG,OAAO,EAGX,IAAMY,EAAY,GAAIA,SAEtB,GAAIA,EAAU,CACV,IAAM7H,EAAO6H,EAASjI,KAAK8H,GAE3B,GAAa,oBAAT1H,GAAuC,oBAATA,GAAuC,uBAATA,EAC5D,OAAO,EAIf,GAAyB,mBAAd0H,EAAKI,KACZ,OAAO,EAEb,MAAOnC,GACL,OAAO,EAGX,OAAO,ECjCX,ICCIoC,EDDEC,EAAmB,GACnBC,EAA4F,GCD9FC,EAAc,EAGlB,SAASC,IACL,IAAKD,GAAeH,EAAc,CAC9B,IAAMK,EAAUL,EAChBA,EAAe,KACfK,EAAQC,WAIT,SAASC,IACZJ,GAAe,EAGZ,SAASK,IACZL,GAAe,EACfC,ICdG,IAAMK,EAAY,WAgBrB,SAAAA,EAAYC,GAAuF,IAAAC,EAAA,KAQ/F,GAR+F,KAdnGC,cAAQ,OACRC,cAAQ,OACRC,kBAAY,OACZnI,WAAK,OACLoI,WAAK,OAELC,cAAQ,OAKRC,iBAAW,OACXC,WAAK,EAID5J,KAAKsJ,UAAW,EAChBtJ,KAAKuJ,UAAW,EAChBvJ,KAAKwJ,cAAe,EAEpBxJ,KAAK0J,SAAW,GAEZN,EAAS,CAET,IAAIS,EACAJ,EACAH,GAAW,EACXC,GAAW,EACXO,GAAU,EAEdb,IAEA,IACIG,GAAQ,SAAAW,GACAD,EACAT,EAAKL,QAAQe,IAEbT,GAAW,EACXO,EAASE,MAGd,SAAAzD,GACKwD,EACAT,EAAKW,OAAO1D,IAEZiD,GAAW,EACXE,EAAQnD,MAIlB,MAAOA,GAGL,OAFA4C,SACAlJ,KAAKgK,OAAO1D,GAIhB4C,IAEAY,GAAU,EAENR,EAEAtJ,KAAKgJ,QAAQa,GACNN,GACPvJ,KAAKgK,OAAOP,IAWvB,IAAAQ,EAAAd,EAAAxB,UAwXA,OAxXAsC,EAEDjB,QAAA,SAAQa,GACJ,GAAI7J,KAAKsJ,UAAYtJ,KAAKuJ,SACtB,OAAOvJ,KAGX,GAAIoI,EAAUyB,GACV,MAAM,IAAIK,MAAM,gDAOpB,OAJAlK,KAAKsJ,UAAW,EAChBtJ,KAAKqB,MAAQwI,EACb7J,KAAKmK,WAEEnK,MACViK,EAEDD,OAAA,SAAOP,GAAiC,IAAAW,EAAA,KACpC,GAAIpK,KAAKsJ,UAAYtJ,KAAKuJ,SACtB,OAAOvJ,KAGX,GAAIoI,EAAUqB,GACV,MAAM,IAAIS,MAAM,+CAGpB,IAAKT,EAAO,CAER,IAAMnD,EAAOmD,GAAmC,mBAAnBA,EAAMjB,SAA0BiB,EAAMjB,WAAa1H,GAAiB0H,SAASjI,KAAKkJ,GAC/GA,EAAQ,IAAIS,MAAM,gDAAiD5D,GAgBvE,OAbAtG,KAAKuJ,UAAW,EAChBvJ,KAAKyJ,MAAQA,EAERzJ,KAAKwJ,cACNa,YAAW,WACFD,EAAKZ,cFnHnB,SAA2ClD,EAAayC,GAE3D,IAAuC,IAAnCJ,EAAiBxD,QAAQmB,GAA7B,CAIAqC,EAAiB2B,KAAKhE,GAEtB+D,YAAW,WAMP,MAAM/D,IACP,GAEH,IAAK,IAAIiE,EAAI,EAAGA,EAAI3B,EAAiCX,OAAQsC,IAEzD3B,EAAiC2B,GAAGjE,EAAKyC,IEiG7ByB,CAA+Bf,EAAOW,KAE3C,GAGPpK,KAAKmK,WAEEnK,MACViK,EAEDQ,YAAA,SAAYhB,GAGR,OAFAzJ,KAAKwJ,cAAe,EACpBxJ,KAAKgK,OAAOP,GACLzJ,MACViK,EAEDE,SAAA,WAEI,IAAqBb,EAAiCtJ,KAAjCsJ,SAAUC,EAAuBvJ,KAAvBuJ,SAAUG,EAAa1J,KAAb0J,SAEzC,IAFsD1J,KAA9C2J,cAMHL,GAAaC,GAAlB,CAIAvJ,KAAK2J,aAAc,EACnBV,IAUA,IARA,IAAMyB,EAAQ,SAAIC,EAAgCC,GAC9C,OAAOD,EAAalC,MAAK,SAAAsB,GACrBa,EAAc5B,QAAQe,MACvB,SAAAzD,GACCsE,EAAcZ,OAAO1D,OAIpBlG,EAAI,EAAGA,EAAIsJ,EAASzB,OAAQ7H,IAAK,CAEtC,IAAAyK,EAAwCnB,EAAStJ,GAAzC0K,EAASD,EAATC,UAAWC,EAAOF,EAAPE,QAAShC,EAAO8B,EAAP9B,QAExBc,OAAM,EAEV,GAAIP,EAEA,IACIO,EAASiB,EAAYA,EAAU9K,KAAKqB,OAASrB,KAAKqB,MACpD,MAAOiF,GACLyC,EAAQiB,OAAO1D,GACf,cAGD,GAAIiD,EAAU,CAEjB,IAAKwB,EAAS,CACVhC,EAAQiB,OAAOhK,KAAKyJ,OACpB,SAGJ,IACII,EAASkB,EAAQ/K,KAAKyJ,OACxB,MAAOnD,GACLyC,EAAQiB,OAAO1D,GACf,UAIR,GAAIuD,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,UAAW,CACxE,IAAMyB,EAAkCnB,EAEpCmB,EAAc1B,SACdP,EAAQC,QAAQgC,EAAc3J,OAE9B0H,EAAQiB,OAAOgB,EAAcvB,OAGjCuB,EAAcxB,cAAe,OAEtBpB,EAAUyB,GAEbA,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,UACzDM,EAAOP,SACPP,EAAQC,QAAQa,EAAOxI,OAEvB0H,EAAQiB,OAAOH,EAAOJ,OAK1BiB,EAAMb,EAAQd,GAKlBA,EAAQC,QAAQa,GAIxBH,EAASzB,OAAS,EAClBjI,KAAK2J,aAAc,EACnBT,MACHe,EAEDxB,KAAA,SAAWqC,EAA0DC,GAEjE,GAAID,GAAkC,mBAAdA,IAA6BA,EAAUvK,KAC3D,MAAM,IAAI2J,MAAM,wDAGpB,GAAIa,GAA8B,mBAAZA,IAA2BA,EAAQxK,KACrD,MAAM,IAAI2J,MAAM,sDAGpB,IAAMnB,EAAU,IAAII,EAYpB,OAVAnJ,KAAK0J,SAASY,KAAK,CACfvB,UACA+B,YACAC,YAGJ/K,KAAKwJ,cAAe,EAEpBxJ,KAAKmK,WAEEpB,GACVkB,EAEDgB,MAAA,SAAYF,GAGR,OAD4C/K,KAAKyI,UAAKyC,EAAWH,IAEpEd,EAEDkB,QAAA,SAAQC,GAEJ,GAAIA,GAAkC,mBAAdA,IAA6BA,EAAU7K,KAC3D,MAAM,IAAI2J,MAAM,uCAGpB,OAAOlK,KAAKyI,MAAK,SAACoB,GACd,OAAOV,EAAakC,IAAID,GACnB3C,MAAK,WACF,OAAOoB,QAEhB,SAACvD,GACA,OAAO6C,EAAakC,IAAID,GACnB3C,MAAK,WACF,MAAMnC,SAGrB2D,EAEDqB,QAAA,SAAQC,EAAejF,GAAgC,IAAAkF,EAAA,KAEnD,GAAIxL,KAAKsJ,UAAYtJ,KAAKuJ,SACtB,OAAOvJ,KAGX,IAAMsL,EAAUjB,YAAW,WAEnBmB,EAAKlC,UAAYkC,EAAKjC,UAI1BiC,EAAKxB,OAAO1D,GAAO,IAAI4D,MAAM,2BAA4BqB,EAAI,SAE9DA,GAEH,OAAOvL,KAAKyI,MAAK,SAAAoB,GAEb,OADA4B,aAAaH,GACNzB,MAEdI,EAGDyB,UAAA,WAEI,GAAuB,oBAAZpD,QACP,MAAM,IAAIqD,UAAU,0BAGxB,OAAOrD,QAAQU,QAAQhJ,OAC1BiK,EAED2B,KAAA,WAEI,OADA5L,KAAKwJ,cAAe,EACbxJ,MACVmJ,EAEMH,QAAP,SAAqB3H,GAEjB,OAAIA,aAAiB8H,EAEoB9H,EAIrC+G,EAAU/G,GAEH,IAAI8H,GAAa,SAACH,EAASgB,GAAM,OAAK3I,EAAMoH,KAAKO,EAASgB,OAG9D,IAAIb,GAAeH,QAAQ3H,IACrC8H,EAEMa,OAAP,SAAcP,GACV,OAAO,IAAIN,GAAea,OAAOP,IACpCN,EAEMsB,YAAP,SAAmBhB,GACf,OAAO,IAAIN,GAAesB,YAAYhB,IACzCN,EAEM0C,IAAP,SAAsCC,GAElC,IAAM/C,EAAU,IAAII,EAChB4C,EAAQD,EAAS7D,OAEf+D,EAAW,GAAkDC,QAEnE,IAAKF,EAED,OADAhD,EAAQC,QAAQgD,GACTjD,EAeX,IAZA,IAAM2B,EAAQ,SAAItK,EAAYuK,EAAgCC,GAC1D,OAAOD,EAAalC,MAAK,SAAAsB,GACrBiC,EAAQ5L,GAAK2J,EAEC,IADdgC,GAAS,IAELhD,EAAQC,QAAQgD,MAErB,SAAA1F,GACCsE,EAAcZ,OAAO1D,OAIpBlG,EAAI,EAAGA,EAAI0L,EAAS7D,OAAQ7H,IAAK,CACtC,IAAM8L,EAAOJ,EAAS1L,GAEtB,GAAI8L,aAAgB/C,GAChB,GAAI+C,EAAK5C,SAAU,CACf0C,EAAQ5L,GAAK8L,EAAK7K,MAClB0K,GAAS,EACT,eAED,IAAK3D,EAAU8D,GAAO,CACzBF,EAAQ5L,GAAK8L,EACbH,GAAS,EACT,SAGJrB,EAAMtK,EAAG+I,EAAaH,QAAQkD,GAAOnD,GAOzC,OAJc,IAAVgD,GACAhD,EAAQC,QAAQgD,GAGbjD,GACVI,EAEMgD,KAAP,SAAwBL,GACpB,IAAMjC,EAAS,GACTuC,EAAgB,GAAGC,EAAA,SAAA1K,GAGrB,GAAImK,EAAS9J,eAAeL,GAAM,CAC9B,IAAMN,EAAQyK,EAASnK,GAEnByG,EAAU/G,GACV+K,EAAc9B,KAAKjJ,EAAMoH,MAAK,SAAAsB,GAC1BF,EAAOlI,GAAOoI,MAGlBF,EAAOlI,GAAON,IAT1B,IAAK,IAAMM,KAAOmK,EAAQO,EAAA1K,GAc1B,OAAOwH,EAAa0C,IAAIO,GAAe3D,MAAK,kBAAMoB,MACrDV,EAEMmD,IAAP,SAAiBC,EAA2BC,GAExC,OAAOrD,EAAa0C,IAAIU,EAAMD,IAAIE,KACrCrD,EAEMsD,6BAAP,SAAoCrD,GAChC,OFjYD,SAAsCA,GAGzC,OAFAR,EAAiC0B,KAAKlB,GAE/B,CACHsD,OAAM,WACF9D,EAAiC+D,OAAO/D,EAAiCzD,QAAQiE,GAAU,KE4XxFqD,CAA6BrD,IACvCD,EAEMkC,IAAP,SAAuDmB,EAAqEI,EAAcC,GAEtI,GAAIL,GAA4B,mBAAXA,IAA0BA,EAAOjM,KAClD,MAAM,IAAI2J,MAAM,mCAGpB,IAAIL,EAEJZ,IAEA,IACIY,EAAS2C,EAAOrE,MAAMyE,EAASC,GAAQ,IACzC,MAAOvG,GAEL,OADA4C,IACOC,EAAaa,OAAO1D,GAQ/B,OALA4C,IAGsBC,EAAaH,QAAQa,IAG9CV,EAEM2D,MAAP,SAAaA,GACT,OAAO,IAAI3D,GAAa,SAAAH,GACpBqB,WAAWrB,EAAS8D,OAE3B3D,EAEMf,UAAP,SAAiB/G,GAEb,SAAIA,GAASA,aAAiB8H,IAIvBf,EAAU/G,IACpB8H,EAEM4D,MAAP,WACI,ODlbEhE,EAAUL,EAAeA,GAAgB,ICkbxBS,EDjbvBL,IACOC,EAHJ,IACGA,GCmbLI,EArcoB,GCInB6D,EAAsB,mCAErB,SAASC,EAAkBC,GAChC,YADyD,IAAzBA,MAA4BzK,QACrDyK,EAAIC,SAASC,SAGf,SAASC,EAAYH,GAC1B,QADmD,IAAzBA,MAA4BzK,QAClDyK,EAAII,WAAY,CAClB,IAAMF,EAAWF,EAAII,WAAWC,MAAM,MAAM,GAE5C,GAAIH,EACF,OAAOA,EAIX,OAAOH,EAAkBC,GAOpB,SAASM,GAAgBN,GAC9B,YADuD,IAAzBA,MAA4BzK,QC5BlD,WD6BD4K,EAAYH,GA0Cd,SAASO,GACdP,GAEA,IAGE,OAAO,EACP,MAAO5G,IAIT,OAAO,EAGF,SAASoH,GAAgBR,QAA0B,IAA1BA,MAA6BzK,QAC3D,IAAM0K,EAAWD,EAAIC,SAErB,IAAKA,EACH,MAAM,IAAIjD,MAAM,gCAGlB,IAAMkD,EAAWH,EAAkBC,GAEnC,IAAKE,EACH,MAAM,IAAIlD,MAAM,gCAGlB,GCnGO,UDmGHkD,EACF,MAAUO,UAGZ,GCtGQ,WDsGJP,EAA6B,CAC/B,IAAMQ,EAnEH,SACLV,GAEA,QAF2B,IAA3BA,MAA8BzK,QAEzByK,EAIL,IACE,GAAIA,EAAIU,QAAUV,EAAIU,SAAWV,EAC/B,OAAOA,EAAIU,OAEb,MAAOtH,KAwDQuH,CAAUX,GACzB,OAAIU,GAAUH,KAELC,GAAgBE,GAGfD,WAGZ,IAAMG,EAAOX,EAASW,KAEtB,IAAKA,EACH,MAAM,IAAI5D,MAAM,4BAGlB,OAAUkD,EAAQ,KAAKU,EAGlB,SAASC,GAAUb,QAA0B,IAA1BA,MAA6BzK,QACrD,IAAMuL,EAASN,GAAgBR,GAE/B,OAAIc,GAAUd,EAAII,YAAwD,IAA1CJ,EAAII,WAAWnI,QC9HxC,SD+HE+H,EAAII,WAGNU,EAqEF,SAASC,GACdf,GAEA,IApDK,SAA8BA,GACnC,IACE,GAAIA,IAAQzK,OACV,OAAO,EAET,MAAO6D,IAIT,IACE,IAAM4H,EAAOpN,OAAOqN,yBAAyBjB,EAAK,YAElD,GAAIgB,IAA4B,IAApBA,EAAKlN,WACf,OAAO,EAET,MAAOsF,IAIT,IAEE,GAAIkH,GAAgBN,IAAQO,KAC1B,OAAO,EAET,MAAOnH,IAIT,IAEE,GAlJG,SAAwB4G,GAC7B,YADsD,IAAzBA,MAA4BzK,QClClD,UDmCA4K,EAAYH,GAiJbkB,CAAelB,IAAQO,KACzB,OAAO,EAET,MAAOnH,IAIT,IAEE,GAAIoH,GAAgBR,KAASQ,GAAgBjL,QAC3C,OAAO,EAET,MAAO6D,IAIT,OAAO,EAMF+H,CAAqBnB,GACxB,OAAO,EAGT,IACE,GAAIA,IAAQzK,OACV,OAAO,EAIT,GAAI+K,GAAgBN,IAAQO,KAC1B,OAAO,EAIT,GAAIM,GAAUtL,UAAYsL,GAAUb,GAClC,OAAO,EAET,MAAO5G,IAIT,OAAO,EA6QT,IAAMgI,GAAgB,GAChBC,GAAe,GAEd,SAASC,GACdtB,EACAuB,QAAkB,IAAlBA,OAAqB,GAErB,IACE,GAAIvB,IAAQzK,OACV,OAAO,EAET,MAAO6D,GACP,OAAO,EAGT,IACE,IAAK4G,EACH,OAAO,EAET,MAAO5G,GACP,OAAO,EAGT,IACE,GAAI4G,EAAIwB,OACN,OAAO,EAET,MAAOpI,GAGP,OAAIA,GAAOA,EAAIqI,UAAY3B,EAO7B,GAAIyB,GAAaR,GAAaf,GAC5B,IAEE,GAAIA,EAAI0B,WACN,OAAO,EAET,MAAOtI,IAOX,IACE,IAAK4G,EAAIU,SAAWV,EAAI2B,IACtB,OAAO,EAET,MAAOvI,IAeT,IAAMwI,EAnFR,SAAwBC,EAA+B1G,GACrD,IAAK,IAAIjI,EAAI,EAAGA,EAAI2O,EAAW9G,OAAQ7H,IACrC,IACE,GAAI2O,EAAW3O,KAAOiI,EACpB,OAAOjI,EAET,MAAOkG,IAKX,OAAQ,EAwEY0I,CAAYV,GAAepB,GAE/C,IAAqB,IAAjB4B,EAAoB,CACtB,IAAMG,EAAQV,GAAaO,GAE3B,GAAIG,GAnHD,SAA6BA,GAClC,IAAKA,EAAMC,cACT,OAAO,EAGT,IAAKD,EAAME,WACT,OAAO,EAGT,IAAMC,EAAMH,EAAMI,cAElB,GAAID,GAAOA,EAAIE,kBAAoBF,EAAIE,gBAAgBC,SAASN,GAAQ,CAGtE,IAFA,IAAIrB,EAASqB,EAENrB,EAAOuB,YAAcvB,EAAOuB,aAAevB,GAChDA,EAASA,EAAOuB,WAIlB,IAAKvB,EAAOE,OAASsB,EAAIE,gBAAgBC,SAAS3B,EAAOE,MACvD,OAAO,EAIX,OAAO,EA2FQ0B,CAAoBP,GAC/B,OAAO,EAIX,OAAO,EA+ZF,SAASQ,GAASC,GACvB,IACE,GAAIA,IAAQjN,OACV,OAAO,EAET,MAAO6D,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAIX,IAEE,GAA4C,oBAAxClM,GAAiB0H,SAASjI,KAAKmP,GACjC,OAAO,EAET,MAAOpJ,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAIX,IACE,GAAIvK,OAAO8F,QAAUmH,aAAejN,OAAO8F,OACzC,OAAO,EAET,MAAOjC,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAIX,IACE,GAAI0C,GAAOA,EAAI3P,OAAS2P,EACtB,OAAO,EAET,MAAOpJ,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAIX,IACE,GAAI0C,GAAOA,EAAI9B,SAAW8B,EACxB,OAAO,EAET,MAAOpJ,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAIX,IACE,GAAI0C,GAAOA,EAAIb,MAAQa,EACrB,OAAO,EAET,MAAOpJ,GACP,GAAIA,GAAOA,EAAIqI,UAAY3B,EACzB,OAAO,EAaX,IACE,GACE0C,GAC4C,uBAA5CA,EAAIC,oCAEJ,OAAO,EAET,MAAOrJ,GACP,OAAO,EAGT,IACE,GAAI,gBAAiBoJ,GAAO,SAAUA,GAAO,aAAcA,EACzD,OAAO,EAET,MAAOpJ,IAIT,OAAO,EEtjCF,SAAS0I,GAAeD,EAAgC1G,GAC3D,IAAK,IAAIjI,EAAI,EAAGA,EAAI2O,EAAW9G,OAAQ7H,IAEnC,IACI,GAAI2O,EAAW3O,KAAOiI,EAClB,OAAOjI,EAEb,MAAOkG,IAKb,OAAQ,ECPL,IAAMsJ,GAAsB,WAS/B,SAAAA,IAII,GAJU,KAPdjP,UAAI,OACJkP,aAAO,OAEPC,UAAI,OAEJC,YAAM,EAIF/P,KAAKW,KAAO,cAA8B,IAAhBgE,KAAKqL,WAAmB,GAAC,KChBpD,WAEH,GAAuB,oBAAZC,QACP,OAAO,EAGX,QAA6B,IAAlBnP,OAAOoP,OACd,OAAO,EAGX,IAEI,IAAMC,EAAc,IAAIF,QAClBG,EAAU,GAOhB,OAJAtP,OAAOoP,OAAOE,GAEdD,EAAYE,IAAID,EAJE,mCAMdD,EAAYlP,IAAImP,GAMtB,MAAO9J,GAEL,OAAO,GDVHgK,GACA,IACItQ,KAAK6P,QAAU,IAAII,QACrB,MAAO3J,IAKbtG,KAAK8P,KAAQ,GACb9P,KAAK+P,OAAS,GACjB,IAAA9F,EAAA2F,EAAAjI,UAkOA,OAlOAsC,EAEDsG,sBAAA,WAKI,IAHA,IAAMV,EAAU7P,KAAK6P,QACfC,EAAO9P,KAAK8P,KAET1P,EAAI,EAAGA,EAAI0P,EAAK7H,OAAQ7H,IAAK,CAClC,IAAMiB,EAAQyO,EAAK1P,GAEnB,GAAIqP,GAASpO,IAAUmN,GAAenN,GAAQ,CAE1C,GAAIwO,EACA,IACIA,EAAQW,OAAOnP,GACjB,MAAOiF,IAKbwJ,EAAKnD,OAAOvM,EAAG,GACfJ,KAAK+P,OAAOpD,OAAOvM,EAAG,GAEtBA,GAAK,KAGhB6J,EAEDwG,kBAAA,SAAkB9O,GAEd,OAAI8N,GAAS9N,IAYhBsI,EAEDoG,IAAA,SAAI1O,EAASN,GAET,IAAKM,EACD,MAAM,IAAIuI,MAAM,wBAGpB,IAAM2F,EAAU7P,KAAK6P,QAErB,GAAIA,EACA,IACIA,EAAQQ,IAAI1O,EAAKN,GACnB,MAAOiF,UACEtG,KAAK6P,QAIpB,GAAI7P,KAAKyQ,kBAAkB9O,GACvB,IACI,IAAMhB,EAAOX,KAAKW,KACZ+P,EAAQ/O,EAAIhB,GAWlB,YATI+P,GAASA,EAAM,KAAO/O,EACtB+O,EAAM,GAAKrP,EAEXP,OAAOC,eAAeY,EAAKhB,EAAM,CAC7BU,MAAU,CAAEM,EAAKN,GACjBsP,UAAU,KAMpB,MAAOrK,IAKbtG,KAAKuQ,wBAEL,IAAMT,EAAO9P,KAAK8P,KACZC,EAAS/P,KAAK+P,OACda,EAAQ5B,GAAYc,EAAMnO,IAEjB,IAAXiP,GACAd,EAAKxF,KAAK3I,GACVoO,EAAOzF,KAAKjJ,IAEZ0O,EAAOa,GAASvP,GAEvB4I,EAEDhJ,IAAA,SAAIU,GAEA,IAAKA,EACD,MAAM,IAAIuI,MAAM,wBAGpB,IAAM2F,EAAU7P,KAAK6P,QAErB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAIlP,GACZ,OAAOkO,EAAQ5O,IAAIU,GAGzB,MAAO2E,UACEtG,KAAK6P,QAIpB,GAAI7P,KAAKyQ,kBAAkB9O,GACvB,IACI,IAAM+O,EAAQ/O,EAAI3B,KAAKW,MAEvB,OAAI+P,GAASA,EAAM,KAAO/O,EACf+O,EAAM,QAGjB,EACF,MAAOpK,IAKbtG,KAAKuQ,wBAEL,IACMK,EAAQ5B,GADDhP,KAAK8P,KACcnO,GAEhC,IAAe,IAAXiP,EAIJ,OAAO5Q,KAAK+P,OAAOa,IACtB3G,EAEDuG,OAAA,SAAO7O,GAEH,IAAKA,EACD,MAAM,IAAIuI,MAAM,wBAGpB,IAAM2F,EAAU7P,KAAK6P,QAErB,GAAIA,EACA,IACIA,EAAQW,OAAO7O,GACjB,MAAO2E,UACEtG,KAAK6P,QAIpB,GAAI7P,KAAKyQ,kBAAkB9O,GACvB,IACI,IAAM+O,EAAQ/O,EAAI3B,KAAKW,MAEnB+P,GAASA,EAAM,KAAO/O,IACtB+O,EAAM,GAAKA,EAAM,QAAKxF,GAE5B,MAAO5E,IAKbtG,KAAKuQ,wBAEL,IAAMT,EAAO9P,KAAK8P,KACZc,EAAQ5B,GAAYc,EAAMnO,IAEjB,IAAXiP,IACAd,EAAKnD,OAAOiE,EAAO,GACnB5Q,KAAK+P,OAAOpD,OAAOiE,EAAO,KAEjC3G,EAED4G,IAAA,SAAIlP,GAEA,IAAKA,EACD,MAAM,IAAIuI,MAAM,wBAGpB,IAAM2F,EAAU7P,KAAK6P,QAErB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAIlP,GACZ,OAAO,EAEb,MAAO2E,UACEtG,KAAK6P,QAIpB,GAAI7P,KAAKyQ,kBAAkB9O,GACvB,IACI,IAAM+O,EAAQ/O,EAAI3B,KAAKW,MAEvB,SAAI+P,GAASA,EAAM,KAAO/O,GAK5B,MAAO2E,IAQb,OAHAtG,KAAKuQ,yBAGa,IADJvB,GAAYhP,KAAK8P,KAAMnO,IAExCsI,EAED6G,SAAA,SAASnP,EAASf,GACd,GAAIZ,KAAK6Q,IAAIlP,GAET,OAAO3B,KAAKiB,IAAIU,GAGpB,IAAMN,EAAQT,IAEd,OADAZ,KAAKqQ,IAAI1O,EAAKN,GACPA,GACVuO,EAzP8B,GEPpB,SAASmB,GAAgBlQ,GAItC,OAHAkQ,GAAkBjQ,OAAOwG,eAAiBxG,OAAOkQ,eAAiB,SAAyBnQ,GACzF,OAAOA,EAAE0G,WAAazG,OAAOkQ,eAAenQ,KAEvBA,GCJV,SAASoQ,KACtB,GAAuB,oBAAZC,UAA4BA,QAAQC,UAAW,OAAO,EACjE,GAAID,QAAQC,UAAUC,KAAM,OAAO,EACnC,GAAqB,mBAAVC,MAAsB,OAAO,EAExC,IAEE,OADAC,KAAK3J,UAAUa,SAASjI,KAAK2Q,QAAQC,UAAUG,KAAM,IAAI,iBAClD,EACP,MAAOrK,GACP,OAAO,GCPI,SAASsK,GAAWC,EAAQ3E,EAAM4E,GAc/C,OAZEF,GADEG,KACWR,QAAQC,UAER,SAAoBK,EAAQ3E,EAAM4E,GAC7C,IAAIE,EAAI,CAAC,MACTA,EAAErH,KAAKnC,MAAMwJ,EAAG9E,GAChB,IACI+E,EAAW,IADGC,SAASjQ,KAAKuG,MAAMqJ,EAAQG,IAG9C,OADIF,GAAOnK,EAAesK,EAAUH,EAAM9J,WACnCiK,IAIOzJ,MAAM,KAAMH,WCZjB,SAAS8J,GAAiBL,GACvC,IAAIM,EAAwB,mBAARC,IAAqB,IAAIA,SAAQ9G,EA8BrD,OA5BA4G,GAAmB,SAA0BL,GAC3C,GAAc,OAAVA,ICP0D,IAAzDI,SAASrJ,SAASjI,KDOiBkR,GCPRtM,QAAQ,iBDOQ,OAAOsM,EAEvD,GAAqB,mBAAVA,EACT,MAAM,IAAI9F,UAAU,sDAGtB,QAAsB,IAAXoG,EAAwB,CACjC,GAAIA,EAAOlB,IAAIY,GAAQ,OAAOM,EAAO9Q,IAAIwQ,GAEzCM,EAAO1B,IAAIoB,EAAOQ,GAGpB,SAASA,IACP,OAAOd,GAAUM,EAAOzJ,UAAWgJ,GAAehR,MAAM4H,aAW1D,OARAqK,EAAQtK,UAAY7G,OAAOY,OAAO+P,EAAM9J,UAAW,CACjDC,YAAa,CACXvG,MAAO4Q,EACPjR,YAAY,EACZ2P,UAAU,EACVuB,cAAc,KAGX5K,EAAe2K,EAASR,KAGTA,GEjCnB,ICqHHU,GDrHSC,GAAY,CACvBC,MAAO,GACPC,MAAO,IAGIC,GAAa,CACxBC,IAAK,YAGMC,GAAkB,GAGlBC,GACX,uCACWC,GAA4B,mBAC5BC,GAA8B,oBAC9BC,GACX,qDACWC,GAAyB,oBACzBC,GAA0B,CAAC,IAAK,KAChCC,GAAY,cCNlB,SAASC,GAAUC,GACxB,IAAIC,GAAS,EAEb,KACMD,aAAmBzQ,OAAO2Q,SAGhB,OAAZF,GACmB,iBAAZA,GACc,IAArBA,EAAQG,UACiB,iBAAlBH,EAAQI,OACkB,iBAA1BJ,EAAQ7D,iBANf8D,GAAS,GAUX,MAAOI,IAIT,OAAOJ,EAGF,SAASK,GAA6BC,GAC3C,OAAOA,EAAG9S,MAAQ8S,EAAGC,UAAYD,EAAGE,aAAe,YAG9C,SAASC,GAA6BH,EAAO9S,GAClD,WACS8S,EAAG9S,KACV8S,EAAG9S,KAAOA,EACV,MAAO2F,IAKT,OADAmN,EAAGC,SAAWD,EAAGE,YAAchT,EACxB8S,EAGF,SAASI,GAAaC,GAC3B,GAAoB,mBAATC,KACT,OAAOA,KACLC,mBAAmBF,GAAKG,QAAQ,mBAAmB,SAACzT,EAAG0T,GACrD,OAAOC,OAAOC,aAAaC,SAASH,EAAI,SAE1CD,QAAQ,OAAQ,IAGpB,GAAsB,oBAAXK,OACT,OAAOA,OAAOC,KAAKT,EAAK,QAAQtL,SAAS,UAAUyL,QAAQ,OAAQ,IAGrE,MAAM,IAAI/J,MAAM,sCAGX,SAASsK,GAAaV,GAC3B,GAAoB,mBAATW,KACT,OAAOC,mBAELC,GAAgBrI,IACb/L,KAAKkU,KAAKX,IAAM,SAACrT,GAEhB,MAAO,KAAO,KAAOA,EAAEmU,WAAW,GAAGpM,SAAS,KAAKyD,OAAO,MAE3D4I,KAAK,KAIZ,GAAsB,oBAAXP,OACT,OAAOA,OAAOC,KAAKT,EAAK,UAAUtL,SAAS,QAG7C,MAAM,IAAI0B,MAAM,sCAGX,SAAS4K,KACd,IAAMC,EAAQ,mBAYd,MAAO,OAVU,aAAad,QAAQ,MAAM,WAC1C,OAAOc,EAAMC,OAAOrQ,KAAKsQ,MAAMtQ,KAAKqL,SAAW+E,EAAM9M,YASjC,IANP4L,IACb,IAAIvC,MAAO4D,cAAcjJ,MAAM,GAAI,IAAIgI,QAAQ,IAAK,MAEnDA,QAAQ,gBAAiB,IACzBkB,cAKE,SAASC,KACd,GAAsB,oBAAX3S,OACT,OAAOA,OAET,GAAsB,oBAAX4S,OACT,OAAOA,OAET,GAA0B,oBAAfC,OACT,OAAOA,OAET,MAAM,IAAIpL,MAAM,mBAKX,SAASqL,GAAY7F,GAG1B,GAFAyC,GAAYA,IAAa,IAAIlC,GAG3BP,SAEgB,iBAARA,GAAmC,mBAARA,EAEnC,MAAM,IAAIxF,MAAM,kBAGlB,IAAIsL,EAAMrD,GAAUlR,IAAIyO,GAOxB,OALK8F,IACHA,SAAgB9F,EAAG,IAAIoF,KACvB3C,GAAU9B,IAAIX,EAAK8F,IAGdA,EAGT,SAASC,GAAiB5I,GACxB,IAEE,OAAO6I,KAAKC,UAAUhB,GAAgB1I,MAAM1L,KAAKsM,IAAO,SAAC+I,EAAQC,GAI/D,MAAmB,mBAARA,EACF,WAAWN,GAAYM,GAAI,IAKhC5C,GAAU4C,GACL,GAGFA,KAET,MAAOvP,GACP,MAAM,IAAI4D,MAAM,6DAIb,SAAS4L,KAEd,MAAO,GAST,IAOIC,GAAqB,EACrBC,GAA8B,EAE3B,SAASC,GACdzJ,EACA0J,QAAwB,IAAxBA,MAVO,IAYP,IAEIC,EACAC,EAHsDC,EAAPH,EAA3CI,qBAAa,IAAAD,GAAQA,EAAQE,EAAcL,EAApB3K,KAK3BiL,EAAeT,GACnBA,IAAsB,EAEtB,IAAMU,EAAmB,WAA0C,QAAAC,EAAA1O,UAAAC,OAAb4E,EAAI,IAAA8H,MAAA+B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ9J,EAAI8J,GAAA3O,UAAA2O,GAQxD,IAAIC,EASAC,EAhBAL,EAAeR,KACjBG,EAAc,KACdC,EAAY,KACZI,EAAeT,GACfA,IAAsB,GAOtBa,EAFEN,GACFF,EAAYA,GAAa,IAAInG,IACXa,SAAS9Q,KAAM8V,IAEzBK,EAAcA,GAAe,GAKvC,IACEU,EAAWpB,GAAc5I,GACzB,MAAAiK,GACA,OAAOtK,EAAOrE,MAAMnI,KAAMgI,WAG5B,IAAI+O,EAAcH,EAAMC,GAOxB,GALIE,GAAeR,GAAajF,KAAK0F,MAAQD,EAAYxL,KAAOgL,WACvDK,EAAMC,GACbE,EAAc,MAGZA,EACF,OAAOA,EAAY1V,MAGrB,IAAMkK,EAAO+F,KAAK0F,MACZ3V,EAAQmL,EAAOrE,MAAMnI,KAAMgI,WAIjC,OAFA4O,EAAMC,GAAY,CAAEtL,OAAMlK,SAEnBA,GAWT,OARAoV,EAAiBQ,MAAQ,WACvBd,EAAc,KACdC,EAAY,MAMPxC,GAFW6C,GAIbP,EAAQvV,MAAQ6S,GAAgBhH,IAAO,cAQvC,SAAS0K,GACd7O,GAGA,OAAOc,EAAaH,QAAQX,GAGvB,SAAS8O,GAEd3K,GAGA,IAAIoK,EAAQ,GAEZ,SAASQ,IAGU,QAAAC,EAAArP,UAAAqB,EAAA,KAAAiO,EAAAtP,UAAAC,OADd4E,EAAI,IAAA8H,MAAA2C,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1K,EAAI0K,GAAAvP,UAAAuP,GAEP,IAAM5V,EAAc8T,GAAc5I,GAElC,OAAI+J,EAAM5U,eAAeL,KAIzBiV,EAAMjV,GAAOwH,EAAakC,KAAI,kBAAMmB,EAAOrE,MAAMkB,EAAMrB,MAAYmD,SACjE,kBACSyL,EAAMjV,OALRiV,EAAMjV,GAgBjB,OAJAyV,EAAwBH,MAAQ,WAC9BL,EAAQ,IAGHhD,GACLwD,EACG5D,GAAgBhH,GAAO,qBAavB,SAASgL,GAEdhL,EACA0J,GAGA,SAASuB,IACP,OAAOtO,EAAakC,IAAImB,EAAQxM,KAAMgI,WAOxC,YAXyB,IAAzBkO,MANO,IAaHA,EAAQvV,OACV8W,EAAoB9D,YAAiBuC,EAAQvV,KAAI,gBAG5CiT,GACL6D,EACGjE,GAAgBhH,GAAO,iBAIvB,SAASkL,GAEdlL,EAEAmL,EAEA9K,QAAyB,IAAzBA,MAA4B,IAG5B,IAAM+J,EAA4BpK,EAAOoL,yBAEvCpL,EAAOoL,0BAA4B,GAC/BjW,EAAM8T,GAAc5I,GAE1B,OAAI+J,EAAM5U,eAAeL,GAChBiV,EAAMjV,GAGCiV,EAAMjV,GAAOgW,EAAKxP,WAAC,EAAG0E,GAMjC,SAASgL,MAIT,SAASC,GAAKtL,GACnB,IAAIuL,GAAS,EASb,OAAOnE,IAPc,WACnB,IAAKmE,EAEH,OADAA,GAAS,EACFvL,EAAOrE,MAAMnI,KAAMgI,aAIUwL,GAAgBhH,GAAO,UAG1D,SAASwL,GAAQlE,GAEtB,IADA,IAAI3H,EAAO,EACF/L,EAAI,EAAGA,EAAI0T,EAAI7L,OAAQ7H,IAC9B+L,GAAQ2H,EAAI1T,GAAGwU,WAAW,GAAKjQ,KAAKsT,IAAK7X,EAAI,GAAM,EAAG,GAExD,OAAOuE,KAAKsQ,MAAMtQ,KAAKsT,IAAItT,KAAKuT,KAAK/L,GAAO,IAGvC,SAASgM,GAAWrE,GAGzB,IAFA,IAAI3H,EAAO,GAEF/L,EAAI,EAAGA,EAAI0T,EAAI7L,OAAQ7H,IAAK,CACnC,IAAIgY,EAAQtE,EAAI1T,GAAGwU,WAAW,GAAKxU,EAE/B0T,EAAI1T,EAAI,KACVgY,GAAStE,EAAI1T,EAAI,GAAGwU,WAAW,IAAMxU,EAAI,IAG3C+L,GAAQgI,OAAOC,aAAa,GAAMzP,KAAK0T,IAAID,GAAS,IAGtD,OAAOjM,EAGF,SAASpJ,GAAM+Q,EAAawE,GACjC,IAAMC,EAAWzE,EAAI/Q,MAAMuV,GAC3B,GAAIC,EACF,OAAOA,EAAS,GAIb,SAASC,GAAmB9I,EAAa/N,GAC9C,OAAO,IAAIwH,GAAa,SAACH,GACvB,IAAI3H,EAAQqO,EAAI/N,GAEhB,GAAIN,EACF,OAAO2H,EAAQ3H,UAGVqO,EAAI/N,GAEXb,OAAOC,eAAe2O,EAAK/N,EAAK,CAC9BuQ,cAAc,EAEd7B,IAAG,SAAChI,IACFhH,EAAQgH,IAGNW,EAAQ3H,IAIZJ,IAAG,WACD,OAAOI,QAMR,SAASoX,GAAenS,EAAYoS,GACzC,QADsD,IAAbA,MAAgB,GACrDA,GAAS,EACX,MAAO,gCAGT,IACE,IAAKpS,EAEH,MAAO,mBAAmBxF,GAAiB0H,SAASjI,KAAK+F,GAAI,IAG/D,GAAmB,iBAARA,EACT,OAAOA,EAGT,GAAIA,aAAe4D,MAAO,CACxB,IAAMN,EAAQtD,GAAOA,EAAIsD,MACnB+E,EAAUrI,GAAOA,EAAIqI,QAE3B,GAAI/E,GAAS+E,EACX,OAAgC,IAA5B/E,EAAMzE,QAAQwJ,GACT/E,EAEG+E,EAAO,KAAK/E,EAEnB,GAAIA,EACT,OAAOA,EACF,GAAI+E,EACT,OAAOA,EAIX,OAAIrI,GAAOA,EAAIkC,UAAoC,mBAAjBlC,EAAIkC,SAE7BlC,EAAIkC,WAIN1H,GAAiB0H,SAASjI,KAAK+F,GACtC,MAAOqS,GACP,MAAO,mCAAmCF,GACxCE,EACAD,EAAQ,IAKP,SAASE,GAAsBtS,GAEpC,IAAMuS,EAAiB,mBAAmB/X,GAAiB0H,SAASjI,KAClE+F,GACD,IAED,OAAKA,EAIDA,aAAe4D,MACV5D,EAAIqI,SAAWkK,EAGG,iBAAhBvS,EAAIqI,SACNrI,EAAIqI,SAGNkK,EAXEA,EAcJ,SAASlD,GAAUtN,GACxB,MAAoB,iBAATA,EACFA,EAGLA,GAAQA,EAAKG,UAAqC,mBAAlBH,EAAKG,SAEhCH,EAAKG,WAIP1H,GAAiB0H,SAASjI,KAAK8H,GAGjC,SAASyQ,GAAcC,EAAkB/K,GAE9C,IAAM4C,GADNmI,EAAWA,EAASxL,MAAM,OAAO,IACVpI,QAAQ6I,GAC/B,OAAkB,IAAX4C,GAAgBmI,EAAS9M,MAAM2E,KAAW5C,EAG5C,SAASgL,GAAYtJ,EAAa/O,EAAcyI,GACrD,IAAM6P,EAAWvJ,EAAI/O,GAErB+O,EAAI/O,GAAQ,WAAgC,IAAAuY,EAAAlR,UAAAoC,EAAA,KAC1C,OAAOhB,EAAQ,CACbwD,QAAS5M,KAET6M,KAAM8H,GAAgB1I,MAAM1L,KAAKyH,WACjCiR,WACAE,aAAc,WAAF,OAAQF,EAAS9Q,MAAMiC,EAAMpC,OAKxC,SAASoR,GAA6B1J,EAAQxH,GACnD,IAAKA,EACH,OAAOwH,EAGT,GAAI5O,OAAOgH,OACT,OAAOhH,OAAOgH,OAAO4H,EAAKxH,GAG5B,IAAK,IAAMvG,KAAOuG,EACZA,EAAOlG,eAAeL,KACxB+N,EAAI/N,GAAOuG,EAAOvG,IAItB,OAAO+N,EAGF,SAASK,GAAUL,GACxB,GAAI5O,OAAOiP,OAET,OAAOjP,OAAOiP,OAAOL,GAGvB,IAAM7F,EAAmB,GACzB,IAAK,IAAMlI,KAAO+N,EACZA,EAAI1N,eAAeL,IAErBkI,EAAOS,KAAKoF,EAAI/N,IAKpB,OAAOkI,EAvTToM,GAAQoD,MAAQ,WACdrD,GAA8BD,IA0TzB,IAAMuD,GACXrD,GAAQlG,IAEH,SAASwJ,GAAKC,EAAgBC,GACnC,OAAO9U,KAAKC,MAAO4U,EAASC,EAAc,KAGrC,SAASC,KACd,OAAO/U,KAAK+U,IAAGvR,MAARxD,KAAIqD,WAGN,SAAS2R,KACd,OAAOhV,KAAKgV,IAAGxR,MAARxD,KAAIqD,WAGN,SAAS4R,GAAQC,EAAaC,GACnC,IAAMC,EAAYF,EAAMC,EACxB,OAAOC,EAAYF,EAAME,EAAYD,EAAUD,EAG1C,SAASG,GACdlG,EACAmG,EACA7Q,GAEA,IAAM4C,EAAU,GAQhB,OALA8H,EAAIG,QAAQgG,GAAQ,SAAyB5R,GAC3C2D,EAAQ1B,KAAKlB,EAAUA,EAAQjB,MAAM,KAAMH,WAAaK,MAInD2D,EAGF,SAASkO,GAAYC,GAC1B,MAAO,6BAA6BtG,GAAasG,GAG5C,SAASC,GACd1K,EACA2K,QAA8B,IAA9BA,MAAiC1U,SAEjC,IAAMkE,EAAS,GAEf,IAAK,IAAMlI,KAAO+N,EACXA,EAAI1N,eAAeL,IAAS0Y,EAAO3K,EAAI/N,GAAMA,KAIlDkI,EAAOlI,GAAO+N,EAAI/N,IAGpB,OAAOkI,EAGF,SAASyQ,GAAYjS,GAC1B,OAAOA,EAGF,SAASkS,GACdC,EACAP,GAEA,IAAMpQ,EAAS,GAKf,OAJA2Q,EAAKvG,QAAQgG,GAAQ,SAACQ,GAEpB,OADA5Q,EAAOS,KAAKmQ,GACL,MAEF5Q,EAGF,SAAS6Q,GACdlO,EACAM,GAEA,IAAI/D,EACAuC,EA0BJ,YA7Ba,IAAbwB,MAAgB,IA6BT8G,IAxBkB,WACnBtI,GACFG,aAAaH,GAGf,IAAMqP,EAAgB5R,EAAUA,GAAW,IAAII,EAgB/C,OAdAmC,EAAUjB,YAAW,WACnBtB,EAAU,KACVuC,EAAU,KAEVnC,EAAakC,IAAImB,GAAQ/D,MACvB,SAACoB,GACC8Q,EAAa3R,QAAQa,MAEvB,SAACvD,GACCqU,EAAa3Q,OAAO1D,QAGvBwG,GAEI6N,IAKJnH,GAAgBhH,GAAO,sBAIvB,SAASoO,GACdpO,EACAjB,GAEA,IAAID,EAWJ,OATA,SAASuP,IACPvP,EAAUjB,YAAW,WACnBmC,IACAqO,MACCtP,GAGLsP,GAEO,CACLnO,OAAM,WACJjB,aAAaH,KAKZ,SAASwP,GAAUhH,GACxB,OAAOnO,QAAQmO,EAAI/Q,MAAM,aAGpB,SAASgY,GAAQjH,GACtB,OAAOnO,QAAQmO,EAAI/Q,MAAM,qBAGpB,SAASiY,GAAmB3Z,GACjC,OAAOA,EAAMmH,WAGR,SAASyS,GAAqB5Z,GACnC,MAAc,SAAVA,GAEiB,UAAVA,IAEAyZ,GAAUzZ,GACZgT,SAAShT,EAAO,IACd0Z,GAAQ1Z,GACV6Z,WAAW7Z,GAEXA,GAIJ,SAAS8Z,GACdzL,EACA0L,EACAC,GAGA,IAAK,IAAM1Z,UAJG,IAAdyZ,MAAiB,SACH,IAAdC,MAAiB,IAEjBD,EAASA,EAAYA,EAAM,IAAMA,EACf1L,EAEbA,EAAI1N,eAAeL,IAApB,MACA+N,EAAI/N,IAEgB,mBAAb+N,EAAI/N,KAIX+N,EAAI/N,IACJgT,MAAM2G,QAAQ5L,EAAI/N,KAClB+N,EAAI/N,GAAKsG,QACTyH,EAAI/N,GAAK4Z,OAAM,SAAC1F,GAAG,MAAoB,iBAARA,KAE/BwF,EAAO,GAAGD,EAASzZ,EAAG,MAAQ+N,EAAI/N,GAAKkT,KAAK,KACnCnF,EAAI/N,IAA4B,iBAAb+N,EAAI/N,GAChC0Z,EAASF,GAAOzL,EAAI/N,GAAM,GAAGyZ,EAASzZ,EAAO0Z,GAE7CA,EAAO,GAAGD,EAASzZ,GAASqZ,GAAmBtL,EAAI/N,KAGvD,OAAO0Z,EAGF,SAASG,GAAS9L,GACvB,IAAM7F,EAAS,GAEf,IAAK,IAAIlI,KAAO+N,EACd,GAAKA,EAAI1N,eAAeL,IAA4B,iBAAb+N,EAAI/N,GAA3C,CAIA,IAAIN,EAAQqO,EAAI/N,GAEZA,EAAIoB,MAAM,aACZpB,EAAMA,EAAIsK,MAAM,GAAI,GACpB5K,EAAQA,EAAMkM,MAAM,KAAKjB,IAAI2O,KAE7B5Z,EAAQ4Z,GAAqB5Z,GAK/B,IAFA,IAAIoa,EAAY5R,EACV6R,EAAQ/Z,EAAI4L,MAAM,KACfnN,EAAI,EAAGA,EAAIsb,EAAMzT,OAAQ7H,IAAK,CACrC,IAAMub,EAAOD,EAAMtb,GACbwb,EAASxb,EAAI,IAAMsb,EAAMzT,OACzB4T,GAAWD,GAAUd,GAAUY,EAAMtb,EAAI,IAE/C,GACW,gBAATub,GACS,cAATA,GACS,cAATA,EAEA,MAAM,IAAIzR,MAAM,mBAAmByR,GAGjCC,EAEFH,EAAUE,GAAQta,EAGlBoa,EAAYA,EAAUE,GAAQF,EAAUE,KAAUE,EAAU,GAAK,KAKvE,OAAOhS,EAiBF,SAASiS,KACd,IAAMC,EAAY,GACdrS,EAAW,GAETsS,EAAU,CACdC,GAAE,SAACC,EAAmB9S,GACpB,IAAM+S,EAAezS,EAASwS,GAAaxS,EAASwS,IAAc,GAElEC,EAAY7R,KAAKlB,GAEjB,IAAIgT,GAAY,EAEhB,MAAO,CACL1P,OAAM,WACC0P,IACHA,GAAY,EACZD,EAAYxP,OAAOwP,EAAYhX,QAAQiE,GAAU,OAMzD0O,KAAI,SAACoE,EAAmB9S,GACtB,IAAMiT,EAAWL,EAAQC,GAAGC,GAAW,WACrCG,EAAS3P,SACTtD,OAGF,OAAOiT,GAGTC,QAAO,SACLJ,GAEoB,QAAAK,EAAAvU,UAAAC,OADjB4E,EAAI,IAAA8H,MAAA4H,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ3P,EAAI2P,EAAA,GAAAxU,UAAAwU,GAEP,IAAML,EAAczS,EAASwS,GACvBpQ,EAAW,GAEjB,GAAIqQ,EAGD,IAHc,IAAA9P,EAAA,WACV,IAAMjD,EAAW+S,EAAWM,GAC/B3Q,EAASxB,KAAKnB,EAAakC,KAAI,kBAAMjC,EAAOjB,WAAC,EAAG0E,QACjD4P,EAAA,EAAAA,EAFqBN,EAAWlU,OAAAwU,IAAApQ,IAKnC,OAAOlD,EAAa0C,IAAIC,GAAUrD,KAAKoP,KAGzC6E,YAAW,SACTR,GAGA,GAAIH,EAAUG,GACZ,OAAO/S,EAAaH,UAGtB+S,EAAUG,IAAa,EAAK,QAAAS,EAAA3U,UAAAC,OANzB4E,EAAI,IAAA8H,MAAAgI,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ/P,EAAI+P,EAAA,GAAA5U,UAAA4U,GAOP,OAAOZ,EAAQM,QAAOnU,MAAf6T,EAAO,CAASE,GAASW,OAAKhQ,KAGvCoK,MAAK,WACHvN,EAAW,KAIf,OAAOsS,EAGF,SAASc,GAAiBC,GAC/B,OAAOA,EAAO9I,QAAQ,YAAY,SAAC+I,GACjC,MAAO,IAAIA,EAAE7H,iBAIV,SAAS8H,GAAiBF,GAC/B,OAAOA,EAAO9I,QAAQ,aAAa,SAAC+I,GAClC,OAAOA,EAAE,GAAGE,iBAIT,SAASC,GAAsBJ,GACpC,OAAOA,EAAO/H,OAAO,GAAGkI,cAAgBH,EAAO9Q,MAAM,GAAGkJ,cAGnD,SAASlU,GAAIoH,EAAc+U,EAAcC,GAC9C,IAAKD,EACH,OAAOC,EAOT,IAJA,IAAMC,EAAYF,EAAK7P,MAAM,KAIpBnN,EAAI,EAAGA,EAAIkd,EAAUrV,OAAQ7H,IAAK,CAEzC,GAAoB,iBAATiI,GAA8B,OAATA,EAK9B,OAAOgV,EAJPhV,EAAOA,EAAKiV,EAAUld,IAU1B,YAAgB8K,IAAT7C,EAAqBgV,EAAMhV,EAG7B,SAASkV,GAAY/Q,EAAkBjB,GAC5C,IAAMiS,EAAW5C,IAAa,YAC5BrP,GAAQ,MACI,IACViS,EAAS9Q,SACTF,OAED,KAGE,SAASiR,GACd/N,EACA/N,EACAf,GAEA,GAAI+T,MAAM2G,QAAQ5L,IAChB,GAAmB,iBAAR/N,EACT,MAAM,IAAIgK,UAAU,iCAEjB,GAAmB,iBAAR+D,GAA4B,OAARA,GACjB,iBAAR/N,EACT,MAAM,IAAIgK,UAAU,6BAIxB7K,OAAOC,eAAe2O,EAAK/N,EAAK,CAC9BuQ,cAAc,EACdlR,YAAY,EACZC,IAAK,kBAEIyO,EAAI/N,GACX,IAAMN,EAAQT,IAGd,OADA8O,EAAI/N,GAAON,EACJA,GAETgP,IAAK,SAAChP,UAEGqO,EAAI/N,GAEX+N,EAAI/N,GAAON,KAMV,SAASqc,GAAarV,GAE3B,MAAOsM,GAAgB1I,MAAM1L,KAAK8H,GAG7B,SAASsV,GAAStV,GACvB,MAAuB,iBAATA,GAA8B,OAATA,EAG9B,SAASuV,GAAelO,GAC7B,OAEEiO,GAASjO,IAAgD,oBAAxC5O,GAAiB0H,SAASjI,KAAKmP,GAI7C,SAASmO,GAAcnO,GAC5B,IAAKkO,GAAelO,GAClB,OAAO,EAIT,IAAM9H,EAAc8H,EAAI9H,YAExB,GAA2B,mBAAhBA,EACT,OAAO,EAGT,IAAMD,EAAYC,EAAYD,UAE9B,QAAKiW,GAAejW,MAIfA,EAAU3F,eAAe,iBAOzB,SAAS8b,GACdzV,EACA0V,EACAC,GAEA,QAFe,IAAfA,MAAkB,IAEdrJ,MAAM2G,QAAQjT,GAAO,CAIvB,IAHA,IAAMJ,EAASI,EAAKJ,OACd4B,EAAuB,GAAGoU,EAAA,SAAA7d,GAG9Bqd,GAAe5T,EAAQzJ,GAAG,WACxB,IAAM8d,EAAUF,EAAaA,EAAO,IAAI5d,EAAC,GAAQA,EAG7C+d,EAAQJ,EAFD1V,EAAKjI,GAESA,EAAG8d,GAO5B,OALIL,GAAcM,IAAUxJ,MAAM2G,QAAQ6C,MAExCA,EAAQL,GAAcK,EAAOJ,EAAUG,IAGlCC,MAZF/d,EAAI,EAAGA,EAAI6H,EAAQ7H,IAAG6d,EAAA7d,GAiB/B,OAAOyJ,EACF,GAAIgU,GAAcxV,GAAO,CAC9B,IAAMwB,EAAS,GAAGuU,EAAA,SAAAzc,GAGhB,IAAK0G,EAAKrG,eAAeL,GAAM,SAI/B8b,GAAe5T,EAAQlI,GAAK,WAC1B,IAAMuc,EAAUF,EAAaA,EAAO,IAAIrc,EAAG,GAAQA,EAI/Cwc,EAAQJ,EAFD1V,EAAK1G,GAESA,EAAKuc,GAO9B,OALIL,GAAcM,IAAUxJ,MAAM2G,QAAQ6C,MAExCA,EAAQL,GAAcK,EAAOJ,EAAUG,IAGlCC,MAjBX,IAAK,IAAMxc,KAAO0G,EAAI+V,EAAAzc,GAsBtB,OAAOkI,EAEP,MAAM,IAAIK,MAAM,2BAIb,SAASmU,GACdnW,EACAH,EACApH,EACA0c,GAEA,GAAInV,EAAOlG,eAAerB,GAAO,CAC/B,IAAM2d,EAAaxd,OAAOqN,yBAAyBjG,EAAQvH,GAE3DG,OAAOC,eAAegH,EAAQpH,EAAM2d,QAEpCvW,EAAOpH,GAAQ0c,EAaZ,SAASkB,GACdjG,EACAyE,EACAyB,QAAa,IAAbA,MAAgB,GAEO,iBAAZlG,IAETA,EAAU,IAAImG,OAAOnG,IAGvB,IAAMzO,EAASkT,EAAO9Q,MAAMuS,GAAOzb,MAAMuV,GAEzC,GAAKzO,EAAL,CAKA,IAAM+G,EAAgB/G,EAAO+G,MACvB2H,EAAW1O,EAAO,GAExB,MAAO,CACL2Q,KAAMjC,EACNmG,OAAQ7U,EAAOoC,MAAM,GACrBuS,MAAOA,EAAQ5N,EACf+N,IAAKH,EAAQ5N,EAAQ2H,EAAStQ,OAC9BA,OAAQsQ,EAAStQ,OAEjBgM,QAAO,SAACuG,GACN,OAAKjC,EAIE,GAAGA,EAAStM,MAAM,EAAGuS,EAAQ5N,GAAS4J,EAAOjC,EAAStM,MAC3D2E,EAAQ2H,EAAStQ,QAJV,MAUR,SAAS2W,GACdtG,EACAyE,GAMA,IAJA,IAAMxZ,EAAU,GACZib,EAAQ,IAGC,CACX,IAAMjG,EAAWgG,GAAMjG,EAASyE,EAAQyB,GAExC,IAAKjG,EACH,MAGFhV,EAAQ+G,KAAKiO,GACbiG,EAAQzb,GAAM4b,IAGhB,OAAOpb,EAGF,SAASsb,GAAUxd,GACxB,OAAOA,QAGF,SAASyd,GAAMtS,GACpB,OAAOrD,EAAakC,IAAImB,GAAQ/D,MAAK,kBAAMqW,GAAMtS,MAG5C,SAASuS,GACdvS,EACAjB,GAEA,IAAID,EAUJ,YAZY,IAAZC,MAAe,KAYRqI,IARiB,WAAY,IAAAoL,EAAAhX,UAAAwD,EAAA,KAClCC,aAAaH,GAEbA,EAAUjB,YAAW,WACnB,OAAOmC,EAAOrE,MAAMqD,EAAMxD,KACzBuD,KAKAiI,GAAgBhH,GAAO,eAIvB,SAASyS,GAAQ5W,GAEtB,MAAgD,oBAAzCvH,GAAiB0H,SAASjI,KAAK8H,GAKjC,IAAM6W,GAAmC,SAE9C1S,GAGA,IAAMqD,EAAU,IAAII,GAGpB,OAAO,SAAyBkP,GAAa,IAAAC,EAAA,KAC3C,OAAOvP,EAAQiB,SAASqO,GAAK,kBAAM3S,EAAOjM,KAAK6e,EAAMD,QAS5CE,GAAoD,SAE/D7S,GAGA,IAAMqD,EAAU,IAAII,GAGpB,OAAO,SAAgCkP,GAA2B,IAAAG,EAAA,KAChE,OAAOzP,EAAQiB,SAASqO,GAAK,kBAC3B3S,EAAOjM,KAAK+e,EAAMH,GAAKhU,SAAQ,WAC7B0E,EAAQW,OAAO2O,WAMhB,SAASrO,GACdpB,EACA/N,EACAf,GAEA,GAAI8O,EAAI1N,eAAeL,GACrB,OAAO+N,EAAI/N,GAGb,IAAMkU,EAAMjV,IAEZ,OADA8O,EAAI/N,GAAOkU,EACJA,EASF,SAAS0J,GAAQ7P,GACtB,IAEI8P,EAFEC,EAAQ,GACVC,GAAU,EAGRC,EAAU,CACdtP,IAAG,SAAW1P,EAAc0H,GAO1B,OANKqX,IACHhQ,EAAI/O,GAAQ0H,EACZsX,EAAQC,UAAS,kBACRlQ,EAAI/O,OAGR0H,GAGTuX,SAAQ,SAACpT,GACP,IAAMqT,EAAO/H,IAAK,kBAAMtL,EAAOgT,MAQ/B,OANIE,EACFlT,EAAOgT,GAEPC,EAAMnV,KAAKuV,GAGN,CACLnT,OAAQ,WACN,IAAMkE,EAAQ6O,EAAMta,QAAQ0a,IACb,IAAXjP,GACF6O,EAAM9S,OAAOiE,EAAO,MAM5B/E,IAAG,SAACvF,GACFkZ,EAAWlZ,EAEX,IAAM0F,EAAU,GAGhB,IAFA0T,GAAU,EAEHD,EAAMxX,QAAQ,CACnB,IAAM4X,EAAOJ,EAAMK,QACnB9T,EAAQ1B,KAAKuV,KAGf,OAAO1W,EAAa0C,IAAIG,GAASvD,KAAKoP,MAI1C,OAAO8H,EAGF,SAASI,GACdtM,GAEA,IAAI5J,EACAJ,EAEJ,IACEI,EAAS4J,IACT,MAAOnN,GACPmD,EAAQnD,EAIV,MAAO,CAAEuD,SAAQJ,SAIZ,SAASuW,GAAgCC,EAAQ5X,GACtD,IAAMuI,EAAQqP,EAAI9a,QAAQkD,IACX,IAAXuI,GACFqP,EAAItT,OAAOiE,EAAO,GAIf,SAASsP,GAAgBvf,EAAcwf,GAC5C,GAAIA,QACF,MAAM,IAAIjW,MAAM,YAAYvJ,EAAI,kBAGlC,OAAOwf,EAGF,SAASC,GAAOH,GACH,IAAlB,IAAMpW,EAAS,GAAGwW,EAAA,EAAAA,EACCJ,EAAGhY,OAAAoY,IACpBxW,EADiBoW,EAAGI,KACL,EAEjB,OAAOvf,OAAOgP,KAAKjG,GAGd,IAAMyW,GAAW,SACtBC,EACAlf,GAEA,OAAoD,IAA7CiY,GAAeiH,GAAUpb,QAAQ9D,IAGnC,SAASmf,GAAgBpX,GAC9B,IAAMqX,EAAa,GACbC,EAAwB,GAE9B,OAAO,SAACpa,GACN,IAAiC,IAA7Bma,EAAWtb,QAAQmB,GAAvB,CAIAma,EAAWnW,KAAKhE,GAEhB,IAAMqa,EAAmBlI,GAAenS,GACxC,IAAIoa,EAAsBC,GAK1B,OADAD,EAAsBC,IAAoB,EACnCvX,EAAQ9C,KAIZ,IAAMsa,GAAe,SAAAC,GAC1B,SAAAD,EAAYjS,GAAiB,IAAAmS,EAQ1B,OAPDA,EAAAD,EAAAtgB,KAAA,KAAMoO,IAAQ,MAEThO,KAAOmgB,EAAKlZ,YAAYjH,KACU,mBAA5BuJ,MAAM6W,kBACf7W,MAAM6W,kBAAiBD,EAAOA,EAAKlZ,aAEnCkZ,EAAKlX,MAAQ,IAAIM,MAAMyE,GAAS/E,MACjCkX,EACF,OAAAtZ,EAAAoZ,EAAAC,GAAAD,EAVyB,CAUzB9O,GAVkC5H,QAwB9B,SAAS8W,GAAYC,GAC1B,IAAKA,EACH,OAAOjO,GAGT,IAZ4Bc,EAYtBoN,GAZsBpN,EAYcmN,EAXVnN,EAAIG,QAAQpB,GAAqB,IAC1CoB,QAAQtB,IAAmB,SAACwO,EAAYC,GAC7D,OAAOjN,OAAOC,aAAagN,OAU1BnN,QAAQrB,GAAqB,IAC7BqB,QAAQpB,GAAqB,IAC7BwO,OAEH,IAAKH,EACH,OAAOlO,GAGT,GAzBF,SAAsCiO,GACpC,OAAOlO,GAAwB5N,QAAQ8b,EAAI,KAAO,EAwB9CK,CAA6BJ,GAC/B,OAAOA,EAGT,IAAMK,EAAwBL,EAAane,MAAM+P,IAEjD,OAAKyO,GAMD7O,GAAqBzP,KAFPse,EAAsB,IAG/BvO,GANAkO,ECp2CJ,SAASM,KAEd,IAAMC,EAAOhc,SAASgc,KAEtB,IAAKA,EACH,MAAM,IAAIvX,MAAM,0BAGlB,OAAOuX,EAGF,SAASC,KAEd,OAAO/b,QAAQF,SAASgc,OAAiC,aAAxBhc,SAASkc,WAGrC,SAASC,KAEd,OAAOjc,QAAQF,SAASgc,OAAiC,gBAAxBhc,SAASkc,WAGrC,SAASE,GAAU/N,GACxB,OAAOE,mBAAmBF,GAGrB,SAASgO,KACd,OAAOpK,GAAcoK,IAAoB,WACvC,OAAO,IAAI3Y,GAAa,SAACH,GACnB0Y,MACF1Y,IAGFvG,OAAOsf,iBAAiB,QAAQ,kBAAM/Y,aAOrC,IAAMgZ,GAA6C/L,IAAQ,WAChE,OAAO,IAAI9M,GAAa,SAACH,GACvB,GAAI0Y,MAAqBE,KACvB,OAAO5Y,IAGT,IAAMwU,EAAWyE,aAAY,WAC3B,GAAIP,MAAqBE,KAEvB,OADAM,cAAc1E,GACPxU,MAER,UAIA,SAASmZ,KACd,OAAOhZ,EAAakC,KAAI,WACtB,OAAI5F,SAASgc,KACJhc,SAASgc,KAGXO,KAAuBvZ,MAAK,WACjC,GAAIhD,SAASgc,KACX,OAAOhc,SAASgc,KAGlB,MAAM,IAAIvX,MAAM,sDAKf,SAASkY,GAAWC,GACzB,OAAO3K,GACL0K,IACA,WACE,IAAME,EAAS,GAEf,IAAKD,EACH,OAAOC,EAGT,IAAkC,IAA9BD,EAAYld,QAAQ,KACtB,OAAOmd,EACR,QAAA7F,EAAA,EAAA8F,EAEgBF,EAAY9U,MAAM,KAAIkP,EAAA8F,EAAAta,OAAAwU,IAAE,CAApC,IAAI+F,EAAID,EAAA9F,IACX+F,EAAOA,EAAKjV,MAAM,MAET,IAAMiV,EAAK,KAClBF,EAAO5N,mBAAmB8N,EAAK,KAAO9N,mBAAmB8N,EAAK,KAIlE,OAAOF,IAET,CAACD,IAIE,SAASI,GAAc9hB,GAC5B,OAAOyhB,GAAW3f,OAAO0K,SAASuV,OAAOzW,MAAM,IAAItL,GAG9C,SAASgiB,GAAoB1B,GAClC,OAA0B,IAAtBA,EAAI9b,QAAQ,MAIS,IAArB8b,EAAI9b,QAAQ,MAIZ8b,EAAI1T,MAAM,KAAK,KAAO9K,OAAO0K,SAASyV,KAAKrV,MAAM,KAAK,GAWrD,SAASsV,GAAYnT,GAC1B,YADoC,IAAVA,MAAa,IAChC5O,OAAOgP,KAAKJ,GAChB2K,QAAO,SAAC1Y,GACP,MAA2B,iBAAb+N,EAAI/N,IAAyC,kBAAb+N,EAAI/N,MAEnD2K,KAAI,SAAC3K,GACJ,IAAMkU,EAAMnG,EAAI/N,GAEhB,GAAmB,iBAARkU,GAAmC,kBAARA,EACpC,MAAM,IAAIlK,UAAU,0BAGtB,OAAUkW,GAAUlgB,GAAI,IAAIkgB,GAAUhM,EAAIrN,eAE3CqM,KAAK,KAGH,SAASiO,GAAYC,EAAuBC,GACjD,YAD6D,IAAZA,MAAe,IAC3DA,GAAUliB,OAAOgP,KAAKkT,GAAO/a,OAI3B4a,GAAWhb,EAAC,GACdua,GAAWW,GACXC,IALID,EASJ,SAASE,GACdhC,EACA/K,GAEA,IAGIgN,EAEAC,EALEC,EAAQlN,EAAQkN,OAAS,GACzBjX,EAAO+J,EAAQ/J,MAAQ,GAIZkX,EAEapC,EAAI1T,MAAM,KAA1B4V,EAAYE,EAAA,OAAAC,GAAzBJ,EAAWG,EAAA,IAC+B9V,MAAM,KAAhD2V,EAAWI,EAAA,GAEZ,IAAMjB,EAAcS,GAFOQ,EAAA,GAEoBF,GACzCG,EAAaT,GAAYK,EAAchX,GAU7C,OARIkW,IACFa,EAAiBA,EAAW,IAAIb,GAG9BkB,IACFL,EAAiBA,EAAW,IAAIK,GAG3BL,EAGF,SAASM,GACdvC,EACA/T,GAEA,YAF0B,IAA1BA,MAA6BzK,QAEtB,IAAI0G,GAAa,SAACH,GACvBkE,EAAIC,SAAW8T,EACV0B,GAAoB1B,IACvBjY,OAKC,SAASya,KACd,IAAMC,EAAOje,SAASK,cAAc,uBAEpC,QAAIhD,KAAcL,OAAOoC,OAAOC,MAAQ,MAAQ4e,GAO3C,SAASC,GAAiBC,GAC/B,OAAOje,QACLie,EAAGC,aAAeD,EAAGE,cAAgBF,EAAGG,iBAAiB9b,QAItD,SAAS+b,KACd,OAAOtM,GAAcsM,IAAgB,WACnC,IAAMC,EAAcxhB,OAAOwhB,YAE3B,GACEA,GACAA,EAAYjN,KACZiN,EAAYC,QACZD,EAAYC,OAAOC,YACnBF,EAAYC,OAAOE,iBACnBzf,KAAK0T,IAAI4L,EAAYjN,MAAQ1F,KAAK0F,OAAS,KAC3CiN,EAAYjN,OACTiN,EAAYC,OAAOC,WAAaF,EAAYC,OAAOE,iBACpD,EAEF,OAAOH,KAKN,SAASI,KACd,OAAO1e,QAAQqe,MAGV,SAASM,KACd,OAAOtC,KAAuBvZ,MAAK,WACjC,IAAMwb,EAAcD,KAEpB,GAAKC,EAAL,CAIA,IAAMC,EAASD,EAAYC,OAE3B,OAAIA,EAAOC,YAAcD,EAAOK,eACvBL,EAAOK,eAAiBL,EAAOC,gBADxC,MAMG,SAASK,GAAWC,GACzB,YADqC,IAAZA,MAAe,IACjCA,EACJjc,WACAyL,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,SACdA,QAAQ,MAAO,UAGb,SAASyQ,KACd,MAAyB,oBAAXjiB,aAA8CyI,IAApBzI,OAAO0K,SAG1C,SAASwX,GACdC,EACAxV,GAGA,YAHgB,IAAhBA,MAAmB3M,OAAOgD,UAGnBkP,GAAgB1I,MAAM1L,KAAK6O,EAAIuV,iBAAiBC,IAUlD,SAASC,GAAQ3R,EAAsB9J,GAC5C8J,EAAQ6O,iBAAiB,aAAclK,GAAM,CAAEiN,SAAS,IACxD5R,EAAQ6O,iBAAiB,QAAS3Y,GAClC8J,EAAQ6O,iBAAiB,YAAY,SAACgD,GACpC,GAEEA,EAAMC,UAAY5S,GAAUC,OAE5B0S,EAAMC,UAAY5S,GAAUE,MAE5B,OAAOlJ,EAAQ2b,MAKd,SAASE,GAASC,GAQD,IAAAC,EAAAD,EAPtBpX,YAAI,IAAAqX,EAAG1iB,OAAO0K,SAASW,KAAIqX,EAC3B/H,EAAI8H,EAAJ9H,KAAIgI,EAAAF,EACJG,eAAO,IAAAD,GAAQA,EAMf,OAAO1N,GACLuN,IACA,WACE,IAAMhE,EAAM,GAAGnT,EAAOsP,EAEhBkI,EAAU3Q,GAAgB1I,MAAM1L,KACpCkF,SAAS8f,qBAAqB,WAG5BF,GACFC,EAAQD,UACT,QAAAhF,EAAA,EAAAA,EAEoBiF,EAAOrd,OAAAoY,IAAE,CAAzB,IAAMmF,EAAUF,EAAOjF,GAC1B,GAAKmF,EAAOC,KAIAD,EAAOC,IAAIxR,QAAQ,eAAgB,IAAI1G,MAAM,KAAK,KAElD0T,EACV,OAAOuE,KAIb,CAACpI,IAIE,SAASsI,KACd,OAAOhO,GAAcgO,IAAuB,WAC1C,IACE,GAAsB,oBAAXjjB,OACT,OAAO,EAGT,GAAIA,OAAOkjB,aAAc,CACvB,IAAMtkB,EAAQsD,KAAKqL,SAASxH,WAC5B/F,OAAOkjB,aAAaC,QAAQ,yBAA0BvkB,GACtD,IAAMwI,EAASpH,OAAOkjB,aAAaE,QAAQ,0BAE3C,GADApjB,OAAOkjB,aAAaG,WAAW,0BAC3BzkB,IAAUwI,EACZ,OAAO,GAGX,MAAOvD,IAGT,OAAO,KAIJ,SAASyf,KAId,IAAMC,EAAMvjB,OAAOC,UAEbujB,EAAUD,EAAIE,UAAY,GAAHrJ,OAAOmJ,EAAIE,WAAa,GAUrD,OARIF,EAAIG,UACNF,EAAQ3b,KAAK0b,EAAIG,UAGfH,EAAII,cACNH,EAAQ3b,KAAK0b,EAAII,cAGZH,EACJ3Z,KAAI,SAAC+Z,GACJ,GAAIA,GAAUA,EAAOtjB,MAAM,0BAA2B,CACpD,IAAAujB,EAAwBD,EAAO9Y,MAAM,QACrC,MAAO,CAAEgZ,QADWD,EAAA,GACFE,KADPF,EAAA,IAIb,OAAID,GAAUA,EAAOtjB,MAAM,cAClB,CAAEyjB,KAAMH,GAGV,QAERhM,OAAO1U,SAGL,SAAS8gB,GAAYC,EAAwBvI,GAClDuI,EAAUD,YAAYtI,GAGjB,SAASwI,GACdC,EACAxX,GAEA,YAF2B,IAA3BA,MAA8B3J,UAE1BwN,GAAU2T,GAELA,EAGS,iBAAPA,EACFxX,EAAItJ,cAAc8gB,QAD3B,EAKK,SAASC,GACdD,EACAxX,QAA2B,IAA3BA,MAA8B3J,UAE9B,IAAMyN,EAAUyT,GAAeC,EAAIxX,GAEnC,GAAI8D,EACF,OAAOA,EAGT,MAAM,IAAIhJ,MAAM,yBAAyByL,GAAUiR,IAG9C,SAASE,GAAaF,GAC3B,OAAO,IAAIzd,GAAa,SAACH,EAASgB,GAChC,IAAMrJ,EAAOgV,GAAUiR,GACnBhD,EAAK+C,GAAeC,GAExB,GAAIhD,EACF,OAAO5a,EAAQ4a,GAGjB,GAAIlC,KACF,OAAO1X,EACL,IAAIE,MAAM,iCAAiCvJ,EAAI,oBAInD,IAAM6c,EAAWyE,aAAY,WAG3B,OAFA2B,EAAK+C,GAAeC,KAGlB5d,EAAQ4a,QACR1B,cAAc1E,IAIZkE,MACFQ,cAAc1E,GACPxT,EACL,IAAIE,MAAM,iCAAiCvJ,EAAI,0BAHnD,IAMC,OAKA,IAuKHomB,GAvKSC,GAAc,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAA9e,MAAA,KAAAH,YAAA,YAAAR,EAAAwf,EAAAC,GAAAD,EAAA,CAASpG,IAgB7B,SAASsG,GACdjG,EACA/K,GAKA,IAA+DiR,GAF/DjR,EAAUA,GAAW,IAEbkR,qBAAa,IAAAD,EAAG,EAACA,EAAAE,EAA+BnR,EAA7BvV,YAAI,IAAA0mB,EAAG,GAAEA,EAAEviB,EAAkBoR,EAAlBpR,MAAON,EAAW0R,EAAX1R,OAEzCqK,EAAM,EACNyY,EAAO,EAEPxiB,IACErC,OAAO8kB,WACTD,EAAO3iB,KAAKC,OAAOnC,OAAO8kB,WAAaziB,GAAS,GAAKrC,OAAO+kB,QACnD/kB,OAAOoC,OAAOC,QACvBwiB,EAAO3iB,KAAKC,OAAOnC,OAAOoC,OAAOC,MAAQA,GAAS,KAIlDN,IACE/B,OAAOyC,YACT2J,EAAMlK,KAAKC,OAAOnC,OAAOyC,YAAcV,GAAU,GAAK/B,OAAOglB,QACpDhlB,OAAOoC,OAAOL,SACvBqK,EAAMlK,KAAKC,OAAOnC,OAAOoC,OAAOL,OAASA,GAAU,YAIhD0R,EAAQkR,qBACRlR,EAAQvV,KAEXmE,GAASN,IAEX0R,EAAOrO,EAAA,CACLgH,MACAyY,OACAxiB,QACAN,SACA6B,OAAQ,EACRqhB,QAAS,EACTC,QAAS,EACTC,UAAW,EACXC,WAAY,GACT3R,IAIP,IAWIhJ,EAWI5G,EAtBFgc,EAASxhB,OAAOgP,KAAKoG,GAExB5J,KAAI,SAAC3K,GAEJ,GAAIuU,QAAQvU,GACV,OAAUA,EAAG,IAAIgU,GAAUO,EAAQvU,OAGtC0Y,OAAO1U,SACPkP,KAAK,KAIR,IACE3H,EAAMzK,OAAOqlB,KAAK7G,EAAKtgB,EAAM2hB,GAC7B,MAAOhc,GACP,MAAM,IAAI0gB,GAAe,gCACQ1gB,EAAIsD,OAAStD,EAAIqI,UAIpD,GAAIH,GAAetB,GAEjB,MADY,IAAI8Z,GAAe,uCAmBjC,OAfII,IACF3kB,OAAOsf,iBAAiB,gBAAgB,WACtC7U,EAAI6a,WAEF,eAAgBtlB,OAClBA,OAAOsf,iBAAiB,YAAY,WAClC7U,EAAI6a,WAGNtlB,OAAOsf,iBAAiB,UAAU,WAChC7U,EAAI6a,YAKH7a,EAGF,SAAS8a,GAAc9a,EAA2BuX,GACvD,IACEvX,EAAIzH,SAASqiB,OACb5a,EAAIzH,SAASwiB,MAAMxD,GACnBvX,EAAIzH,SAASsiB,QACb,MAAOzhB,GACP,IACE4G,EAAIC,SAAW,+CAA+CuI,KAAKC,UACjE8O,GACD,uBACD,MAAOyD,MAMN,SAASC,GACdjb,EACA0W,GAEA,IAAMwE,EAAMxE,EAAGyE,QAAQlT,cAEvB,GAAY,SAARiT,EACF,MAAM,IAAIle,MAAM,oCAAoCke,GAGD,IAArD,IAAM9Y,EAAkBpC,EAAIzH,SAAS6J,gBAAgBgZ,EAAA,EAAAC,EAEjC7K,GAAUpO,EAAgBkZ,UAASF,EAAAC,EAAAtgB,OAAAqgB,IACrDhZ,EAAgBmZ,YADFF,EAAAD,IAEf,QAAAI,EAAA,EAAAC,EAEmBjL,GAAUkG,EAAG4E,UAASE,EAAAC,EAAA1gB,OAAAygB,IACxCpZ,EAAgBmX,YADFkC,EAAAD,IAKX,SAASE,GACdhF,EACAiF,EACAzZ,QAAa,IAAbA,MAAgB3M,OAAOgD,UAGnBme,EAAGkF,WAELlF,EAAGkF,WAAWC,QAAUF,EAExBjF,EAAG6C,YAAYrX,EAAI4Z,eAAeH,IAkB/B,SAASI,GACdha,GAIA,IAFA8X,GAAyBA,IAA0B,IAAI9W,IAE5BY,IAAI5B,GAAQ,CACrC,IAAMlG,EAAUge,GAAuB9lB,IAAIgO,GAC3C,GAAIlG,EACF,OAAOA,EAIX,IAAMA,EAAU,IAAII,GAAa,SAACH,EAASgB,GACzCiF,EAAM8S,iBAAiB,QAAQ,YZzE5B,SAAyB9S,GAG9B,GApBF,WACE,IAAK,IAAI7O,EAAI,EAAGA,EAAIkO,GAAcrG,OAAQ7H,IAAK,CAC7C,IAAIsO,GAAS,EAEb,IACEA,EAASJ,GAAclO,GAAGsO,OAC1B,MAAOpI,IAILoI,IACFH,GAAa5B,OAAOvM,EAAG,GACvBkO,GAAc3B,OAAOvM,EAAG,KAM5B8oB,GAEIja,GAASA,EAAMC,cACjB,IACEZ,GAAchE,KAAK2E,EAAMC,eACzBX,GAAajE,KAAK2E,GAClB,MAAO3I,MYmEP6iB,CAAgBla,GAChBjG,EAAQiG,MAGVA,EAAM8S,iBAAiB,SAAS,SAACzb,GAC3B2I,EAAMC,cACRlG,EAAQiG,GAERjF,EAAO1D,SAOb,OAFAygB,GAAuB1W,IAAIpB,EAAOlG,GAE3BA,EAGF,SAASqgB,GACdna,GAEA,OAAOga,GAAeha,GAAOxG,MAAK,SAAC4gB,GACjC,IAAKA,EAAYna,cACf,MAAM,IAAIhF,MAAM,mCAGlB,OAAOmf,EAAYna,iBAShB,SAASoa,GACdlB,EACAlS,EACAwQ,QAFW,IAAX0B,MAAc,YACa,IAA3BlS,MALO,IAQPkS,EAAMA,EAAIjT,cACV,IAAMjC,EAAUzN,SAAS6jB,cAAclB,GAcvC,GAZIlS,EAAQ5C,OACV8F,GAAOlG,EAAQI,MAAO4C,EAAQ5C,OAG5B4C,EAAQqT,QACVrW,EAAQsW,UAAYtT,EAAQqT,MAAM1U,KAAK,MAGrCqB,EAAQ0Q,IACV1T,EAAQuW,aAAa,KAAMvT,EAAQ0Q,IAGjC1Q,EAAQwT,WAAY,QAAAC,EAAA,EAAAC,EACJ9oB,OAAOgP,KAAKoG,EAAQwT,YAAWC,EAAAC,EAAA3hB,OAAA0hB,IAAE,CAA9C,IAAMhoB,EAAGioB,EAAAD,GACZzW,EAAQuW,aAAa9nB,EAAKuU,EAAQwT,WAAW/nB,IAYjD,GARIuU,EAAQ4S,YACVF,GAAS1V,EAASgD,EAAQ4S,YAGxBpC,GACFD,GAAYC,EAAWxT,GAGrBgD,EAAQuO,KACV,GAAY,WAAR2D,EAAkB,CAEpB,IAAK1B,IAAcxT,EAAQhE,cACzB,MAAM,IAAIhF,MAAM,8EAMlB8d,GAAc9U,EAAQhE,cAAegH,EAAQuO,WAE7CvR,EAAQ2W,UAAY3T,EAAQuO,KAIhC,OAAOvR,EA0BF,SAAS4W,GACd5T,EACAwQ,QADiC,IAAjCxQ,MATO,IAYP,IACM5C,EAAQ4C,EAAQ5C,OARf,GAuBDrE,EAAQqa,GAAc,SAAU,CACpCI,WAbiB7hB,EAAA,CACjBkiB,kBAAmB,QALF7T,EAAQwT,YAPpB,IAyBLpW,MARYzL,EAAA,CACZmiB,gBAAiB,cACjBC,OAAQ,QACL3W,GAMHmR,KAAMvO,EAAQuO,KACd8E,MAAOrT,EAAQqT,QAGX/jB,EAAO/C,OAAOC,UAAUE,UAAUG,MAAM,cAmB9C,OAjBKkM,EAAMib,aAAa,OACtBjb,EAAMwa,aAAa,KAAM3U,MAI3BmU,GAAeha,GAEXyX,GACSG,GAAWH,GACnBD,YAAYxX,IAGbiH,EAAQ+K,KAAOzb,IACjByJ,EAAMwa,aAAa,MAAOvT,EAAQ+K,KAAO,eAIpChS,EAGF,SAAS8S,GACdrS,EACAqV,EACA3b,GAGA,OADAsG,EAAIqS,iBAAiBgD,EAAO3b,GACrB,CACLsD,OAAM,WACJgD,EAAIya,oBAAoBpF,EAAO3b,KAK9B,SAASghB,GACdlX,EACAmX,EACAjhB,GAEAA,EAAU0O,GAAK1O,GAAS,QAAAkhB,EAAA,EAAAA,EAEAD,EAAUpiB,OAAAqiB,IAChCpX,EAAQ6O,iBADcsI,EAAUC,GACIlhB,GAGtC,MAAO,CACLsD,OAAQoL,IAAK,WAAM,QAAAyS,EAAA,EAAAA,EACOF,EAAUpiB,OAAAsiB,IAChCrX,EAAQiX,oBADcE,EAAUE,GACOnhB,OAM/C,IAAMohB,GAAkB,CAAC,SAAU,MAAO,KAAM,KAEzC,SAASC,GACdvX,EACAvS,EACAU,GAGA6R,EAAQI,MAAM3S,GAAQU,EAE8B,IAApD,IAAMqpB,EAAkBvN,GAAsBxc,GAAMgqB,EAAA,EAAAA,EAE/BH,GAAeviB,OAAA0iB,IAElCzX,EAAQI,MAAM,GAFKkX,GAAeG,GAERD,GAAqBrpB,EAInD,IAAMupB,GAAyB,CAC7B,iBACA,uBACA,kBACA,oBAEIC,GAAuB,CAC3B,eACA,qBACA,gBACA,kBAGK,SAASC,GACd5X,EACAvS,EACAoqB,EACAzf,GAEA,YAFe,IAAfA,MAAkB,KAEX,IAAInC,GAAa,SAACH,EAASgB,GAChC,IAAM4Z,EAAKiD,GAAW3T,GAEtB,IAAK0Q,EACH,OAAO5a,IAGT,IAGIgiB,EACAC,EAEAC,EAEAC,EARAC,GAAa,EAUjB,SAASC,IACP5f,aAAauf,GACbvf,aAAawf,GACbC,EAAWxe,SACXye,EAASze,SAGXwe,EAAad,GAAWxG,EAAIgH,IAAwB,SAAC7F,GAE/CA,EAAMhd,SAAW6b,GAAMmB,EAAMuG,gBAAkB3qB,IAInD8K,aAAauf,GAEbjG,EAAMwG,kBAENL,EAAWxe,SACX0e,GAAa,EAEbH,EAAa5gB,YAAW,WACtBghB,IACAriB,MACCsC,OAGL6f,EAAWf,GAAWxG,EAAIiH,IAAsB,SAAC9F,GAE/C,GAAIA,EAAMhd,SAAW6b,GAAMmB,EAAMuG,gBAAkB3qB,EAMnD,OAFA0qB,IAIiC,iBAAxBtG,EAAMuG,eACbvG,EAAMuG,gBAAkB3qB,EAEjBqJ,EAAO,iCACqBrJ,EAAI,WAAWokB,EAAMuG,eAInDtiB,OAGTyhB,GAAa7G,EAAI,gBAAiBjjB,GAElCqqB,EAAe3gB,YAAW,WACxB,IAAK+gB,EAEH,OADAC,IACOriB,MAER,KAEC+hB,GACFA,EAAMM,MAKL,SAASG,GAAmBtY,GACjCA,EAAQI,MAAMmY,YAAY,aAAc,IAGnC,SAASC,GAAqBxY,GACnCA,EAAQI,MAAMmY,YAAY,aAAc,SAAU,aAG7C,SAASE,GAAYzY,GAC1BA,EAAQI,MAAMmY,YAAY,UAAW,IAGhC,SAASG,GAAY1Y,GAC1BA,EAAQI,MAAMmY,YAAY,UAAW,OAAQ,aAGxC,SAASI,GAAe3Y,GACzBA,GAAWA,EAAQ/D,YACrB+D,EAAQ/D,WAAWsZ,YAAYvV,GAI5B,SAAS4Y,GACd5Y,EACAvS,EACAoqB,GAEA,IAAMgB,EAAYjB,GAAQ5X,EAASvS,EAAMoqB,GAEzC,OADAY,GAAYzY,GACL6Y,EAGF,SAASC,GACd9Y,EACAvS,EACAoqB,GAEA,OAAOD,GAAQ5X,EAASvS,EAAMoqB,GAAOtiB,MAAK,WACxCmjB,GAAY1Y,MAIT,SAAS+Y,GAAS/Y,EAAsBvS,GAC7CuS,EAAQgZ,UAAUC,IAAIxrB,GAGjB,SAASyrB,GAAYlZ,EAAsBvS,GAChDuS,EAAQgZ,UAAUG,OAAO1rB,GAGpB,SAAS2rB,GAAgB1I,GAC9B,QACGA,GACAA,EAAGzU,YACHyU,EAAGvU,eACHuU,EAAGvU,cAAcC,iBACjBsU,EAAGvU,cAAcC,gBAAgBC,SAASqU,IAOxC,SAAS2I,GACdrZ,EACA9J,EACA8M,GAEA,IAAkDsW,GAAbtW,GAAW,IAAxCuW,wBAAgB,IAAAD,GAAQA,EAEhCE,QAAQC,IAAI,sEAC4DxY,OACpEsY,IAGJrjB,EAAU0O,GAAK1O,GACf,IAAMwjB,EAAmB,eAAgBnqB,OAAS,WAAa,SAE/DiqB,QAAQC,IAAI,qCAAqCC,GAEjD,IAGIpP,EAEAqP,EACAC,EANA1Q,GAAY,EACV2Q,EAAoB,GAOpBrgB,EAAS,WACb0P,GAAY,EAAK,QAAA4Q,EAAA,EAAAA,EACMD,EAAiB9kB,OAAA+kB,IAAjBD,EAAiBC,GAC7BC,aAEPzP,GACFA,EAAS9Q,SAEPogB,GAEFA,EAAoB3C,oBAClByC,EACAM,GAIAL,GACFhB,GAAegB,IAIbM,EAAgB,WACf/Q,IACHhT,IACAsD,MAIEwgB,EAA6B,SAACnI,GAElC2H,QAAQC,IAAI,uCAC6BC,EAAgB,qBACrD7H,EAAMqI,UAAS,sBACKjZ,OAAOsY,IAG7BA,GACqB,aAArBG,GACA7H,EAAMqI,UAGNV,QAAQC,IACN,oEAKJD,QAAQC,IAAI,4DACZQ,MAGF,GAAIb,GAAgBpZ,GAElB,OADAia,IACO,CAAEzgB,UAKX,GAAIjK,OAAO4qB,iBAET,IADA,IAAIC,EAAkBpa,EAAQqa,cACvBD,GAAiB,CACtB,IAAME,EAAmB,IAAI/qB,OAAO4qB,kBAAiB,WAC/Cf,GAAgBpZ,IAClBia,OAIJK,EAAiBC,QAAQH,EAAiB,CAAEI,WAAW,IACvDX,EAAkBziB,KAAKkjB,GACvBF,EAAkBA,EAAgBC,cAiCtC,OA3BAV,EAAmBpnB,SAAS6jB,cAAc,WACzBG,aAAa,OAAQ,kBAAkB3U,KAAU,MAClE+X,EAAiBvZ,MAAMqa,QAAU,OAEjCjB,QAAQC,IAAI,+CACZvD,GAAiByD,GAAkBpkB,MAAK,SAACmlB,IACvCd,EZr5BG,SACL5f,GAEA,IAAKe,GAAaf,GAChB,MAAM,IAAIhD,MAAM,qCAIlB,OAAOgD,EY64BiB2gB,CAAiBD,IACnB7L,iBAClB6K,EACAM,GAGFR,QAAQC,IAAI,sEAC4DC,MAG1E1Z,EAAQuT,YAAYoG,GASpBrP,EAAW5C,IALG,WACR0R,GAAgBpZ,IAClBia,MAG2B,KAExB,CAAEzgB,UAGJ,SAASohB,GAAWlK,EAAiBxU,QAAa,IAAbA,MAAgB3M,OAAOgD,UAAQ,QAAAsoB,EAAA,EAAAC,EACpDrJ,GAAiB,SAAUf,GAAGmK,EAAAC,EAAA/lB,OAAA8lB,IAAE,CAAhD,IAAMvI,EAAMwI,EAAAD,GACT5e,EAAaqW,EAAOrW,WAE1B,GAAKA,EAAL,CAIA,IAAM8e,EAAY7e,EAAIka,cAAc,UACpC2E,EAAUzT,KAAOgL,EAAO0I,YACxB/e,EAAWgf,aAAaF,EAAWzI,KAWhC,SAAS4I,GACdxK,EACAxa,EAAsDilB,GAO5B,IAAAC,OAAA,IAAAD,EADL,GAAEA,EAAAE,EAAAD,EAJrBxpB,aAAK,IAAAypB,GAAOA,EAAAC,EAAAF,EACZ9pB,cAAM,IAAAgqB,GAAOA,EAAAC,EAAAH,EACb9Q,gBAAQ,IAAAiR,EAAG,IAAGA,EAAAC,EAAAJ,EACdphB,WAAG,IAAAwhB,EAAGjsB,OAAMisB,EAGVC,EAAe/K,EAAGC,YAClB+K,EAAgBhL,EAAGE,aACnB+K,GAAW,EAEfzlB,EAAQ,CAAEtE,MAAO6pB,EAAcnqB,OAAQoqB,IAEvC,IAmBIE,EACAxjB,EApBEyjB,EAAQ,WACZ,IAAIF,GAAalL,GAAiBC,GAAlC,CAIA,IAAMoL,EAAWpL,EAAGC,YACdoL,EAAYrL,EAAGE,cAGlBhf,GAASkqB,IAAaL,GACtBnqB,GAAUyqB,IAAcL,IAEzBxlB,EAAQ,CAAEtE,MAAOkqB,EAAUxqB,OAAQyqB,IAGrCN,EAAeK,EACfJ,EAAgBK,IAyBlB,OAnBA/hB,EAAI6U,iBAAiB,SAAUgN,QAEG,IAAvB7hB,EAAIgiB,iBACbJ,EAAW,IAAI5hB,EAAIgiB,eAAeH,IACzBtB,QAAQ7J,GACjBtY,EAAUsP,GAAamU,EAAkB,GAAXvR,SACW,IAAzBtQ,EAAImgB,mBACpByB,EAAW,IAAI5hB,EAAImgB,iBAAiB0B,IAC3BtB,QAAQ7J,EAAI,CACnB8F,YAAY,EACZgE,WAAW,EACXyB,SAAS,EACTC,eAAe,IAEjB9jB,EAAUsP,GAAamU,EAAkB,GAAXvR,IAE9BlS,EAAUsP,GAAamU,EAAOvR,GAGzB,CACL9Q,OAAQ,WACNmiB,GAAW,EACXC,EAAS7B,aACTxqB,OAAO0nB,oBAAoB,SAAU4E,GACrCzjB,EAAQoB,WAKP,SAAS2iB,GAAoBpO,GAClC,IAAMgD,EAAcD,KAEpB,GAAKC,GAKiC,mBAA3BA,EAAYqL,WAMvB,IAFA,IAAMC,EAAUtL,EAAYqL,aAEnBlvB,EAAI,EAAGA,EAAImvB,EAAQtnB,OAAQ7H,IAAK,CACvC,IAAMsQ,EAAQ6e,EAAQnvB,GAEtB,GACEsQ,GACAA,EAAM/P,MACsB,IAA5B+P,EAAM/P,KAAKwE,QAAQ8b,IACO,iBAAnBvQ,EAAM8e,SAEb,OAAO7qB,KAAKsQ,MAAMvE,EAAM8e,WAKvB,SAASC,GAAgBvc,GAC9B,KAAOA,EAAQ/D,YACb+D,EAAUA,EAAQ/D,WAGpB,MAA8B,wBAAvB+D,EAAQ1K,WAGV,SAASknB,GAAcxc,GAC5B,KAAOA,EAAQ/D,YACb+D,EAAUA,EAAQ/D,WAGpB,GAAIsgB,GAAgBvc,GAClB,OAAOA,EAIJ,SAASyc,GAAczc,GAC5B,IAAM0c,EAAaF,GAAcxc,GAGjC,GAAI0c,GAAcA,EAAW9hB,KAE3B,OAAO8hB,EAAW9hB,KAIf,SAAS+hB,GAAiB3c,GAC/B,IAAM4c,EAAaH,GAAczc,GAEjC,IAAK4c,EACH,MAAM,IAAI5lB,MAAM,gCAGlB,IAAM6lB,EAAW,eAAejb,KAC1Bkb,EAAOvqB,SAAS6jB,cAAc,QACpC0G,EAAKvG,aAAa,OAAQsG,GAC1B7c,EAAQuT,YAAYuJ,GAEpB,IAAMC,EAAexqB,SAAS6jB,cAAc,OAI5C,OAHA2G,EAAaxG,aAAa,OAAQsG,GAClCD,EAAWrJ,YAAYwJ,GAEnBR,GAAgBK,GACXD,GAAiBI,GAGnBA,EAGF,SAASC,GAAkBtM,GAChC,IAAMuM,EAAU,SAACpL,GAIf,OAHAnB,EAAGuG,oBAAoB,QAASgG,GAChCpL,EAAMqL,iBACNxM,EAAGyM,QACI,GAGTzM,EAAG7B,iBAAiB,aAAa,WAC/B6B,EAAG7B,iBAAiB,QAASoO,GAC7B9lB,YAAW,WACTuZ,EAAGuG,oBAAoB,QAASgG,KAC/B,MAIA,SAASG,KACd,IACE,MAAM,IAAIpmB,MAAM,KAChB,MAAO5D,GACP,OAAOA,EAAIsD,OAAS,IA2BxB,IAAI2mB,GAEkB,oBAAb9qB,SAA2BA,SAAS8qB,cAAgB,KAIhDC,GAAqCva,IAAQ,WACxD,GAAIsa,GACF,OAAOA,GAKT,GAFAA,GAlCF,WACE,IACE,IAAM3mB,EAAQ0mB,KACRG,EAAe,kCAAkCC,KAAK9mB,GACtD+mB,EAAiBF,GAAgBA,EAAa,GAEpD,IAAKE,EACH,OACD,QAAAC,EAAA,EAAAC,EAGoBlc,GAAgB1I,MAClC1L,KAAKkF,SAAS8f,qBAAqB,WACnCF,UAASuL,EAAAC,EAAA5oB,OAAA2oB,IAAE,CAFT,IAAMpL,EAAMqL,EAAAD,GAGf,GAAIpL,EAAOC,KAAOD,EAAOC,MAAQkL,EAC/B,OAAOnL,GAGX,MAAOlf,KAgBOwqB,GAGd,OAAOP,GAGT,MAAM,IAAIrmB,MAAM,uCAGZ6mB,GAAajc,KAINkc,GAA2C/a,IAAQ,WAC9D,IAAIuP,EAEJ,IACEA,EAASgL,KACT,MAAOlqB,GACP,OAAOyqB,GAGT,IAAIvb,EAAMgQ,EAAOyL,aAAa1e,GAAWC,KAEzC,GAAIgD,GAAsB,iBAARA,EAChB,OAAOA,EAKT,IAFAA,EAAMgQ,EAAOyL,aAAgB1e,GAAWC,IAAG,WAEjB,iBAARgD,EAChB,OAAOA,EAGT,GAAIgQ,EAAOC,IAAK,CACd,IAEMyL,EAAe/Y,GADAzC,KAAKC,UAAU,CAAE8P,IADbD,EAAjBC,IACmC0L,QADlB3L,EAAZ2L,WAOb3b,EAAM,OAJa0b,EAAajlB,MAC9BilB,EAAajpB,OAASwK,SAKxB+C,EAAMV,KAKR,OAFA0Q,EAAOiE,aAAgBlX,GAAWC,IAAG,QAASgD,GAEvCA,KAUF,SAAS4b,GAAUC,GAKJ,IAJpBpQ,EAAGoQ,EAAHpQ,IACAlZ,EAAMspB,EAANtpB,OACA0Z,EAAI4P,EAAJ5P,KAAI6P,EAAAD,EACJ7kB,cAAM,IAAA8kB,EAAG,OAAMA,EAETC,EAAO9rB,SAAS6jB,cAAc,QAMpC,GALAiI,EAAK9H,aAAa,SAAU1hB,GAC5BwpB,EAAK9H,aAAa,SAAUjd,GAC5B+kB,EAAK9H,aAAa,SAAUxI,GAC5BsQ,EAAKje,MAAMqa,QAAU,OAEjBlM,EAAM,QAAA+P,EAAA,EAAAC,EACU3wB,OAAOgP,KAAK2R,GAAK+P,EAAAC,EAAAxpB,OAAAupB,IAAE,KAAAE,EAA1B/vB,EAAG8vB,EAAAD,GACNG,EAAQlsB,SAAS6jB,cAAc,SACrCqI,EAAMlI,aAAa,OAAQ9nB,GAC3BgwB,EAAMlI,aAAa,QAAkB,OAAXiI,EAAEjQ,EAAK9f,SAAI,EAAT+vB,EAAWlpB,YACvC+oB,EAAK9K,YAAYkL,GAIrBnQ,KAAUiF,YAAY8K,GACtBA,EAAKK,SACLpQ,KAAUiH,YAAY8I,GCr7CjB,SAASM,GAAU3M,GAUb,IATXvkB,EAAIukB,EAAJvkB,KAAImxB,EAAA5M,EACJ6M,gBAAQ,IAAAD,EAJsB,KAIIA,EAGlCE,EAAe9M,EAAf8M,gBAMA,OAAOta,GACLma,IACA,WACE,IAGII,EAHEC,EAAc,KAAKvxB,EAAI,aACvBwxB,EAAard,KAInB,SAASsd,EAAYhpB,GACnB,IACIipB,EADEC,EAAsB5M,KAO5B,GAJIuM,IACFI,EAAUJ,IAGPI,GAAWC,EAAqB,CACnC,IAAMC,EAAa9vB,OAAOkjB,aAAaE,QAAQqM,GAE3CK,IACFF,EAAU3c,KAAK8c,MAAMD,IAIpBF,IACHA,EAAUjd,KAAY8c,IAGnBG,IACHA,EAAU,CACRzL,GAAIuL,IAIHE,EAAQzL,KACXyL,EAAQzL,GAAKuL,GAGfF,EAAkBI,EAElB,IAAMxoB,EAAST,EAAQipB,GAUvB,OARIC,EACF7vB,OAAOkjB,aAAaC,QAAQsM,EAAaxc,KAAKC,UAAU0c,IAExDjd,KAAY8c,GAAeG,EAG7BJ,EAAkB,KAEXpoB,EAGT,SAAS4oB,IACP,OAAOL,GAAS,SAACC,GAAO,OAAKA,EAAQzL,MAOvC,SAAS8L,EAActpB,GACrB,OAAOgpB,GAAS,SAACC,GACf,IAAIM,EAAUN,EAAQO,YAChB5b,EAAM1F,KAAK0F,MAejB,OAbI2b,GAAW3b,EAAM2b,EAAQE,QAAUd,IACrCY,EAAU,MAGPA,IACHA,EAAU,CACRG,KAAMd,GAAmBld,KACzB+d,QAAS7b,IAIbqb,EAAQO,YAAcD,EAEfvpB,EAAQupB,MAenB,MAAO,CACLP,WACAK,QACAM,aAxCF,WACE,OAAON,MAAYN,GAwCnBa,gBAfF,SAA4B5pB,GAC1B,OAAOspB,GAAW,SAACC,GAEjB,OADAA,EAAQM,MAAQN,EAAQM,OAAS,GAC1B7pB,EAAQupB,EAAQM,WAazBC,aATF,WACE,OAAOR,GAAW,SAACC,GAAO,OAAKA,EAAQG,YAW3C,CAAC,CAAEnyB,OAAMoxB,cC7Hb,SAASoB,KACP,OAAOtB,GAAW,CAAElxB,KAAM,sBAG5B,SAASyyB,GAAczyB,GACrB,OAAOwyB,KAA6BH,iBAAgB,SAACC,GAGnD,OAFAA,EAAMI,cAAgBJ,EAAMI,eAAiB,IAEF,IAAvCJ,EAAMI,cAAcluB,QAAQxE,KAC9BsyB,EAAMI,cAAc/oB,KAAK3J,IAClB,MAoBb,SAAS2yB,GAAiBC,GACxB,OAAO5uB,KAAKsQ,MAAMtQ,KAAKqL,SAAWujB,GAqC7B,SAASC,GAAUtO,GAMQ,IAG5BuO,EARJ9yB,EAAIukB,EAAJvkB,KAAI+yB,EAAAxO,EACJyO,cAAM,IAAAD,EAAG,GAAEA,EAAAE,EAAA1O,EACX2O,oBAAY,IAAAD,EAAG/b,GAAI+b,EAAAE,EAAA5O,EACnB6O,qBAAa,IAAAD,EAAGjc,GAAIic,EAAAE,EAAA9O,EACpB+O,OAEMC,OAFA,IAAAF,GAAOA,EAvCf,SAA+BrzB,GAC7B,OAAOwyB,KAA6Bf,UAAS,SAACa,GAI5C,OAHAA,EAAMkB,oBAAsBlB,EAAMkB,qBAAuB,GACzDlB,EAAMkB,oBAAoBxzB,GACxBsyB,EAAMkB,oBAAoBxzB,IAAS2yB,GAAiB,KAC/CL,EAAMkB,oBAAoBxzB,MAoCTyzB,CAAsBzzB,GAAQ2yB,GAAiB,KAYnEe,EAAe1zB,EAAI,KAPvB8yB,EADES,EAAWP,EAnCT,OAqCKA,GAAU,IAAOA,GAAUO,GAAYA,EAAoB,EAATP,EApCpD,UACC,YA2CNW,GAAU,EACVC,GAAS,EAEb,IACM9xB,OAAOkjB,cAAgBljB,OAAOkjB,aAAaE,QAAQllB,KACrD4zB,GAAS,GAEX,MAAOjuB,IAIT,IAAMkuB,EAAM,CACVC,UAAS,WACP,MA1DE,SA0DKhB,GAAiCc,GAG1CG,WAAU,WACR,MA9DE,SA8DKjB,IAAkCc,GAG3CI,aAAY,WACV,OAAON,GAGT1H,IAAG,SAACiI,EAAoBC,GACtB,YADuC,IAAjBA,MAAoB,IACrCP,GAIDlB,GAAiBiB,EAAS,IAAI3e,KAAKC,UAAUkf,KAC/ChB,EAAa,CAAElzB,OAAM0zB,YAAWQ,UAASX,aAIzCd,GAAiBiB,EAAS,IAAIO,EAAU,IAAIlf,KAAKC,UAAUkf,KAE3Dd,EAAc,CAAEpzB,OAAM0zB,YAAWO,aAAYC,UAASX,aAGjDM,GAbEA,GAgBXM,SAAQ,SAACD,GAEP,YAFwB,IAAjBA,MAAoB,IAC3BP,GAAU,EACHE,EAAI7H,IAAI,QAASkI,IAG1BE,YAAW,SAACF,GACV,YAD2B,IAAjBA,MAAoB,IACvBL,EAAI7H,IAAI,WAAYkI,KAI/B,OAAOL,EC9IF,SAASQ,GAAkB9P,GAMU,IAL1CvkB,EAAIukB,EAAJvkB,KAAIs0B,EAAA/P,EACJgQ,eAAO,IAAAD,EAAG,SAAQA,EAKZ5f,EAASD,KACT+f,EAAY,KAAKx0B,EAAI,KAAKu0B,EAAO,YAEjCE,EAAa/f,EAAO8f,GAAa9f,EAAO8f,IAAc,GAE5D,MAAO,CACLl0B,IAAK,SAACU,EAAa0zB,GAIjB,OAFAA,EAAWA,GAAY,GACTD,EAAUzzB,GAAOyzB,EAAUzzB,IAAQ0zB,I,uGCEvD,IAKMC,GAAiB,GAWhB,SAASC,GAAOrQ,GAS4B,IARjDjE,EAAGiE,EAAHjE,IAAGuU,EAAAtQ,EACH1Y,cAAM,IAAAgpB,EAAG,MAAKA,EAAAC,EAAAvQ,EACdwQ,eAAO,IAAAD,EAAG,GAAEA,EACZE,EAAIzQ,EAAJyQ,KACAC,EAAI1Q,EAAJ0Q,KACAnU,EAAIyD,EAAJzD,KAAIoU,EAAA3Q,EACJhY,WAAG,IAAA2oB,EAAGpzB,OAAMozB,EAAAC,EAAA5Q,EACZ5Z,eAAO,IAAAwqB,EAAG,EAACA,EAEX,OAAO,IAAI3sB,GAAa,SAACH,EAASgB,GAChC,GAAK2rB,GAAQC,GAAUD,GAAQlU,GAAUmU,GAAQD,EAC/C,MAAM,IAAIzrB,MAAM,sEAKW,IAA7B,IAAM6rB,EAAoB,GAAG1V,EAAA,EAAAuJ,EAEX9oB,OAAOgP,KAAK4lB,GAAQrV,EAAAuJ,EAAA3hB,OAAAoY,IAAE,CAAnC,IAAM1e,EAAGioB,EAAAvJ,GACZ0V,EAAkBp0B,EAAIwT,eAAiBugB,EAAQ/zB,GAG7Cg0B,EACFI,EAvCU,gBAwCRA,EAxCQ,iBAwCmC,oBACpCH,GAAQnU,KACjBsU,EA1CU,gBA2CRA,EA3CQ,iBA4CR,oDAGJA,EAAgC,OAC9BA,EAAgC,QAAK,mBAAmB,QAAAzN,EAAA,EAAAA,EAE9BgN,GAAcrtB,OAAAqgB,IACH,IADlC,IACG0N,GAAeC,EADKX,GAAchN,MACHI,EAAA,EAAA+I,EAEnB3wB,OAAOgP,KAAKkmB,GAAatN,EAAA+I,EAAAxpB,OAAAygB,IAAE,CAAxC,IAAM/mB,EAAG8vB,EAAA/I,GACZqN,EAAkBp0B,EAAIwT,eAAiB6gB,EAAar0B,GAIxD,IAAMu0B,EAAM,IAAIhpB,EAAIipB,eAuDpB,IAAK,IAAMx0B,KArDXu0B,EAAInU,iBACF,QACA,WACE,IAAMqU,EAzDd,SAAsBC,QAAkB,IAAlBA,MAAqB,IACvB,IAAlB,IAAMxsB,EAAS,GAAG4S,EAAA,EAAA6Z,EACCD,EAAWhV,OAAO9T,MAAM,MAAKkP,EAAA6Z,EAAAruB,OAAAwU,IAAE,CAA7C,IACH8Z,EADaD,EAAA7Z,GACiBlP,MAAM,KAA7B5L,EAAG40B,EAAA,GAAKxmB,EAAMymB,GAAAD,GAAAtqB,MAAA,GACrBpC,EAAOlI,EAAIwT,eAAiBpF,EAAO8E,KAAK,KAAKwM,OAE/C,OAAOxX,EAmDuB4sB,CAAaz2B,KAAK02B,yBAE1C,IAAK12B,KAAKqG,OACR,OAAO2D,EACL,IAAIE,MAAM,cACMsC,EAAO2I,cAAa,IAAI8L,EAAG,sCAK/C,IAAM0V,EAAcP,EAAgB,gBAC9BQ,EACJD,IAC6C,IAA5CA,EAAYxxB,QAAQ,qBACkB,IAArCwxB,EAAYxxB,QAAQ,cACpB0xB,EAAe72B,KAAK82B,aAExB,IACED,EAAenhB,KAAK8c,MAAMqE,GAC1B,MAAOvwB,GACP,GAAIswB,EACF,OAAO5sB,EAAO,IAAIE,MAAM,iBAAiBlK,KAAK82B,aAAY,MAU9D,OAAO9tB,EANK,CACV3C,OAAQrG,KAAKqG,OACbqvB,QAASU,EACT3U,KAAMoV,OAKV,GAGFX,EAAInU,iBACF,SACA,SAACgV,GACC/sB,EACE,IAAIE,MAAM,cACMsC,EAAO2I,cAAa,IAAI8L,EAAG,YAAY8V,EAAIvuB,WAAU,SAIzE,GAGF0tB,EAAIpO,KAAKtb,EAAQyU,GAAK,GAEJ8U,EACZA,EAAkB/zB,eAAeL,IACnCu0B,EAAIc,iBAAiBr1B,EAAKo0B,EAAkBp0B,IAI5Cg0B,EACFlU,EAAO/L,KAAKC,UAAUggB,GACbC,IACTnU,EAAO3gB,OAAOgP,KAAK8lB,GAChBtpB,KAAI,SAAC3K,GACJ,OAAUqS,mBAAmBrS,GAAI,KAC/Bi0B,EAAO5hB,mBAAmB4hB,EAAKj0B,IAAQ,OAG1CkT,KAAK,MAGVqhB,EAAI5qB,QAAUA,EACd4qB,EAAIe,UAAY,WACdjtB,EACE,IAAIE,MAAM,cAAcsC,EAAO2I,cAAa,IAAI8L,EAAG,oBAIvDiV,EAAIgB,KAAKzV,MAIN,SAAS0V,GAAiB3qB,GAC/B8oB,GAAehrB,KAAKkC,GCnKf,IAAM4qB,IAAQ,ECCd,SAASC,GAAStvB,EAAgBpH,EAAc2d,GACrDA,EAAWjd,MAAQ4U,GAAQqI,EAAWjd,MAAO,CAAEV,OAAM2V,eAAe,IAG/D,SAASvN,GAAQhB,EAAgBpH,EAAc2d,GACpDA,EAAWjd,MAAQmW,GAAU8G,EAAWjd,MAAO,CAAEV,SCP5C,SAAS22B,GAAOxjB,GACrB,MAAsB,iBAARA,GAAoB,YAAY7Q,KAAK6Q,GAG9C,SAASyjB,GAAKzjB,GACnB,MAAsB,iBAARA,GAAoB,aAAa7Q,KAAK6Q,GAG/C,SAAS0jB,GAAM3hB,GACpB,GAAmB,iBAARA,EACT,OAAOA,EAGT,IAAM9S,EAAQ8S,EAAI9S,MAAM,oBAExB,IAAKA,EACH,MAAM,IAAImH,MAAM,kCAAkC2L,GAGpD,OAAOxB,SAAStR,EAAM,GAAI,IAGrB,SAAS00B,GAAK5hB,GACnB,OAAU2hB,GAAM3hB,GAAI,KAGf,SAAS6hB,GAAM7hB,GACpB,MAAmB,iBAARA,EACF4hB,GAAK5hB,GAGPyhB,GAAOzhB,GAAOA,EAAM4hB,GAAK5hB,GAG3B,SAAS8hB,GAAO9d,EAAaN,GAClC,OAAOlF,SAAUwF,EAAM2d,GAAMje,GAAS,IAAK,IAGtC,SAASqe,GAAmBC,EAAsBle,GACvD,GAAmB,iBAARke,EACT,OAAOA,EACF,GAAIP,GAAOO,GAChB,OAAOF,GAAOhe,EAAKke,GACd,GAAIN,GAAKM,GACd,OAAOL,GAAMK,GAEb,MAAM,IAAI3tB,MAAM,gCAAgC2tB,GCzB7C,SAASC,GACdtrB,EAAkB6hB,GAEE,IAD2ByH,QAC3B,IAAAzH,EADyB,GAAEA,GAA7C/iB,eAAO,IAAAwqB,EAAG,IAAIA,EAEViC,EAAwD,GACxDjsB,EAAgE,GAEtE,OAAO,IAAI3C,GAAa,SAACH,EAASgB,GAChC,IAAMguB,EAAQ3tB,YAAW,WACnB0tB,EAAS9vB,QACX+B,EACE,IAAIE,MAAM,YAAY6tB,EAAS,GAAGp3B,KAAI,oBAAoB2K,EAAO,OAIjEQ,EAAS7D,QACX+B,EACE,IAAIE,MAAM,YACI4B,EAAS,GAAGnL,KAAI,2BAA2B2K,EAAO,SAInEA,GAGG2sB,EAAkB,SAACt3B,EAAMyI,QAAO,IAAPA,MAAUyO,IACvC,IAAM2c,EAAM,CAAE7zB,OAAMyI,WAKpB,OAHA2uB,EAASztB,KAAKkqB,GAGP,WAAmC,QAAAnrB,EAAA,KAAAqN,EAAA1O,UAAAC,OAAT4E,EAAI,IAAA8H,MAAA+B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ9J,EAAI8J,GAAA3O,UAAA2O,GACnCqJ,GAAgB+X,EAAUvD,GAG1B,IAAA0D,EAA0BnY,IAAS,eAAAoY,EAAA,OAAMA,EAAA/uB,GAAQ7I,KAAI4H,MAAAgwB,EAAA,CAAC9uB,GAAIwT,OAAKhQ,OAAvDhD,EAAMquB,EAANruB,OAAQJ,EAAKyuB,EAALzuB,MAEhB,GAAIA,EAEF,MADAqC,EAASxB,KAAK,CAAE3J,OAAMoI,QAASI,EAAasB,YAAYhB,KAClDA,EAOR,OAHAqC,EAASxB,KAAK,CAAE3J,OAAMoI,QAASI,EAAaH,QAAQa,KAG7CA,IAKLuuB,EAAiB,SAACz3B,EAAc8S,GAEpC,YAFsC,IAAFA,MAAKoE,IAElC,WAAkC,IAAAwgB,EACvCvsB,EAASxB,KAAK,CACZ3J,OACAoI,QAASI,EAAasB,YACpB,IAAIP,MAAM,YAAYvJ,EAAI,wBAE3B,QAAA2W,EAAAtP,UAAAC,OAN2B4E,EAAI,IAAA8H,MAAA2C,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1K,EAAI0K,GAAAvP,UAAAuP,GAQlC,OAAO8gB,EAAA5kB,GAAGlT,KAAI4H,MAAAkwB,EAAA,CAACr4B,MAAI6c,OAAKhQ,MAKtByrB,EAAuB,SAAC33B,EAAMyI,QAAO,IAAPA,MAAUyO,IAC5C,IAAM2c,EAAM,CAAE7zB,OAAMyI,WAKpB,OAHA2uB,EAASztB,KAAKkqB,GAGP,WAAwC,QAAApqB,EAAA,KAAAmS,EAAAvU,UAAAC,OAAT4E,EAAI,IAAA8H,MAAA4H,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ3P,EAAI2P,GAAAxU,UAAAwU,GACxCwD,GAAgB+X,EAAUvD,GAG1B,IAAA+D,EAA0BxY,IAAS,eAAAyY,EAAA,OAAMA,EAAApvB,GAAQ7I,KAAI4H,MAAAqwB,EAAA,CAACpuB,GAAIyS,OAAKhQ,OAAvDhD,EAAM0uB,EAAN1uB,OAAQJ,EAAK8uB,EAAL9uB,MAEhB,GAAIA,EACF,MAAMA,EAYR,OATAqC,EAASxB,KAAK,CACZ3J,OAEAoI,QAASI,EAAaH,QAAQa,GAAQpB,MAAK,WACzC,MAAM,IAAIyB,MAAM,YAAYvJ,EAAI,wBAC/BkX,MAIEhO,IAIL4uB,EAAO,WACX,OAAOtvB,EAAakC,KAAI,WACtB,GAAIS,EAAS7D,OAAQ,CACnB,IAAMiE,EAAOJ,EAAS,GACtB,OAAOI,EAAKnD,QACToC,SAAQ,WACP6U,GAAgBlU,EAAUI,MAE3BzD,KAAKgwB,OAEThwB,MAAK,WACN,GAAIsvB,EAAS9vB,OACX,OAAOkB,EAAa2D,MAAM,IAAIrE,KAAKgwB,OAKzC3sB,EAASxB,KAAK,CACZ3J,KAAM,sBACNoI,QAASI,EAAakC,KAAI,kBACxBmB,EAAO,CACLyrB,SACAG,QACAE,cACA7uB,MAAO2uB,EACPK,KAAM,WAAF,OAAQtvB,EAAaH,kBAK/ByvB,IACGttB,SAAQ,WACPM,aAAausB,MAEdvvB,KAAKO,EAASgB","file":"belter.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"belter\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"belter\"] = factory();\n\telse\n\t\troot[\"belter\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/* @flow */\n\nexport const sfvcScreens = {\n /*\n * iPhone 14 Pro Max\n */\n \"932\": {\n textSizeHeights: [746, 742, 738], // 732 removed as same in Safari\n textSizeHeightsNoTabs: [854, 852, 850, 848],\n zoomHeight: {\n \"1.15\": [746, 742, 738], // 733 removed as same in Safari\n \"1.25\": [746, 743], // 738, 733 removed as same in Safari\n \"1.5\": [746, 743], // 738, 732 removed as same in Safari\n \"1.75\": [746, 742, 739], // 732 removed as same in Safari\n \"2\": [746, 742], // 738, 732 removed as same in Safari\n \"2.5\": [745, 743], // 738, 733 removed as same in Safari\n \"3\": [749], // 743, 740, 734 removed as same in Safari\n \"3.01\": [749], // 743, 740, 734 removed as same in Safari\n },\n maybeSafari: {\n \"1\": [732],\n \"1.15\": [733],\n \"1.25\": [738, 733],\n \"1.5\": [738, 732],\n \"1.75\": [732],\n \"2\": [738, 732],\n \"2.5\": [738, 733],\n \"3\": [743, 740, 734],\n \"3.01\": [743, 740, 734],\n },\n },\n\n /*\n * iPhone 12 Pro Max\n * iPhone 13 Pro Max\n * iPhone 14 Plus\n */\n \"926\": {\n textSizeHeights: [752, 748, 744, 738],\n textSizeHeightsNoTabs: [860, 858, 856, 854],\n zoomHeight: {\n \"1.15\": [752, 747, 744, 738],\n \"1.25\": [753, 748, 744, 738],\n \"1.5\": [752, 749, 744, 738],\n \"1.75\": [753, 747, 744, 739],\n \"2\": [752, 748, 744], // 738 removed as same in Safari\n \"2.5\": [753, 748], // 745, 738 removed as same in Safari\n \"3\": [753, 744], // 747, 738 removed as same in Safari\n },\n maybeSafari: {\n \"2\": [738],\n \"2.5\": [745, 738],\n \"3\": [747, 738],\n },\n },\n\n /*\n * iPhone XS Max\n * iPhone 11 Pro Max\n * iPhone XR\n * iPhone 11\n */\n \"896\": {\n textSizeHeights: [721, 717, 713, 707],\n textSizeHeightsNoTabs: [829, 827, 825, 823],\n zoomHeight: {\n \"1.15\": [721, 716, 713, 707],\n \"1.25\": [721, 718, 713, 708],\n \"1.5\": [722, 717, 713], // 707 removed as same in Safari\n \"1.75\": [721, 718, 712, 707],\n \"2\": [722, 718, 714, 708],\n \"2.5\": [720, 718, 713, 708],\n \"3\": [720, 717, 708], // 714 removed as same in Safari\n },\n maybeSafari: {\n \"1.5\": [707],\n \"3\": [714],\n },\n },\n\n /*\n * iPhone 14 Pro\n */\n \"852\": {\n textSizeHeights: [666, 662, 658], // 652 removed as same in Safari\n textSizeHeightsNoTabs: [774, 772, 770, 768],\n zoomHeight: {\n \"1.15\": [666, 662, 658], // 652 removed as same in Safari\n \"1.25\": [665, 661, 658], // 651 removed as same in Safari\n \"1.5\": [666, 662, 659], // 653 removed as same in Safari\n \"1.75\": [667, 662], // 658, 653 removed as same in Safari\n \"1.99\": [663, 659], // 655, 649 removed as same in Safari\n \"2\": [663, 659], // 655, 649 removed as same in Safari\n \"2.5\": [665, 663], // 658, 653 removed as same in Safari\n \"3\": [666, 663], // 657, 651 removed as same in Safari\n },\n maybeSafari: {\n \"1\": [652],\n \"1.15\": [652],\n \"1.25\": [651],\n \"1.5\": [653],\n \"1.75\": [658, 653],\n \"1.99\": [655, 649],\n \"2\": [655, 649],\n \"2.5\": [658, 653],\n \"3\": [657, 651],\n },\n },\n\n /*\n * iPhone 12\n * iPhone 12 Pro\n * iPhone 13\n * iPhone 14\n */\n \"844\": {\n textSizeHeights: [670, 666, 662, 656],\n textSizeHeightsNoTabs: [778, 776, 774, 772],\n zoomHeight: {\n \"1.15\": [670, 666, 662], // 656 removed as same in Safari\n \"1.25\": [670, 666, 663, 656],\n \"1.5\": [671, 666, 662], // 656 removed as same in Safari\n \"1.75\": [670, 667, 662, 656],\n \"2\": [670, 666, 662], // 656 removed as same in Safari\n \"2.5\": [670, 663], // 665, 655 removed as same in Safari\n \"3\": [669, 666, 663, 657], // 663 removed as same in Safari\n },\n maybeSafari: {\n \"1.15\": [656],\n \"1.5\": [656],\n \"2\": [656],\n \"2.5\": [665, 655],\n \"3\": [663],\n },\n },\n\n /*\n * iPhone X\n * iPhone XS\n * iPhone 11 Pro\n * iPhone 12 Mini\n */\n \"812\": {\n textSizeHeights: [641, 637, 633, 627],\n textSizeHeightsNoTabs: [749, 747, 745, 743],\n zoomHeight: {\n \"1.15\": [641, 637, 633, 627],\n \"1.25\": [641, 638, 633, 628],\n \"1.5\": [641, 638, 633, 627],\n \"1.75\": [641, 637, 634], // 627 removed as same in Safari\n \"2\": [642, 638, 634, 628],\n \"2.5\": [640, 638, 633, 628],\n \"3\": [642, 633], // 636, 627 removed as same in Safari\n },\n maybeSafari: {\n \"1.75\": [627],\n \"3\": [636, 627],\n },\n },\n\n /*\n * iPhone 6 Plus\n * iPhone 6S Plus\n * iPhone 7 Plus\n * iPhone 8 Plus\n */\n \"736\": {\n textSizeHeights: [628, 624, 620, 614],\n textSizeHeightsNoTabs: [736, 734, 732, 730],\n zoomHeight: {\n \"1.15\": [628, 624, 620, 614],\n \"1.25\": [628, 624, 620, 614],\n \"1.5\": [629, 624, 620], // 614\n \"1.75\": [628, 625, 620, 614],\n \"2\": [628, 624, 620], // 614\n \"2.5\": [628, 625, 620, 615],\n \"3\": [627, 624, 615], // 621\n },\n maybeSafari: {\n \"1.5\": [614],\n \"2\": [614],\n \"3\": [621],\n },\n },\n\n /*\n * iPhone 6\n * iPhone 6S\n * iPhone 7\n * iPhone 8\n * iPhone SE2\n */\n \"667\": {\n textSizeHeights: [559, 555, 551, 545],\n textSizeHeightsNoTabs: [667, 665, 663, 661],\n zoomHeight: {\n \"1.15\": [559, 555, 551, 545],\n \"1.25\": [559, 555, 551, 545],\n \"1.5\": [560, 555, 551], // 545\n \"1.75\": [558, 555, 551], // 544\n \"2\": [560, 556, 552, 546],\n \"2.5\": [560, 555, 550], // 545\n \"3\": [558, 555, 546], // 552\n },\n maybeSafari: {\n \"1.5\": [545],\n \"1.75\": [544],\n \"2.5\": [545],\n \"3\": [552],\n },\n },\n};\n","/* @flow */\nimport { sfvcScreens } from \"./screenHeights\";\n\nexport function getUserAgent(): string {\n return window.navigator.mockUserAgent || window.navigator.userAgent;\n}\n\nconst TABLET_PATTERN =\n /ip(a|ro)d|silk|xoom|playbook|tablet|kindle|Nexus 7|GT-P10|SC-01C|SHW-M180S|SM-T320|SGH-T849|SCH-I800|SHW-M180L|SPH-P100|SGH-I987|zt180|HTC( Flyer|_Flyer)|Sprint ATP51|ViewPad7|pandigital(sprnova|nova)|Ideos S7|Dell Streak 7|Advent Vega|A101IT|A70BHT|MID7015|Next2|nook|FOLIO|MB511.*RUTEM|Mac OS.*Silk/i;\n\nexport function isDevice(userAgent?: string = getUserAgent()): boolean {\n if (\n userAgent.match(\n /Android|webOS|iPhone|iPad|iPod|bada|Symbian|Palm|CriOS|BlackBerry|IEMobile|WindowsMobile|Opera Mini/i\n )\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function isTablet(userAgent?: string = getUserAgent()): boolean {\n return TABLET_PATTERN.test(userAgent);\n}\n\nexport function isWebView(ua?: string = getUserAgent()): boolean {\n return (\n /(iPhone|iPod|iPad|Macintosh).*AppleWebKit(?!.*Safari)|.*WKWebView/i.test(\n ua\n ) ||\n /\\bwv\\b/.test(ua) ||\n /Android.*Version\\/(\\d)\\.(\\d)/i.test(ua)\n );\n}\n\nexport function isStandAlone(): boolean {\n return (\n window.navigator.standalone === true ||\n window.matchMedia(\"(display-mode: standalone)\").matches\n );\n}\n\nexport function isFacebookWebView(ua?: string = getUserAgent()): boolean {\n return /FBAN/.test(ua) || /FBAV/.test(ua);\n}\n\nexport function isInstagramWebView(ua?: string = getUserAgent()): boolean {\n return /Instagram/.test(ua);\n}\n\nexport function isMetaWebView(ua?: string = getUserAgent()): boolean {\n return isFacebookWebView(ua) || isInstagramWebView(ua);\n}\n\nexport function isMetaInAppBrowser(ua?: string = getUserAgent()): boolean {\n return /IABMV/.test(ua);\n}\n\nexport function isFirefox(ua?: string = getUserAgent()): boolean {\n return /Firefox/i.test(ua);\n}\n\nexport function isFirefoxIOS(ua?: string = getUserAgent()): boolean {\n return /FxiOS/i.test(ua);\n}\n\nexport function isEdgeIOS(ua?: string = getUserAgent()): boolean {\n return /EdgiOS/i.test(ua);\n}\n\nexport function isOperaMini(ua?: string = getUserAgent()): boolean {\n return /Opera Mini/i.test(ua);\n}\n\nexport function isAndroid(ua?: string = getUserAgent()): boolean {\n return /Android/.test(ua);\n}\n\nexport function isFirefoxAndroid(ua?: string = getUserAgent()): boolean {\n return isAndroid(ua) && isFirefox(ua);\n}\n\nexport function isIos(ua?: string = getUserAgent()): boolean {\n return /iPhone|iPod|iPad/.test(ua);\n}\n\nexport function isIOS14(ua?: string = getUserAgent()): boolean {\n return /iPhone.*OS.*(1)?(?:(1)[0-4]| [0-9])_/.test(ua);\n}\n\nexport function isGoogleSearchApp(ua?: string = getUserAgent()): boolean {\n return /\\bGSA\\b/.test(ua);\n}\n\nexport function isQQBrowser(ua?: string = getUserAgent()): boolean {\n return /QQBrowser/.test(ua);\n}\n\nexport function isIosWebview(ua?: string = getUserAgent()): boolean {\n if (isIos(ua)) {\n if (isGoogleSearchApp(ua)) {\n return true;\n }\n return /.+AppleWebKit(?!.*Safari)|.*WKWebView/.test(ua);\n }\n return false;\n}\n\nexport function isSFVC(ua?: string = getUserAgent()): boolean {\n if (isIos(ua)) {\n const height = window.innerHeight;\n const scale =\n Math.round((window.screen.width / window.innerWidth) * 100) / 100;\n const computedHeight = Math.round(height * scale);\n\n let device = null;\n if (isIOS14(ua)) {\n device = sfvcScreens[window.outerHeight];\n } else {\n if (scale !== 1) {\n return true;\n }\n\n device = sfvcScreens[window.outerHeight];\n }\n\n if (!device) {\n return true;\n }\n\n if (scale > 1 && device.zoomHeight && device.zoomHeight[scale]) {\n return device.zoomHeight[scale].indexOf(computedHeight) !== -1;\n } else {\n return (\n device.textSizeHeights.indexOf(computedHeight) !== -1 ||\n device.textSizeHeightsNoTabs.indexOf(computedHeight) !== -1\n );\n }\n }\n return false;\n}\n\nexport function isSFVCorSafari(ua?: string = getUserAgent()): boolean {\n if (isIos(ua)) {\n const sfvc = isSFVC(ua);\n\n const device = isIOS14(ua) ? sfvcScreens[window.outerHeight] : null;\n\n if (!device) {\n return false;\n }\n\n const height = window.innerHeight;\n const scale =\n Math.round((window.screen.width / window.innerWidth) * 100) / 100;\n\n const computedHeight = Math.round(height * scale);\n const possibleSafariSizes = device.maybeSafari;\n\n let maybeSafari = false;\n if (\n scale > 1 &&\n possibleSafariSizes[scale] &&\n possibleSafariSizes[scale].indexOf(computedHeight) !== -1\n ) {\n maybeSafari = true;\n }\n\n return sfvc || maybeSafari;\n }\n return false;\n}\n\nexport function isAndroidWebview(ua?: string = getUserAgent()): boolean {\n if (isAndroid(ua)) {\n return /Version\\/[\\d.]+/.test(ua) && !isOperaMini(ua);\n }\n return false;\n}\n\nexport function isIE(): boolean {\n if (window.document.documentMode) {\n return true;\n }\n\n return Boolean(\n window.navigator &&\n window.navigator.userAgent &&\n /Edge|MSIE|rv:11/i.test(window.navigator.userAgent)\n );\n}\n\nexport function isIECompHeader(): boolean {\n const mHttp = window.document.querySelector(\n 'meta[http-equiv=\"X-UA-Compatible\"]'\n );\n const mContent = window.document.querySelector('meta[content=\"IE=edge\"]');\n if (mHttp && mContent) {\n return true;\n }\n return false;\n}\n\nexport function isElectron(): boolean {\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.electron\n ) {\n return true;\n }\n return false;\n}\n\nexport function isIEIntranet(): boolean {\n // This status check only works for older versions of IE with document.documentMode set\n\n if (window.document.documentMode) {\n try {\n const status = window.status;\n\n window.status = \"testIntranetMode\";\n\n if (window.status === \"testIntranetMode\") {\n window.status = status;\n\n return true;\n }\n\n return false;\n } catch (err) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function isMacOsCna(): boolean {\n const userAgent = getUserAgent();\n return /Macintosh.*AppleWebKit(?!.*Safari)/i.test(userAgent);\n}\n\nexport function supportsPopups(ua?: string = getUserAgent()): boolean {\n return !(\n isWebView(ua) ||\n isIosWebview(ua) ||\n isAndroidWebview(ua) ||\n isOperaMini(ua) ||\n isFirefoxIOS(ua) ||\n isFirefoxAndroid(ua) ||\n isEdgeIOS(ua) ||\n isFacebookWebView(ua) ||\n isQQBrowser(ua) ||\n isElectron() ||\n isMacOsCna() ||\n isStandAlone()\n );\n}\n\nexport function isChrome(ua?: string = getUserAgent()): boolean {\n return (\n /Chrome|Chromium|CriOS/.test(ua) && !/SamsungBrowser|Silk|EdgA/.test(ua)\n );\n}\n\nexport function isSafari(ua?: string = getUserAgent()): boolean {\n return /Safari/.test(ua) && !isChrome(ua) && !/Silk|FxiOS|EdgiOS/.test(ua);\n}\n\nexport function isIpadOs(ua?: string = getUserAgent()): boolean {\n // Safari on iOS13+ on an iPad will return a useragent that is the same as Safari on MacOS\n // Adding the maxTouchPoints will determine that it is a touch device\n if (!/iPhone|iPod/.test(ua)) {\n if (/iPad/.test(ua) || (isSafari(ua) && navigator.maxTouchPoints >= 1)) {\n return true;\n }\n }\n return false;\n}\n\nexport function isApplePaySupported(): boolean {\n try {\n if (\n window.ApplePaySession &&\n window.ApplePaySession.supportsVersion(3) &&\n window.ApplePaySession.canMakePayments()\n ) {\n return true;\n }\n } catch (e) {\n return false;\n }\n\n return false;\n}\n\nexport function isCrossSiteTrackingEnabled(expectedCookieKey: string): boolean {\n return window.document.cookie.indexOf(expectedCookieKey) === -1;\n}\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","/* @flow */\n\nexport function isPromise(item : mixed) : boolean {\n try {\n if (!item) {\n return false;\n }\n\n if (typeof Promise !== 'undefined' && item instanceof Promise) {\n return true;\n }\n\n if (typeof window !== 'undefined' && typeof window.Window === 'function' && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && typeof window.constructor === 'function' && item instanceof window.constructor) {\n return false;\n }\n\n const toString = ({}).toString;\n\n if (toString) {\n const name = toString.call(item);\n\n if (name === '[object Window]' || name === '[object global]' || name === '[object DOMWindow]') {\n return false;\n }\n }\n\n if (typeof item.then === 'function') {\n return true;\n }\n } catch (err) {\n return false;\n }\n\n return false;\n}\n","/* @flow */\n\nimport type { ZalgoPromise } from './promise';\n\nconst dispatchedErrors = [];\nconst possiblyUnhandledPromiseHandlers : Array<(mixed, promise? : ZalgoPromise) => void> = [];\n\nexport function dispatchPossiblyUnhandledError(err : mixed, promise : ZalgoPromise) {\n\n if (dispatchedErrors.indexOf(err) !== -1) {\n return;\n }\n\n dispatchedErrors.push(err);\n\n setTimeout(() => {\n if (__DEBUG__) {\n // $FlowFixMe\n throw new Error(`${ err.stack || err.toString() }\\n\\nFrom promise:\\n\\n${ promise.stack }`);\n }\n\n throw err;\n }, 1);\n\n for (let j = 0; j < possiblyUnhandledPromiseHandlers.length; j++) {\n // $FlowFixMe\n possiblyUnhandledPromiseHandlers[j](err, promise);\n }\n}\n\nexport function onPossiblyUnhandledException(handler : (mixed, promise? : ZalgoPromise) => void) : {| cancel : () => void |} {\n possiblyUnhandledPromiseHandlers.push(handler);\n\n return {\n cancel() {\n possiblyUnhandledPromiseHandlers.splice(possiblyUnhandledPromiseHandlers.indexOf(handler), 1);\n }\n };\n}\n","/* @flow */\n\nimport type { ZalgoPromise } from './promise';\n\nlet activeCount = 0;\nlet flushPromise;\n\nfunction flushActive() {\n if (!activeCount && flushPromise) {\n const promise = flushPromise;\n flushPromise = null;\n promise.resolve();\n }\n}\n\nexport function startActive() {\n activeCount += 1;\n}\n\nexport function endActive() {\n activeCount -= 1;\n flushActive();\n}\n\nexport function awaitActive(Zalgo : Class>) : ZalgoPromise { // eslint-disable-line no-undef\n const promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\n/* eslint no-use-before-define: off */\n\nimport { isPromise } from './utils';\nimport { onPossiblyUnhandledException, dispatchPossiblyUnhandledError } from './exceptions';\nimport { startActive, endActive, awaitActive } from './flush';\n\nexport class ZalgoPromise {\n\n resolved : boolean;\n rejected : boolean;\n errorHandled : boolean;\n value : R;\n error : mixed;\n // eslint-disable-next-line flowtype/no-mutable-array\n handlers : Array<{|\n promise : ZalgoPromise<*>,\n onSuccess : void | (result : R) => mixed,\n onError : void | (error : mixed) => mixed\n |}>;\n dispatching : boolean;\n stack : string;\n\n constructor(handler : ?(resolve : (result : R) => void, reject : (error : mixed) => void) => void) {\n\n this.resolved = false;\n this.rejected = false;\n this.errorHandled = false;\n\n this.handlers = [];\n\n if (handler) {\n\n let result;\n let error;\n let resolved = false;\n let rejected = false;\n let isAsync = false;\n\n startActive();\n\n try {\n handler(res => {\n if (isAsync) {\n this.resolve(res);\n } else {\n resolved = true;\n result = res;\n }\n\n }, err => {\n if (isAsync) {\n this.reject(err);\n } else {\n rejected = true;\n error = err;\n }\n });\n\n } catch (err) {\n endActive();\n this.reject(err);\n return;\n }\n\n endActive();\n\n isAsync = true;\n\n if (resolved) {\n // $FlowFixMe\n this.resolve(result);\n } else if (rejected) {\n this.reject(error);\n }\n }\n\n if (__DEBUG__) {\n try {\n throw new Error(`ZalgoPromise`);\n } catch (err) {\n this.stack = err.stack;\n }\n }\n }\n\n resolve(result : R) : ZalgoPromise {\n if (this.resolved || this.rejected) {\n return this;\n }\n\n if (isPromise(result)) {\n throw new Error('Can not resolve promise with another promise');\n }\n\n this.resolved = true;\n this.value = result;\n this.dispatch();\n\n return this;\n }\n\n reject(error : mixed) : ZalgoPromise {\n if (this.resolved || this.rejected) {\n return this;\n }\n\n if (isPromise(error)) {\n throw new Error('Can not reject promise with another promise');\n }\n\n if (!error) {\n // $FlowFixMe\n const err = (error && typeof error.toString === 'function' ? error.toString() : Object.prototype.toString.call(error));\n error = new Error(`Expected reject to be called with Error, got ${ err }`);\n }\n\n this.rejected = true;\n this.error = error;\n\n if (!this.errorHandled) {\n setTimeout(() => {\n if (!this.errorHandled) {\n dispatchPossiblyUnhandledError(error, this);\n }\n }, 1);\n }\n\n this.dispatch();\n\n return this;\n }\n\n asyncReject(error : mixed) : ZalgoPromise {\n this.errorHandled = true;\n this.reject(error);\n return this;\n }\n\n dispatch() {\n\n const { dispatching, resolved, rejected, handlers } = this;\n\n if (dispatching) {\n return;\n }\n\n if (!resolved && !rejected) {\n return;\n }\n\n this.dispatching = true;\n startActive();\n\n const chain = (firstPromise : ZalgoPromise, secondPromise : ZalgoPromise) => {\n return firstPromise.then(res => {\n secondPromise.resolve(res);\n }, err => {\n secondPromise.reject(err);\n });\n };\n\n for (let i = 0; i < handlers.length; i++) {\n\n const { onSuccess, onError, promise } = handlers[i];\n\n let result;\n\n if (resolved) {\n\n try {\n result = onSuccess ? onSuccess(this.value) : this.value;\n } catch (err) {\n promise.reject(err);\n continue;\n }\n\n } else if (rejected) {\n\n if (!onError) {\n promise.reject(this.error);\n continue;\n }\n\n try {\n result = onError(this.error);\n } catch (err) {\n promise.reject(err);\n continue;\n }\n }\n\n if (result instanceof ZalgoPromise && (result.resolved || result.rejected)) {\n const promiseResult : ZalgoPromise<*> = result;\n\n if (promiseResult.resolved) {\n promise.resolve(promiseResult.value);\n } else {\n promise.reject(promiseResult.error);\n }\n\n promiseResult.errorHandled = true;\n\n } else if (isPromise(result)) {\n\n if (result instanceof ZalgoPromise && (result.resolved || result.rejected)) {\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n } else {\n // $FlowFixMe\n chain(result, promise);\n }\n\n } else {\n\n promise.resolve(result);\n }\n }\n\n handlers.length = 0;\n this.dispatching = false;\n endActive();\n }\n\n then(onSuccess : void | (result : R) => (ZalgoPromise | Y), onError : void | (error : mixed) => (ZalgoPromise | Y)) : ZalgoPromise {\n\n if (onSuccess && typeof onSuccess !== 'function' && !onSuccess.call) {\n throw new Error('Promise.then expected a function for success handler');\n }\n\n if (onError && typeof onError !== 'function' && !onError.call) {\n throw new Error('Promise.then expected a function for error handler');\n }\n\n const promise = new ZalgoPromise();\n\n this.handlers.push({\n promise,\n onSuccess,\n onError\n });\n\n this.errorHandled = true;\n\n this.dispatch();\n\n return promise;\n }\n\n catch(onError : (error : mixed) => ZalgoPromise | Y) : ZalgoPromise {\n // $FlowFixMe incompatible-call\n const resultPromise : ZalgoPromise = this.then(undefined, onError);\n return resultPromise;\n }\n\n finally(onFinally : () => mixed) : ZalgoPromise {\n\n if (onFinally && typeof onFinally !== 'function' && !onFinally.call) {\n throw new Error('Promise.finally expected a function');\n }\n\n return this.then((result) => {\n return ZalgoPromise.try(onFinally)\n .then(() => {\n return result;\n });\n }, (err) => {\n return ZalgoPromise.try(onFinally)\n .then(() => {\n throw err;\n });\n });\n }\n\n timeout(time : number, err : ?Error) : ZalgoPromise {\n\n if (this.resolved || this.rejected) {\n return this;\n }\n\n const timeout = setTimeout(() => {\n\n if (this.resolved || this.rejected) {\n return;\n }\n\n this.reject(err || new Error(`Promise timed out after ${ time }ms`));\n\n }, time);\n\n return this.then(result => {\n clearTimeout(timeout);\n return result;\n });\n }\n\n // $FlowFixMe\n toPromise() : Promise {\n // $FlowFixMe\n if (typeof Promise === 'undefined') {\n throw new TypeError(`Could not find Promise`);\n }\n // $FlowFixMe\n return Promise.resolve(this); // eslint-disable-line compat/compat\n }\n\n lazy() : ZalgoPromise {\n this.errorHandled = true;\n return this;\n }\n\n static resolve(value : ZalgoPromise | Y) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n // $FlowFixMe incompatible-type-arg\n const result : ZalgoPromise = value;\n return result;\n }\n\n if (isPromise(value)) {\n // $FlowFixMe\n return new ZalgoPromise((resolve, reject) => value.then(resolve, reject));\n }\n\n return new ZalgoPromise().resolve(value);\n }\n\n static reject(error : mixed) : ZalgoPromise {\n return new ZalgoPromise().reject(error);\n }\n\n static asyncReject(error : mixed) : ZalgoPromise {\n return new ZalgoPromise().asyncReject(error);\n }\n\n static all>(promises : X) : ZalgoPromise<$TupleMap(ZalgoPromise | Y) => Y>> { // eslint-disable-line no-undef\n\n const promise = new ZalgoPromise();\n let count = promises.length;\n // eslint-disable-next-line no-undef, unicorn/prefer-spread\n const results = ([] : $TupleMap(ZalgoPromise | Y) => Y>).slice();\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n const chain = (i : number, firstPromise : ZalgoPromise, secondPromise : ZalgoPromise) => {\n return firstPromise.then(res => {\n results[i] = res;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n secondPromise.reject(err);\n });\n };\n\n for (let i = 0; i < promises.length; i++) {\n const prom = promises[i];\n\n if (prom instanceof ZalgoPromise) {\n if (prom.resolved) {\n results[i] = prom.value;\n count -= 1;\n continue;\n }\n } else if (!isPromise(prom)) {\n results[i] = prom;\n count -= 1;\n continue;\n }\n\n chain(i, ZalgoPromise.resolve(prom), promise);\n }\n\n if (count === 0) {\n promise.resolve(results);\n }\n\n return promise;\n }\n\n static hash(promises : O) : ZalgoPromise<$ObjMap(ZalgoPromise | Y) => Y>> { // eslint-disable-line no-undef\n const result = {};\n const awaitPromises = [];\n\n for (const key in promises) {\n if (promises.hasOwnProperty(key)) {\n const value = promises[key];\n\n if (isPromise(value)) {\n awaitPromises.push(value.then(res => {\n result[key] = res;\n }));\n } else {\n result[key] = value;\n }\n }\n }\n\n return ZalgoPromise.all(awaitPromises).then(() => result);\n }\n\n static map(items : $ReadOnlyArray, method : (T) => (ZalgoPromise | X)) : ZalgoPromise<$ReadOnlyArray> {\n // $FlowFixMe\n return ZalgoPromise.all(items.map(method));\n }\n\n static onPossiblyUnhandledException(handler : (err : mixed) => void) : {| cancel : () => void |} {\n return onPossiblyUnhandledException(handler);\n }\n\n static try>(method : (...args : $ReadOnlyArray) => (ZalgoPromise | Y), context? : C, args? : A) : ZalgoPromise {\n\n if (method && typeof method !== 'function' && !method.call) {\n throw new Error('Promise.try expected a function');\n }\n\n let result : ZalgoPromise | Y;\n\n startActive();\n\n try {\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n // $FlowFixMe incompatible-call\n const resultPromise = ZalgoPromise.resolve(result);\n\n return resultPromise;\n }\n\n static delay(delay : number) : ZalgoPromise {\n return new ZalgoPromise(resolve => {\n setTimeout(resolve, delay);\n });\n }\n\n static isPromise(value : mixed) : boolean {\n\n if (value && value instanceof ZalgoPromise) {\n return true;\n }\n\n return isPromise(value);\n }\n\n static flush() : ZalgoPromise {\n return awaitActive(ZalgoPromise);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from \"./util\";\nimport type {\n CrossDomainWindowType,\n SameDomainWindowType,\n DomainMatcher,\n} from \"./types\";\nimport { PROTOCOL, WILDCARD } from \"./constants\";\n\nconst IE_WIN_ACCESS_ERROR = \"Call was rejected by callee.\\r\\n\";\n\nexport function getActualProtocol(win: SameDomainWindowType = window): ?string {\n return win.location.protocol;\n}\n\nexport function getProtocol(win: SameDomainWindowType = window): ?string {\n if (win.mockDomain) {\n const protocol = win.mockDomain.split(\"//\")[0];\n\n if (protocol) {\n return protocol;\n }\n }\n\n return getActualProtocol(win);\n}\n\nexport function isFileProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.ABOUT;\n}\n\nexport function isMockProtocol(win: SameDomainWindowType = window): boolean {\n return getProtocol(win) === PROTOCOL.MOCK;\n}\n\nexport function getParent(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n if (!win) {\n return;\n }\n\n try {\n if (win.parent && win.parent !== win) {\n return win.parent;\n }\n } catch (err) {\n // pass\n }\n}\n\nexport function getOpener(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n if (!win) {\n return;\n }\n\n // Make sure we're not actually an iframe which has had window.open() called on us\n if (getParent(win)) {\n return;\n }\n\n try {\n return win.opener;\n } catch (err) {\n // pass\n }\n}\n\nexport function canReadFromWindow(\n win: CrossDomainWindowType | SameDomainWindowType\n): boolean {\n try {\n // $FlowFixMe\n noop(win && win.location && win.location.href);\n return true;\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function getActualDomain(win?: SameDomainWindowType = window): string {\n const location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n const protocol = getActualProtocol(win);\n\n if (!protocol) {\n throw new Error(`Can not read window protocol`);\n }\n\n if (protocol === PROTOCOL.FILE) {\n return `${PROTOCOL.FILE}//`;\n }\n\n if (protocol === PROTOCOL.ABOUT) {\n const parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${PROTOCOL.ABOUT}//`;\n }\n\n const host = location.host;\n\n if (!host) {\n throw new Error(`Can not read window host`);\n }\n\n return `${protocol}//${host}`;\n}\n\nexport function getDomain(win?: SameDomainWindowType = window): string {\n const domain = getActualDomain(win);\n\n if (domain && win.mockDomain && win.mockDomain.indexOf(PROTOCOL.MOCK) === 0) {\n return win.mockDomain;\n }\n\n return domain;\n}\n\nexport function isBlankDomain(win: CrossDomainWindowType): boolean {\n try {\n // $FlowFixMe\n if (!win.location.href) {\n return true;\n }\n\n if (win.location.href === \"about:blank\") {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isActuallySameDomain(win: CrossDomainWindowType): boolean {\n try {\n if (win === window) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n const desc = Object.getOwnPropertyDescriptor(win, \"location\");\n\n if (desc && desc.enumerable === false) {\n return false;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (isAboutProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (isMockProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n try {\n // $FlowFixMe\n if (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(\n win: CrossDomainWindowType | SameDomainWindowType\n): boolean {\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n if (win === window) {\n return true;\n }\n\n // $FlowFixMe\n if (isAboutProtocol(win) && canReadFromWindow(win)) {\n return true;\n }\n\n // $FlowFixMe\n if (getDomain(window) === getDomain(win)) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function assertSameDomain(\n win: CrossDomainWindowType | SameDomainWindowType\n): SameDomainWindowType {\n if (!isSameDomain(win)) {\n throw new Error(`Expected window to be same domain`);\n }\n\n // $FlowFixMe\n return win;\n}\n\nexport function getParents(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n try {\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n if (!parent || !child) {\n return false;\n }\n\n const childParent = getParent(child);\n\n if (childParent) {\n return childParent === parent;\n }\n\n if (getParents(child).indexOf(parent) !== -1) {\n return true;\n }\n\n return false;\n}\n\nexport function getFrames(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n let frames;\n\n try {\n frames = win.frames;\n } catch (err) {\n frames = win;\n }\n\n let len;\n\n try {\n len = frames.length;\n } catch (err) {\n // pass\n }\n\n if (len === 0) {\n return result;\n }\n\n if (len) {\n for (let i = 0; i < len; i++) {\n let frame;\n\n try {\n frame = frames[i];\n } catch (err) {\n continue;\n }\n\n result.push(frame);\n }\n\n return result;\n }\n\n for (let i = 0; i < 100; i++) {\n let frame;\n\n try {\n frame = frames[i];\n } catch (err) {\n return result;\n }\n\n if (!frame) {\n return result;\n }\n\n result.push(frame);\n }\n\n return result;\n}\n\nexport function getAllChildFrames(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const result = [];\n\n for (const frame of getFrames(win)) {\n result.push(frame);\n\n for (const childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n try {\n if (win.top) {\n return win.top;\n }\n } catch (err) {\n // pass\n }\n\n if (getParent(win) === win) {\n return win;\n }\n\n try {\n if (isAncestorParent(window, win) && window.top) {\n return window.top;\n }\n } catch (err) {\n // pass\n }\n\n try {\n if (isAncestorParent(win, window) && window.top) {\n return window.top;\n }\n } catch (err) {\n // pass\n }\n\n for (const frame of getAllChildFrames(win)) {\n try {\n if (frame.top) {\n return frame.top;\n }\n } catch (err) {\n // pass\n }\n\n if (getParent(frame) === frame) {\n return frame;\n }\n }\n}\n\nexport function getNextOpener(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(\n win?: CrossDomainWindowType = window\n): CrossDomainWindowType {\n const opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n let result = [...getAllChildFrames(top), top];\n\n // Win may be in shadow dom\n if (result.indexOf(win) === -1) {\n result = [...result, win, ...getAllChildFrames(win)];\n }\n\n return result;\n}\n\nexport function getAllWindows(\n win?: CrossDomainWindowType = window\n): $ReadOnlyArray {\n const frames = getAllFramesInWindow(win);\n const opener = getNextOpener(win);\n\n if (opener) {\n return [...getAllWindows(opener), ...frames];\n } else {\n return frames;\n }\n}\n\nexport function isTop(win: CrossDomainWindowType): boolean {\n return win === getTop(win);\n}\n\nexport function isFrameWindowClosed(frame: HTMLIFrameElement): boolean {\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n const doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n let parent = frame;\n\n while (parent.parentNode && parent.parentNode !== parent) {\n parent = parent.parentNode;\n }\n\n // $FlowFixMe\n if (!parent.host || !doc.documentElement.contains(parent.host)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection: $ReadOnlyArray, item: T): number {\n for (let i = 0; i < collection.length; i++) {\n try {\n if (collection[i] === item) {\n return i;\n }\n } catch (err) {\n // pass\n }\n }\n\n return -1;\n}\n\nconst iframeWindows = [];\nconst iframeFrames = [];\n\nexport function isWindowClosed(\n win: CrossDomainWindowType,\n allowMock: boolean = true\n): boolean {\n try {\n if (win === window) {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (!win) {\n return true;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n } catch (err) {\n // I love you so much IE\n\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return false;\n }\n\n return true;\n }\n\n if (allowMock && isSameDomain(win)) {\n try {\n // $FlowFixMe\n if (win.mockclosed) {\n return true;\n }\n } catch (err) {\n // pass\n }\n }\n\n // Mobile safari\n\n try {\n if (!win.parent || !win.top) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n // Yes, this actually happens in IE. win === win errors out when the window\n // is from an iframe, and the iframe was removed from the page.\n\n try {\n noop(win === win); // eslint-disable-line no-self-compare\n } catch (err) {\n return true;\n }\n\n // IE orphaned frame\n\n const iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n const frame = iframeFrames[iframeIndex];\n\n if (frame && isFrameWindowClosed(frame)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction cleanIframes() {\n for (let i = 0; i < iframeWindows.length; i++) {\n let closed = false;\n\n try {\n closed = iframeWindows[i].closed;\n } catch (err) {\n // pass\n }\n\n if (closed) {\n iframeFrames.splice(i, 1);\n iframeWindows.splice(i, 1);\n }\n }\n}\n\nexport function linkFrameWindow(frame: HTMLIFrameElement) {\n cleanIframes();\n\n if (frame && frame.contentWindow) {\n try {\n iframeWindows.push(frame.contentWindow);\n iframeFrames.push(frame);\n } catch (err) {\n // pass\n }\n }\n}\n\nexport function getUserAgent(win: ?SameDomainWindowType): string {\n win = win || window;\n return win.navigator.mockUserAgent || win.navigator.userAgent;\n}\n\nexport function getFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const winFrames = getFrames(win);\n\n for (const childFrame of winFrames) {\n try {\n if (\n isSameDomain(childFrame) &&\n // $FlowFixMe\n childFrame.name === name &&\n winFrames.indexOf(childFrame) !== -1\n ) {\n return childFrame;\n }\n } catch (err) {\n // pass\n }\n }\n\n try {\n // $FlowFixMe\n if (winFrames.indexOf(win.frames[name]) !== -1) {\n // $FlowFixMe\n return win.frames[name];\n }\n } catch (err) {\n // pass\n }\n\n try {\n if (winFrames.indexOf(win[name]) !== -1) {\n return win[name];\n }\n } catch (err) {\n // pass\n }\n}\n\nexport function findChildFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (const childFrame of getFrames(win)) {\n const namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(\n win: CrossDomainWindowType,\n name: string\n): ?CrossDomainWindowType {\n const frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n const top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(\n win: CrossDomainWindowType,\n frame: CrossDomainWindowType\n): boolean {\n const frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (const childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n return parent === getOpener(child);\n}\n\nexport function getAncestor(\n win?: CrossDomainWindowType = window\n): ?CrossDomainWindowType {\n win = win || window;\n\n const opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n const parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(\n win: CrossDomainWindowType\n): $ReadOnlyArray {\n const results = [];\n\n let ancestor = win;\n\n while (ancestor) {\n ancestor = getAncestor(ancestor);\n if (ancestor) {\n results.push(ancestor);\n }\n }\n\n return results;\n}\n\nexport function isAncestor(\n parent: CrossDomainWindowType,\n child: CrossDomainWindowType\n): boolean {\n const actualParent = getAncestor(child);\n\n if (actualParent) {\n if (actualParent === parent) {\n return true;\n }\n\n return false;\n }\n\n if (child === parent) {\n return false;\n }\n\n if (getTop(child) === child) {\n return false;\n }\n\n for (const frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup(win?: CrossDomainWindowType = window): boolean {\n return Boolean(getOpener(win));\n}\n\nexport function isIframe(win?: CrossDomainWindowType = window): boolean {\n return Boolean(getParent(win));\n}\n\nexport function isFullpage(win?: CrossDomainWindowType = window): boolean {\n return Boolean(!isIframe(win) && !isPopup(win));\n}\n\nfunction anyMatch(collection1, collection2): boolean {\n for (const item1 of collection1) {\n for (const item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(\n win: CrossDomainWindowType = window\n): number {\n let distance = 0;\n let parent = win;\n\n while (parent) {\n parent = getParent(parent);\n if (parent) {\n distance += 1;\n }\n }\n\n return distance;\n}\n\nexport function getNthParent(\n win: CrossDomainWindowType,\n n: number = 1\n): ?CrossDomainWindowType {\n let parent = win;\n\n for (let i = 0; i < n; i++) {\n if (!parent) {\n return;\n }\n\n parent = getParent(parent);\n }\n\n return parent;\n}\n\nexport function getNthParentFromTop(\n win: CrossDomainWindowType,\n n: number = 1\n): ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(\n win1: CrossDomainWindowType,\n win2: CrossDomainWindowType\n): boolean {\n const top1 = getTop(win1) || win1;\n const top2 = getTop(win2) || win2;\n\n try {\n if (top1 && top2) {\n if (top1 === top2) {\n return true;\n }\n\n return false;\n }\n } catch (err) {\n // pass\n }\n\n const allFrames1 = getAllFramesInWindow(win1);\n const allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n const opener1 = getOpener(top1);\n const opener2 = getOpener(top2);\n\n if (opener1 && anyMatch(getAllFramesInWindow(opener1), allFrames2)) {\n return false;\n }\n\n if (opener2 && anyMatch(getAllFramesInWindow(opener2), allFrames1)) {\n return false;\n }\n\n return false;\n}\n\nexport function matchDomain(\n pattern: DomainMatcher,\n origin: DomainMatcher\n): boolean {\n if (typeof pattern === \"string\") {\n if (typeof origin === \"string\") {\n return pattern === WILDCARD || origin === pattern;\n }\n\n if (isRegex(origin)) {\n return false;\n }\n\n if (Array.isArray(origin)) {\n return false;\n }\n }\n\n if (isRegex(pattern)) {\n if (isRegex(origin)) {\n return pattern.toString() === origin.toString();\n }\n\n if (Array.isArray(origin)) {\n return false;\n }\n\n // $FlowFixMe\n return Boolean(origin.match(pattern));\n }\n\n if (Array.isArray(pattern)) {\n if (Array.isArray(origin)) {\n return JSON.stringify(pattern) === JSON.stringify(origin);\n }\n\n if (isRegex(origin)) {\n return false;\n }\n\n return pattern.some((subpattern) => matchDomain(subpattern, origin));\n }\n\n return false;\n}\n\nexport function stringifyDomainPattern(pattern: DomainMatcher): string {\n if (Array.isArray(pattern)) {\n return `(${pattern.join(\" | \")})`;\n } else if (isRegex(pattern)) {\n return `RegExp(${pattern.toString()})`;\n } else {\n return pattern.toString();\n }\n}\n\nexport function getDomainFromUrl(url: string): string {\n let domain;\n\n if (url.match(/^(https?|mock|file):\\/\\//)) {\n domain = url;\n } else {\n return getDomain();\n }\n\n domain = domain.split(\"/\").slice(0, 3).join(\"/\");\n\n return domain;\n}\n\nexport function onCloseWindow(\n win: CrossDomainWindowType,\n callback: Function,\n delay: number = 1000,\n maxtime: number = Infinity\n): {| cancel: () => void |} {\n let timeout;\n\n const check = () => {\n if (isWindowClosed(win)) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n return callback();\n }\n\n if (maxtime <= 0) {\n clearTimeout(timeout);\n } else {\n maxtime -= delay;\n timeout = setTimeout(check, delay);\n }\n };\n\n check();\n\n return {\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n },\n };\n}\n\n// eslint-disable-next-line complexity\nexport function isWindow(obj: Object): boolean {\n try {\n if (obj === window) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n // $FlowFixMe method-unbinding\n if (Object.prototype.toString.call(obj) === \"[object Window]\") {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (window.Window && obj instanceof window.Window) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.self === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.parent === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n if (obj && obj.top === obj) {\n return true;\n }\n } catch (err) {\n if (err && err.message === IE_WIN_ACCESS_ERROR) {\n return true;\n }\n }\n\n try {\n // eslint-disable-next-line no-self-compare\n if (noop(obj === obj) === \"__unlikely_value__\") {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (\n obj &&\n obj.__cross_domain_utils_window_check__ === \"__unlikely_value__\"\n ) {\n return false;\n }\n } catch (err) {\n return true;\n }\n\n try {\n if (\"postMessage\" in obj && \"self\" in obj && \"location\" in obj) {\n return true;\n }\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.location !== \"undefined\"\n );\n}\n\nexport function isCurrentDomain(domain: string): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n return getDomain() === domain;\n}\n\nexport function isMockDomain(domain: string): boolean {\n return domain.indexOf(PROTOCOL.MOCK) === 0;\n}\n\nexport function normalizeMockUrl(url: string): string {\n if (!isMockDomain(getDomainFromUrl(url))) {\n return url;\n }\n\n if (!__TEST__) {\n throw new Error(`Mock urls not supported out of test mode`);\n }\n\n return url.replace(/^mock:\\/\\/[^/]+/, getActualDomain(window));\n}\n\nexport function getFrameForWindow(win: CrossDomainWindowType): ?HTMLElement {\n if (isSameDomain(win)) {\n return assertSameDomain(win).frameElement;\n }\n\n for (const frame of document.querySelectorAll(\"iframe\")) {\n if (frame && frame.contentWindow && frame.contentWindow === win) {\n return frame;\n }\n }\n}\n\nexport function closeWindow(win: CrossDomainWindowType) {\n if (isIframe(win)) {\n const frame = getFrameForWindow(win);\n if (frame && frame.parentElement) {\n frame.parentElement.removeChild(frame);\n return;\n }\n }\n\n try {\n win.close();\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n\nexport const PROTOCOL = {\n MOCK: (\"mock:\": \"mock:\"),\n FILE: (\"file:\": \"file:\"),\n ABOUT: (\"about:\": \"about:\"),\n};\n\nexport const WILDCARD = \"*\";\n\nexport const WINDOW_TYPE = {\n IFRAME: (\"iframe\": \"iframe\"),\n POPUP: (\"popup\": \"popup\"),\n};\n","/* @flow */\n\nexport function safeIndexOf(collection : $ReadOnlyArray, item : T) : number {\n for (let i = 0; i < collection.length; i++) {\n\n try {\n if (collection[i] === item) {\n return i;\n }\n } catch (err) {\n // pass\n }\n }\n\n return -1;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : $ReadOnlyArray) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from '@krakenjs/cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nexport class CrossDomainSafeWeakMap {\n\n name : string;\n weakmap : ?WeakMap;\n // eslint-disable-next-line flowtype/no-mutable-array\n keys : Array;\n // eslint-disable-next-line flowtype/no-mutable-array\n values : Array;\n\n constructor() {\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__`;\n\n if (hasNativeWeakMap()) {\n try {\n this.weakmap = new WeakMap();\n } catch (err) {\n // pass\n }\n }\n\n this.keys = [];\n this.values = [];\n }\n\n _cleanupClosedWindows() {\n\n const weakmap = this.weakmap;\n const keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n const value = keys[i];\n\n if (isWindow(value) && isWindowClosed(value)) {\n\n if (weakmap) {\n try {\n weakmap.delete(value);\n } catch (err) {\n // pass\n }\n }\n\n keys.splice(i, 1);\n this.values.splice(i, 1);\n\n i -= 1;\n }\n }\n }\n\n isSafeToReadWrite(key : K) : boolean {\n\n if (isWindow(key)) {\n return false;\n }\n\n try {\n noop(key && key.self);\n noop(key && key[this.name]);\n } catch (err) {\n return false;\n }\n\n return true;\n }\n\n set(key : K, value : V) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n weakmap.set(key, value);\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const name = this.name;\n const entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n Object.defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n\n return;\n\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const values = this.values;\n const index = safeIndexOf(keys, key);\n\n if (index === -1) {\n keys.push(key);\n values.push(value);\n } else {\n values[index] = value;\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n\n return;\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n weakmap.delete(key);\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const keys = this.keys;\n const index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n const weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return true;\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (this.isSafeToReadWrite(key)) {\n try {\n const entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n } catch (err) {\n // pass\n }\n }\n\n this._cleanupClosedWindows();\n\n const index = safeIndexOf(this.keys, key);\n return index !== -1;\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n const value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n\nexport function hasNativeWeakMap() : boolean {\n\n if (typeof WeakMap === 'undefined') {\n return false;\n }\n\n if (typeof Object.freeze === 'undefined') {\n return false;\n }\n\n try {\n\n const testWeakMap = new WeakMap();\n const testKey = {};\n const testValue = '__testvalue__';\n\n Object.freeze(testKey);\n\n testWeakMap.set(testKey, testValue);\n\n if (testWeakMap.get(testKey) === testValue) {\n return true;\n }\n\n return false;\n\n } catch (err) {\n\n return false;\n }\n}\n","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nimport isNativeReflectConstruct from \"@babel/runtime/helpers/esm/isNativeReflectConstruct\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"@babel/runtime/helpers/esm/getPrototypeOf\";\nimport setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nimport isNativeFunction from \"@babel/runtime/helpers/esm/isNativeFunction\";\nimport construct from \"@babel/runtime/helpers/esm/construct\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","/* @flow */\n\nexport const KEY_CODES = {\n ENTER: 13,\n SPACE: 32,\n};\n\nexport const ATTRIBUTES = {\n UID: \"data-uid\",\n};\n\nexport const UID_HASH_LENGTH = 30;\n\n/* eslint-disable no-control-regex*/\nexport const invalidProtocolRegex: RegExp =\n /([^\\w]*)(javascript|data|vbscript)/im;\nexport const htmlEntitiesRegex: RegExp = /&#(\\w+)(^\\w|;)?/g;\nexport const htmlCtrlEntityRegex: RegExp = /&(newline|tab);/gi;\nexport const ctrlCharactersRegex: RegExp =\n /[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim;\nexport const urlSchemeRegex: RegExp = /^.+(:|:)/gim;\nexport const relativeFirstCharacters = [\".\", \"/\"];\nexport const BLANK_URL = \"about:blank\";\n/* eslint-enable no-control-regex*/\n","/* @flow */\n/* eslint max-lines: 0 */\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport { WeakMap } from \"@krakenjs/cross-domain-safe-weakmap/src\";\n\nimport {\n BLANK_URL,\n ctrlCharactersRegex,\n htmlCtrlEntityRegex,\n htmlEntitiesRegex,\n invalidProtocolRegex,\n relativeFirstCharacters,\n urlSchemeRegex,\n} from \"./constants\";\nimport type { CancelableType } from \"./types\";\n\nexport function isElement(element: mixed): boolean {\n let passed = false;\n\n try {\n if (element instanceof window.Element) {\n passed = true;\n } else if (\n element !== null &&\n typeof element === \"object\" &&\n element.nodeType === 1 &&\n typeof element.style === \"object\" &&\n typeof element.ownerDocument === \"object\"\n ) {\n passed = true;\n }\n } catch (_) {\n // we don't have an element\n }\n\n return passed;\n}\n\nexport function getFunctionName(fn: T): string {\n return fn.name || fn.__name__ || fn.displayName || \"anonymous\";\n}\n\nexport function setFunctionName(fn: T, name: string): T {\n try {\n delete fn.name;\n fn.name = name;\n } catch (err) {\n // pass\n }\n\n fn.__name__ = fn.displayName = name;\n return fn;\n}\n\nexport function base64encode(str: string): string {\n if (typeof btoa === \"function\") {\n return btoa(\n encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (m, p1) => {\n return String.fromCharCode(parseInt(p1, 16));\n })\n ).replace(/[=]/g, \"\");\n }\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"utf8\").toString(\"base64\").replace(/[=]/g, \"\");\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str: string): string {\n if (typeof atob === \"function\") {\n return decodeURIComponent(\n // $FlowFixMe[method-unbinding]\n Array.prototype.map\n .call(atob(str), (c) => {\n // eslint-disable-next-line prefer-template\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n }\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"base64\").toString(\"utf8\");\n }\n\n throw new Error(`Can not find window.atob or Buffer`);\n}\n\nexport function uniqueID(): string {\n const chars = \"0123456789abcdef\";\n\n const randomID = \"xxxxxxxxxx\".replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n const timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace(\"T\", \".\")\n )\n .replace(/[^a-zA-Z0-9]/g, \"\")\n .toLowerCase();\n\n return `uid_${randomID}_${timeID}`;\n}\n\nexport function getGlobal(): Object {\n if (typeof window !== \"undefined\") {\n return window;\n }\n if (typeof global !== \"undefined\") {\n return global;\n }\n if (typeof __GLOBAL__ !== \"undefined\") {\n return __GLOBAL__;\n }\n throw new Error(`No global found`);\n}\n\nlet objectIDs;\n\nexport function getObjectID(obj: Object): string {\n objectIDs = objectIDs || new WeakMap();\n\n if (\n obj === null ||\n obj === undefined ||\n (typeof obj !== \"object\" && typeof obj !== \"function\")\n ) {\n throw new Error(`Invalid object`);\n }\n\n let uid = objectIDs.get(obj);\n\n if (!uid) {\n uid = `${typeof obj}:${uniqueID()}`;\n objectIDs.set(obj, uid);\n }\n\n return uid;\n}\n\nfunction serializeArgs(args: $ReadOnlyArray): string {\n try {\n // $FlowFixMe[method-unbinding]\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n // Treat each distinct function as unique for purposes of memoization\n // e.g. even if someFunction.stringify() is the same, we may use a different memoize cache\n // if the actual function is different.\n if (typeof val === \"function\") {\n return `memoize[${getObjectID(val)}]`;\n }\n\n // By default JSON.stringify(domElement) returns '{}'. This ensures that stays true even for non-standard\n // elements (e.g. React-rendered dom elements) with custom properties\n if (isElement(val)) {\n return {};\n }\n\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\nexport function getEmptyObject(): {||} {\n // $FlowFixMe\n return {};\n}\n\ntype MemoizeOptions = {|\n name?: string,\n time?: number,\n thisNamespace?: boolean,\n|};\n\nconst getDefaultMemoizeOptions = (): MemoizeOptions => {\n // $FlowFixMe\n return {};\n};\n\nexport type Memoized = F & {| reset: () => void |};\n\nlet memoizeGlobalIndex = 0;\nlet memoizeGlobalIndexValidFrom = 0;\n\nexport function memoize(\n method: F,\n options?: MemoizeOptions = getDefaultMemoizeOptions()\n): Memoized {\n const { thisNamespace = false, time: cacheTime } = options;\n\n let simpleCache;\n let thisCache;\n\n let memoizeIndex = memoizeGlobalIndex;\n memoizeGlobalIndex += 1;\n\n const memoizedFunction = function memoizedFunction(...args): mixed {\n if (memoizeIndex < memoizeGlobalIndexValidFrom) {\n simpleCache = null;\n thisCache = null;\n memoizeIndex = memoizeGlobalIndex;\n memoizeGlobalIndex += 1;\n }\n\n let cache;\n\n if (thisNamespace) {\n thisCache = thisCache || new WeakMap();\n cache = thisCache.getOrSet(this, getEmptyObject);\n } else {\n cache = simpleCache = simpleCache || {};\n }\n\n let cacheKey;\n\n try {\n cacheKey = serializeArgs(args);\n } catch {\n return method.apply(this, arguments);\n }\n\n let cacheResult = cache[cacheKey];\n\n if (cacheResult && cacheTime && Date.now() - cacheResult.time < cacheTime) {\n delete cache[cacheKey];\n cacheResult = null;\n }\n\n if (cacheResult) {\n return cacheResult.value;\n }\n\n const time = Date.now();\n const value = method.apply(this, arguments);\n\n cache[cacheKey] = { time, value };\n\n return value;\n };\n\n memoizedFunction.reset = () => {\n simpleCache = null;\n thisCache = null;\n };\n\n // $FlowFixMe\n const result: F = memoizedFunction;\n\n return setFunctionName(\n result,\n `${options.name || getFunctionName(method)}::memoized`\n );\n}\n\nmemoize.clear = () => {\n memoizeGlobalIndexValidFrom = memoizeGlobalIndex;\n};\n\nexport function promiseIdentity(\n item: ZalgoPromise | T\n): ZalgoPromise {\n // $FlowFixMe\n return ZalgoPromise.resolve(item);\n}\n\nexport function memoizePromise(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => ZalgoPromise\n // eslint-disable-next-line flowtype/no-weak-types\n): (...args: $ReadOnlyArray) => ZalgoPromise {\n let cache = {};\n\n function memoizedPromiseFunction(\n // eslint-disable-next-line flowtype/no-weak-types\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n const key: string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = ZalgoPromise.try(() => method.apply(this, arguments)).finally(\n () => {\n delete cache[key];\n }\n );\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return setFunctionName(\n memoizedPromiseFunction,\n `${getFunctionName(method)}::promiseMemoized`\n );\n}\n\ntype PromisifyOptions = {|\n name?: string,\n|};\n\nconst getDefaultPromisifyOptions = (): PromisifyOptions => {\n // $FlowFixMe\n return {};\n};\n\nexport function promisify(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => R,\n options: PromisifyOptions = getDefaultPromisifyOptions()\n // eslint-disable-next-line flowtype/no-weak-types\n): (...args: $ReadOnlyArray) => ZalgoPromise {\n function promisifiedFunction(): ZalgoPromise {\n return ZalgoPromise.try(method, this, arguments);\n }\n\n if (options.name) {\n promisifiedFunction.displayName = `${options.name}:promisified`;\n }\n\n return setFunctionName(\n promisifiedFunction,\n `${getFunctionName(method)}::promisified`\n );\n}\n\nexport function inlineMemoize(\n // eslint-disable-next-line flowtype/no-weak-types\n method: (...args: $ReadOnlyArray) => R,\n // eslint-disable-next-line flowtype/no-weak-types\n logic: (...args: $ReadOnlyArray) => R,\n // eslint-disable-next-line flowtype/no-weak-types\n args: $ReadOnlyArray = []\n): R {\n // $FlowFixMe\n const cache: {| [string]: R |} = (method.__inline_memoize_cache__ =\n // $FlowFixMe\n method.__inline_memoize_cache__ || {});\n const key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n const result = (cache[key] = logic(...args));\n\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args: $ReadOnlyArray) {\n // pass\n}\n\nexport function once(method: Function): Function {\n let called = false;\n\n const onceFunction = function (): mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\n\n return setFunctionName(onceFunction, `${getFunctionName(method)}::once`);\n}\n\nexport function hashStr(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash += str[i].charCodeAt(0) * Math.pow((i % 10) + 1, 5);\n }\n return Math.floor(Math.pow(Math.sqrt(hash), 5));\n}\n\nexport function strHashStr(str: string): string {\n let hash = \"\";\n\n for (let i = 0; i < str.length; i++) {\n let total = str[i].charCodeAt(0) * i;\n\n if (str[i + 1]) {\n total += str[i + 1].charCodeAt(0) * (i - 1);\n }\n\n hash += String.fromCharCode(97 + (Math.abs(total) % 26));\n }\n\n return hash;\n}\n\nexport function match(str: string, pattern: RegExp): ?string {\n const regmatch = str.match(pattern);\n if (regmatch) {\n return regmatch[1];\n }\n}\n\nexport function awaitKey(obj: Object, key: string): ZalgoPromise {\n return new ZalgoPromise((resolve) => {\n let value = obj[key];\n\n if (value) {\n return resolve(value);\n }\n\n delete obj[key];\n\n Object.defineProperty(obj, key, {\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get(): T {\n return value;\n },\n });\n });\n}\n\nexport function stringifyError(err: mixed, level: number = 1): string {\n if (level >= 3) {\n return \"stringifyError stack overflow\";\n }\n\n try {\n if (!err) {\n // $FlowFixMe[method-unbinding]\n return ``;\n }\n\n if (typeof err === \"string\") {\n return err;\n }\n\n if (err instanceof Error) {\n const stack = err && err.stack;\n const message = err && err.message;\n\n if (stack && message) {\n if (stack.indexOf(message) !== -1) {\n return stack;\n } else {\n return `${message}\\n${stack}`;\n }\n } else if (stack) {\n return stack;\n } else if (message) {\n return message;\n }\n }\n\n if (err && err.toString && typeof err.toString === \"function\") {\n // $FlowFixMe\n return err.toString();\n }\n\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(err);\n } catch (newErr) {\n return `Error while stringifying error: ${stringifyError(\n newErr,\n level + 1\n )}`;\n }\n}\n\nexport function stringifyErrorMessage(err: mixed): string {\n // $FlowFixMe[method-unbinding]\n const defaultMessage = ``;\n\n if (!err) {\n return defaultMessage;\n }\n\n if (err instanceof Error) {\n return err.message || defaultMessage;\n }\n\n if (typeof err.message === \"string\") {\n return err.message || defaultMessage;\n }\n\n return defaultMessage;\n}\n\nexport function stringify(item: mixed): string {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && item.toString && typeof item.toString === \"function\") {\n // $FlowFixMe\n return item.toString();\n }\n\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname: string, domain: string): boolean {\n hostname = hostname.split(\"://\")[1];\n const index = hostname.indexOf(domain);\n return index !== -1 && hostname.slice(index) === domain;\n}\n\nexport function patchMethod(obj: Object, name: string, handler: Function) {\n const original = obj[name];\n\n obj[name] = function patchedMethod(): mixed {\n return handler({\n context: this,\n // $FlowFixMe[method-unbinding]\n args: Array.prototype.slice.call(arguments),\n original,\n callOriginal: () => original.apply(this, arguments),\n });\n };\n}\n\nexport function extend(obj: T, source: Object): T {\n if (!source) {\n return obj;\n }\n\n if (Object.assign) {\n return Object.assign(obj, source);\n }\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n obj[key] = source[key];\n }\n }\n\n return obj;\n}\n\nexport function values(obj: { [string]: T }): $ReadOnlyArray {\n if (Object.values) {\n // $FlowFixMe\n return Object.values(obj);\n }\n\n const result: Array = [];\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n // $FlowFixMe[escaped-generic]\n result.push(obj[key]);\n }\n }\n\n // $FlowFixMe\n return result;\n}\n\n// eslint-disable-next-line no-undef\nexport const memoizedValues: ({ [string]: T }) => $ReadOnlyArray =\n memoize(values);\n\nexport function perc(pixels: number, percentage: number): number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args: $ReadOnlyArray): number {\n return Math.min(...args);\n}\n\nexport function max(...args: $ReadOnlyArray): number {\n return Math.max(...args);\n}\n\nexport function roundUp(num: number, nearest: number): number {\n const remainder = num % nearest;\n return remainder ? num - remainder + nearest : num;\n}\n\nexport function regexMap(\n str: string,\n regexp: RegExp,\n handler: () => T\n): $ReadOnlyArray {\n const results = [];\n\n // $FlowFixMe\n str.replace(regexp, function regexMapMatcher(item) {\n results.push(handler ? handler.apply(null, arguments) : item);\n });\n\n // $FlowFixMe\n return results;\n}\n\nexport function svgToBase64(svg: string): string {\n return `data:image/svg+xml;base64,${base64encode(svg)}`;\n}\n\nexport function objFilter(\n obj: { [string]: T },\n filter?: (T, ?string) => mixed = Boolean\n): { [string]: R } {\n const result = {};\n\n for (const key in obj) {\n if (!obj.hasOwnProperty(key) || !filter(obj[key], key)) {\n continue;\n }\n\n result[key] = obj[key];\n }\n\n return result;\n}\n\nexport function identity(item: T): T {\n return item;\n}\n\nexport function regexTokenize(\n text: string,\n regexp: RegExp\n): $ReadOnlyArray {\n const result = [];\n text.replace(regexp, (token) => {\n result.push(token);\n return \"\";\n });\n return result;\n}\n\nexport function promiseDebounce(\n method: () => ZalgoPromise | T,\n delay: number = 50\n): () => ZalgoPromise {\n let promise;\n let timeout;\n\n const promiseDebounced = function (): ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n const localPromise = (promise = promise || new ZalgoPromise());\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n (result) => {\n localPromise.resolve(result);\n },\n (err) => {\n localPromise.reject(err);\n }\n );\n }, delay);\n\n return localPromise;\n };\n\n return setFunctionName(\n promiseDebounced,\n `${getFunctionName(method)}::promiseDebounced`\n );\n}\n\nexport function safeInterval(\n method: Function,\n time: number\n): {| cancel: () => void |} {\n let timeout;\n\n function loop() {\n timeout = setTimeout(() => {\n method();\n loop();\n }, time);\n }\n\n loop();\n\n return {\n cancel() {\n clearTimeout(timeout);\n },\n };\n}\n\nexport function isInteger(str: string): boolean {\n return Boolean(str.match(/^[0-9]+$/));\n}\n\nexport function isFloat(str: string): boolean {\n return Boolean(str.match(/^[0-9]+\\.[0-9]+$/));\n}\n\nexport function serializePrimitive(value: string | number | boolean): string {\n return value.toString();\n}\n\nexport function deserializePrimitive(value: string): string | number | boolean {\n if (value === \"true\") {\n return true;\n } else if (value === \"false\") {\n return false;\n } else if (isInteger(value)) {\n return parseInt(value, 10);\n } else if (isFloat(value)) {\n return parseFloat(value);\n } else {\n return value;\n }\n}\n\nexport function dotify(\n obj: Object,\n prefix: string = \"\",\n newobj: Object = {}\n): { [string]: string } {\n prefix = prefix ? `${prefix}.` : prefix;\n for (const key in obj) {\n if (\n !obj.hasOwnProperty(key) ||\n obj[key] === undefined ||\n obj[key] === null ||\n typeof obj[key] === \"function\"\n ) {\n continue;\n } else if (\n obj[key] &&\n Array.isArray(obj[key]) &&\n obj[key].length &&\n obj[key].every((val) => typeof val !== \"object\")\n ) {\n newobj[`${prefix}${key}[]`] = obj[key].join(\",\");\n } else if (obj[key] && typeof obj[key] === \"object\") {\n newobj = dotify(obj[key], `${prefix}${key}`, newobj);\n } else {\n newobj[`${prefix}${key}`] = serializePrimitive(obj[key]);\n }\n }\n return newobj;\n}\n\nexport function undotify(obj: { [string]: string }): Object {\n const result = {};\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || typeof obj[key] !== \"string\") {\n continue;\n }\n\n let value = obj[key];\n\n if (key.match(/^.+\\[\\]$/)) {\n key = key.slice(0, -2);\n value = value.split(\",\").map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n const parts = key.split(\".\");\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i + 1 === parts.length;\n const isIndex = !isLast && isInteger(parts[i + 1]);\n\n if (\n part === \"constructor\" ||\n part === \"prototype\" ||\n part === \"__proto__\"\n ) {\n throw new Error(`Disallowed key: ${part}`);\n }\n\n if (isLast) {\n // $FlowFixMe\n keyResult[part] = value;\n } else {\n // $FlowFixMe\n keyResult = keyResult[part] = keyResult[part] || (isIndex ? [] : {});\n }\n }\n }\n\n return result;\n}\n\nexport type EventEmitterType = {|\n on: (eventName: string, handler: Function) => CancelableType,\n once: (eventName: string, handler: Function) => CancelableType,\n trigger: (\n eventName: string,\n ...args: $ReadOnlyArray\n ) => ZalgoPromise,\n triggerOnce: (\n eventName: string,\n ...args: $ReadOnlyArray\n ) => ZalgoPromise,\n reset: () => void,\n|};\n\nexport function eventEmitter(): EventEmitterType {\n const triggered = {};\n let handlers = {};\n\n const emitter = {\n on(eventName: string, handler: Function): CancelableType {\n const handlerList = (handlers[eventName] = handlers[eventName] || []);\n\n handlerList.push(handler);\n\n let cancelled = false;\n\n return {\n cancel() {\n if (!cancelled) {\n cancelled = true;\n handlerList.splice(handlerList.indexOf(handler), 1);\n }\n },\n };\n },\n\n once(eventName: string, handler: Function): CancelableType {\n const listener = emitter.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(\n eventName: string,\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n const handlerList = handlers[eventName];\n const promises = [];\n\n if (handlerList) {\n for (const handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(\n eventName: string,\n ...args: $ReadOnlyArray\n ): ZalgoPromise {\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return emitter.trigger(eventName, ...args);\n },\n\n reset() {\n handlers = {};\n },\n };\n\n return emitter;\n}\n\nexport function camelToDasherize(string: string): string {\n return string.replace(/([A-Z])/g, (g) => {\n return `-${g.toLowerCase()}`;\n });\n}\n\nexport function dasherizeToCamel(string: string): string {\n return string.replace(/-([a-z])/g, (g) => {\n return g[1].toUpperCase();\n });\n}\n\nexport function capitalizeFirstLetter(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n}\n\nexport function get(item: Object, path: string, def: mixed): mixed {\n if (!path) {\n return def;\n }\n\n const pathParts = path.split(\".\");\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n // If we have an object, we can get the key\n if (typeof item === \"object\" && item !== null) {\n item = item[pathParts[i]];\n\n // Otherwise, we should return the default (undefined if not provided)\n } else {\n return def;\n }\n }\n\n // If our final result is undefined, we should return the default\n\n return item === undefined ? def : item;\n}\n\nexport function safeTimeout(method: Function, time: number) {\n const interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(\n obj: Object | $ReadOnlyArray,\n key: string | number,\n getter: () => T\n) {\n if (Array.isArray(obj)) {\n if (typeof key !== \"number\") {\n throw new TypeError(`Array key must be number`);\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n if (typeof key !== \"string\") {\n throw new TypeError(`Object key must be string`);\n }\n }\n\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: true,\n get: () => {\n // $FlowFixMe\n delete obj[key];\n const value = getter();\n // $FlowFixMe\n obj[key] = value;\n return value;\n },\n set: (value: T) => {\n // $FlowFixMe\n delete obj[key];\n // $FlowFixMe\n obj[key] = value;\n },\n });\n}\n\n// eslint-disable-next-line no-undef\nexport function arrayFrom(item: Iterable): $ReadOnlyArray {\n // $FlowFixMe[method-unbinding]\n return Array.prototype.slice.call(item);\n}\n\nexport function isObject(item: mixed): boolean {\n return typeof item === \"object\" && item !== null;\n}\n\nexport function isObjectObject(obj: mixed): boolean {\n return (\n // $FlowFixMe[method-unbinding]\n isObject(obj) && Object.prototype.toString.call(obj) === \"[object Object]\"\n );\n}\n\nexport function isPlainObject(obj: mixed): boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n const constructor = obj.constructor;\n\n if (typeof constructor !== \"function\") {\n return false;\n }\n\n const prototype = constructor.prototype;\n\n if (!isObjectObject(prototype)) {\n return false;\n }\n\n if (!prototype.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n\n return true;\n}\n\nexport function replaceObject | Object>(\n item: T,\n replacer: (mixed, string | number, string) => mixed,\n fullKey: string = \"\"\n): T {\n if (Array.isArray(item)) {\n const length = item.length;\n const result: Array = [];\n\n for (let i = 0; i < length; i++) {\n defineLazyProp(result, i, () => {\n const itemKey = fullKey ? `${fullKey}.${i}` : `${i}`;\n const el = item[i];\n\n let child = replacer(el, i, itemKey);\n\n if (isPlainObject(child) || Array.isArray(child)) {\n // $FlowFixMe\n child = replaceObject(child, replacer, itemKey);\n }\n\n return child;\n });\n }\n\n // $FlowFixMe\n return result;\n } else if (isPlainObject(item)) {\n const result = {};\n\n for (const key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n const itemKey = fullKey ? `${fullKey}.${key}` : `${key}`;\n // $FlowFixMe\n const el = item[key];\n\n let child = replacer(el, key, itemKey);\n\n if (isPlainObject(child) || Array.isArray(child)) {\n // $FlowFixMe\n child = replaceObject(child, replacer, itemKey);\n }\n\n return child;\n });\n }\n\n // $FlowFixMe\n return result;\n } else {\n throw new Error(`Pass an object or array`);\n }\n}\n\nexport function copyProp(\n source: Object,\n target: Object,\n name: string,\n def: mixed\n) {\n if (source.hasOwnProperty(name)) {\n const descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {|\n text: string,\n groups: $ReadOnlyArray,\n start: number,\n end: number,\n length: number,\n replace: (text: string) => string,\n|};\n\nexport function regex(\n pattern: string | RegExp,\n string: string,\n start: number = 0\n): ?RegexResultType {\n if (typeof pattern === \"string\") {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n const result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n const index: number = result.index;\n const regmatch = result[0];\n\n return {\n text: regmatch,\n groups: result.slice(1),\n start: start + index,\n end: start + index + regmatch.length,\n length: regmatch.length,\n\n replace(text: string): string {\n if (!regmatch) {\n return \"\";\n }\n\n return `${regmatch.slice(0, start + index)}${text}${regmatch.slice(\n index + regmatch.length\n )}`;\n },\n };\n}\n\nexport function regexAll(\n pattern: string | RegExp,\n string: string\n): $ReadOnlyArray {\n const matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const regmatch = regex(pattern, string, start);\n\n if (!regmatch) {\n break;\n }\n\n matches.push(regmatch);\n start = match.end;\n }\n\n return matches;\n}\n\nexport function isDefined(value: ?mixed): boolean {\n return value !== null && value !== undefined;\n}\n\nexport function cycle(method: Function): ZalgoPromise {\n return ZalgoPromise.try(method).then(() => cycle(method));\n}\n\nexport function debounce(\n method: (...args: $ReadOnlyArray) => T,\n time: number = 100\n): (...args: $ReadOnlyArray) => void {\n let timeout;\n\n const debounceWrapper = function () {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n\n return setFunctionName(\n debounceWrapper,\n `${getFunctionName(method)}::debounced`\n );\n}\n\nexport function isRegex(item: mixed): boolean {\n // $FlowFixMe[method-unbinding]\n return Object.prototype.toString.call(item) === \"[object RegExp]\";\n}\n\ntype FunctionProxy = (method: T) => T;\n\nexport const weakMapMemoize: FunctionProxy<*> = (\n // eslint-disable-next-line flowtype/no-weak-types\n method: (arg: any) => R\n // eslint-disable-next-line flowtype/no-weak-types\n): ((...args: $ReadOnlyArray) => R) => {\n const weakmap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n return function weakmapMemoized(arg: any): R {\n return weakmap.getOrSet(arg, () => method.call(this, arg));\n };\n};\n\ntype FunctionPromiseProxy<\n R: mixed,\n T: (...args: $ReadOnlyArray) => ZalgoPromise\n> = (T) => T;\n\nexport const weakMapMemoizePromise: FunctionPromiseProxy<*, *> = (\n // eslint-disable-next-line flowtype/no-weak-types\n method: (arg: any) => ZalgoPromise\n // eslint-disable-next-line flowtype/no-weak-types\n): ((...args: $ReadOnlyArray) => ZalgoPromise) => {\n const weakmap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n return function weakmapMemoizedPromise(arg: any): ZalgoPromise {\n return weakmap.getOrSet(arg, () =>\n method.call(this, arg).finally(() => {\n weakmap.delete(arg);\n })\n );\n };\n};\n\nexport function getOrSet(\n obj: O,\n key: string,\n getter: () => T\n): T {\n if (obj.hasOwnProperty(key)) {\n return obj[key];\n }\n\n const val = getter();\n obj[key] = val;\n return val;\n}\n\nexport type CleanupType = {|\n set: (string, T) => T, // eslint-disable-line no-undef\n register: (Function) => {| cancel: () => void |},\n all: (err?: mixed) => ZalgoPromise,\n|};\n\nexport function cleanup(obj: Object): CleanupType {\n const tasks = [];\n let cleaned = false;\n let cleanErr;\n\n const cleaner = {\n set(name: string, item: T): T {\n if (!cleaned) {\n obj[name] = item;\n cleaner.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method: Function): {| cancel: () => void |} {\n const task = once(() => method(cleanErr));\n\n if (cleaned) {\n method(cleanErr);\n } else {\n tasks.push(task);\n }\n\n return {\n cancel: () => {\n const index = tasks.indexOf(task);\n if (index !== -1) {\n tasks.splice(index, 1);\n }\n },\n };\n },\n\n all(err?: mixed): ZalgoPromise {\n cleanErr = err;\n\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.shift();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n },\n };\n\n return cleaner;\n}\n\nexport function tryCatch(\n fn: () => T\n): {| result: T, error: void |} | {| result: void, error: mixed |} {\n let result;\n let error;\n\n try {\n result = fn();\n } catch (err) {\n error = err;\n }\n\n // $FlowFixMe\n return { result, error };\n}\n\n// eslint-disable-next-line flowtype/no-mutable-array\nexport function removeFromArray>(arr: T, item: X) {\n const index = arr.indexOf(item);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n}\n\nexport function assertExists(name: string, thing: void | null | T): T {\n if (thing === null || typeof thing === \"undefined\") {\n throw new Error(`Expected ${name} to be present`);\n }\n\n return thing;\n}\n\nexport function unique(arr: $ReadOnlyArray): $ReadOnlyArray {\n const result = {};\n for (const item of arr) {\n result[item] = true;\n }\n return Object.keys(result);\n}\n\nexport const constHas = (\n constant: T,\n value: X\n): boolean => {\n return memoizedValues(constant).indexOf(value) !== -1;\n};\n\nexport function dedupeErrors(handler: (mixed) => T): (mixed) => T | void {\n const seenErrors = [];\n const seenStringifiedErrors = {};\n\n return (err) => {\n if (seenErrors.indexOf(err) !== -1) {\n return;\n }\n\n seenErrors.push(err);\n\n const stringifiedError = stringifyError(err);\n if (seenStringifiedErrors[stringifiedError]) {\n return;\n }\n\n seenStringifiedErrors[stringifiedError] = true;\n return handler(err);\n };\n}\n\nexport class ExtendableError extends Error {\n constructor(message: string) {\n super(message);\n // eslint-disable-next-line unicorn/custom-error-definition\n this.name = this.constructor.name;\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error(message).stack;\n }\n }\n}\n\nfunction isRelativeUrlWithoutProtocol(url: string): boolean {\n return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n\nfunction decodeHtmlCharacters(str: string): string {\n const removedNullByte: string = str.replace(ctrlCharactersRegex, \"\");\n return removedNullByte.replace(htmlEntitiesRegex, (matchRegex, dec) => {\n return String.fromCharCode(dec);\n });\n}\n\nexport function sanitizeUrl(url?: string): string {\n if (!url) {\n return BLANK_URL;\n }\n\n const sanitizedUrl = decodeHtmlCharacters(url)\n .replace(htmlCtrlEntityRegex, \"\")\n .replace(ctrlCharactersRegex, \"\")\n .trim();\n\n if (!sanitizedUrl) {\n return BLANK_URL;\n }\n\n if (isRelativeUrlWithoutProtocol(sanitizedUrl)) {\n return sanitizedUrl;\n }\n\n const urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n\n if (!urlSchemeParseResults) {\n return sanitizedUrl;\n }\n\n const urlScheme = urlSchemeParseResults[0];\n\n if (invalidProtocolRegex.test(urlScheme)) {\n return BLANK_URL;\n }\n\n return sanitizedUrl;\n}\n","/* @flow */\n/* eslint max-lines: off */\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport {\n linkFrameWindow,\n isWindowClosed,\n assertSameDomain,\n type SameDomainWindowType,\n type CrossDomainWindowType,\n} from \"@krakenjs/cross-domain-utils/src\";\nimport { WeakMap } from \"@krakenjs/cross-domain-safe-weakmap/src\";\n\nimport {\n isElement,\n inlineMemoize,\n memoize,\n noop,\n stringify,\n capitalizeFirstLetter,\n once,\n extend,\n safeInterval,\n uniqueID,\n arrayFrom,\n ExtendableError,\n strHashStr,\n} from \"./util\";\nimport { isDevice } from \"./device\";\nimport { KEY_CODES, ATTRIBUTES, UID_HASH_LENGTH } from \"./constants\";\nimport type { CancelableType } from \"./types\";\n\ntype ElementRefType = string | HTMLElement;\n\nexport function getBody(): HTMLBodyElement {\n // eslint-disable-next-line compat/compat\n const body = document.body;\n\n if (!body) {\n throw new Error(`Body element not found`);\n }\n\n return body;\n}\n\nexport function isDocumentReady(): boolean {\n // eslint-disable-next-line compat/compat\n return Boolean(document.body) && document.readyState === \"complete\";\n}\n\nexport function isDocumentInteractive(): boolean {\n // eslint-disable-next-line compat/compat\n return Boolean(document.body) && document.readyState === \"interactive\";\n}\n\nexport function urlEncode(str: string): string {\n return encodeURIComponent(str);\n}\n\nexport function waitForWindowReady(): ZalgoPromise {\n return inlineMemoize(waitForWindowReady, (): ZalgoPromise => {\n return new ZalgoPromise((resolve) => {\n if (isDocumentReady()) {\n resolve();\n }\n\n window.addEventListener(\"load\", () => resolve());\n });\n });\n}\n\ntype WaitForDocumentReady = () => ZalgoPromise;\n\nexport const waitForDocumentReady: WaitForDocumentReady = memoize(() => {\n return new ZalgoPromise((resolve) => {\n if (isDocumentReady() || isDocumentInteractive()) {\n return resolve();\n }\n\n const interval = setInterval(() => {\n if (isDocumentReady() || isDocumentInteractive()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n});\n\nexport function waitForDocumentBody(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (document.body) {\n return document.body;\n }\n\n return waitForDocumentReady().then(() => {\n if (document.body) {\n return document.body;\n }\n\n throw new Error(\"Document ready but document.body not present\");\n });\n });\n}\n\nexport function parseQuery(queryString: string): Object {\n return inlineMemoize(\n parseQuery,\n (): Object => {\n const params = {};\n\n if (!queryString) {\n return params;\n }\n\n if (queryString.indexOf(\"=\") === -1) {\n return params;\n }\n\n for (let pair of queryString.split(\"&\")) {\n pair = pair.split(\"=\");\n\n if (pair[0] && pair[1]) {\n params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n\n return params;\n },\n [queryString]\n );\n}\n\nexport function getQueryParam(name: string): string {\n return parseQuery(window.location.search.slice(1))[name];\n}\n\nexport function urlWillRedirectPage(url: string): boolean {\n if (url.indexOf(\"#\") === -1) {\n return true;\n }\n\n if (url.indexOf(\"#\") === 0) {\n return false;\n }\n\n if (url.split(\"#\")[0] === window.location.href.split(\"#\")[0]) {\n return false;\n }\n\n return true;\n}\n\nexport type Query = {\n [string]: boolean | string,\n};\n\nexport function formatQuery(obj: Query = {}): string {\n return Object.keys(obj)\n .filter((key) => {\n return typeof obj[key] === \"string\" || typeof obj[key] === \"boolean\";\n })\n .map((key) => {\n const val = obj[key];\n\n if (typeof val !== \"string\" && typeof val !== \"boolean\") {\n throw new TypeError(`Invalid type for query`);\n }\n\n return `${urlEncode(key)}=${urlEncode(val.toString())}`;\n })\n .join(\"&\");\n}\n\nexport function extendQuery(originalQuery: string, props: Query = {}): string {\n if (!props || !Object.keys(props).length) {\n return originalQuery;\n }\n\n return formatQuery({\n ...parseQuery(originalQuery),\n ...props,\n });\n}\n\nexport function extendUrl(\n url: string,\n options: {| query?: Query, hash?: Query |}\n): string {\n const query = options.query || {};\n const hash = options.hash || {};\n\n let originalUrl;\n let originalQuery;\n let originalHash;\n\n [originalUrl, originalHash] = url.split(\"#\");\n [originalUrl, originalQuery] = originalUrl.split(\"?\");\n\n const queryString = extendQuery(originalQuery, query);\n const hashString = extendQuery(originalHash, hash);\n\n if (queryString) {\n originalUrl = `${originalUrl}?${queryString}`;\n }\n\n if (hashString) {\n originalUrl = `${originalUrl}#${hashString}`;\n }\n\n return originalUrl;\n}\n\nexport function redirect(\n url: string,\n win: CrossDomainWindowType = window\n): ZalgoPromise {\n return new ZalgoPromise((resolve) => {\n win.location = url;\n if (!urlWillRedirectPage(url)) {\n resolve();\n }\n });\n}\n\nexport function hasMetaViewPort(): boolean {\n const meta = document.querySelector(\"meta[name=viewport]\");\n\n if (isDevice() && window.screen.width < 660 && !meta) {\n return false;\n }\n\n return true;\n}\n\nexport function isElementVisible(el: HTMLElement): boolean {\n return Boolean(\n el.offsetWidth || el.offsetHeight || el.getClientRects().length\n );\n}\n\nexport function getPerformance(): ?Performance {\n return inlineMemoize(getPerformance, (): ?Performance => {\n const performance = window.performance;\n\n if (\n performance &&\n performance.now &&\n performance.timing &&\n performance.timing.connectEnd &&\n performance.timing.navigationStart &&\n Math.abs(performance.now() - Date.now()) > 1000 &&\n performance.now() -\n (performance.timing.connectEnd - performance.timing.navigationStart) >\n 0\n ) {\n return performance;\n }\n });\n}\n\nexport function enablePerformance(): boolean {\n return Boolean(getPerformance());\n}\n\nexport function getPageRenderTime(): ZalgoPromise {\n return waitForDocumentReady().then(() => {\n const performance = getPerformance();\n\n if (!performance) {\n return;\n }\n\n const timing = performance.timing;\n\n if (timing.connectEnd && timing.domInteractive) {\n return timing.domInteractive - timing.connectEnd;\n }\n });\n}\n\nexport function htmlEncode(html: string = \"\"): string {\n return html\n .toString()\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n .replace(/\\//g, \"/\");\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && window.location !== undefined;\n}\n\nexport function querySelectorAll(\n selector: string,\n doc: HTMLElement = window.document\n): $ReadOnlyArray {\n // $FlowFixMe[method-unbinding]\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\n/**\n * Sets up event handlers for click events and\n * enter/space keypresses.\n * @callback handler\n * @param {HTMLElement} element\n * @param {handler} handler\n */\nexport function onClick(element: HTMLElement, handler: (Event) => void) {\n element.addEventListener(\"touchstart\", noop, { passive: true });\n element.addEventListener(\"click\", handler);\n element.addEventListener(\"keypress\", (event: Event) => {\n if (\n // $FlowFixMe\n event.keyCode === KEY_CODES.ENTER ||\n // $FlowFixMe\n event.keyCode === KEY_CODES.SPACE\n ) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({\n host = window.location.host,\n path,\n reverse = false,\n}: {|\n host?: string,\n path: string,\n reverse?: boolean,\n|}): ?HTMLScriptElement {\n return inlineMemoize(\n getScript,\n (): ?HTMLScriptElement => {\n const url = `${host}${path}`;\n // $FlowFixMe[method-unbinding]\n const scripts = Array.prototype.slice.call(\n document.getElementsByTagName(\"script\")\n );\n\n if (reverse) {\n scripts.reverse();\n }\n\n for (const script of scripts) {\n if (!script.src) {\n continue;\n }\n\n const src = script.src.replace(/^https?:\\/\\//, \"\").split(\"?\")[0];\n\n if (src === url) {\n return script;\n }\n }\n },\n [path]\n );\n}\n\nexport function isLocalStorageEnabled(): boolean {\n return inlineMemoize(isLocalStorageEnabled, () => {\n try {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n if (window.localStorage) {\n const value = Math.random().toString();\n window.localStorage.setItem(\"__test__localStorage__\", value);\n const result = window.localStorage.getItem(\"__test__localStorage__\");\n window.localStorage.removeItem(\"__test__localStorage__\");\n if (value === result) {\n return true;\n }\n }\n } catch (err) {\n // pass\n }\n return false;\n });\n}\n\nexport function getBrowserLocales(): $ReadOnlyArray<{|\n country?: string,\n lang: string,\n|}> {\n const nav = window.navigator;\n\n const locales = nav.languages ? [...nav.languages] : [];\n\n if (nav.language) {\n locales.push(nav.language);\n }\n\n if (nav.userLanguage) {\n locales.push(nav.userLanguage);\n }\n\n return locales\n .map((locale) => {\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n const [lang, country] = locale.split(/[-_]/);\n return { country, lang };\n }\n\n if (locale && locale.match(/^[a-z]{2}$/)) {\n return { lang: locale };\n }\n\n return null;\n })\n .filter(Boolean);\n}\n\nexport function appendChild(container: HTMLElement, child: HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function getElementSafe(\n id: ElementRefType,\n doc: Document | HTMLElement = document\n): ?HTMLElement {\n if (isElement(id)) {\n // $FlowFixMe\n return id;\n }\n\n if (typeof id === \"string\") {\n return doc.querySelector(id);\n }\n}\n\nexport function getElement(\n id: ElementRefType,\n doc: Document | HTMLElement = document\n): HTMLElement {\n const element = getElementSafe(id, doc);\n\n if (element) {\n return element;\n }\n\n throw new Error(`Can not find element: ${stringify(id)}`);\n}\n\nexport function elementReady(id: ElementRefType): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n const name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(\n new Error(`Document is ready and element ${name} does not exist`)\n );\n }\n\n const interval = setInterval(() => {\n el = getElementSafe(id);\n\n if (el) {\n resolve(el);\n clearInterval(interval);\n return;\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(\n new Error(`Document is ready and element ${name} does not exist`)\n );\n }\n }, 10);\n });\n}\n\n// eslint-disable-next-line unicorn/custom-error-definition\nexport class PopupOpenError extends ExtendableError {}\n\ntype PopupOptions = {|\n name?: string,\n width?: number,\n height?: number,\n top?: number,\n left?: number,\n status?: 0 | 1,\n resizable?: 0 | 1,\n toolbar?: 0 | 1,\n menubar?: 0 | 1,\n scrollbars?: 0 | 1,\n closeOnUnload?: 0 | 1,\n|};\n\nexport function popup(\n url: string,\n options?: PopupOptions\n): CrossDomainWindowType {\n // $FlowFixMe\n options = options || {};\n\n const { closeOnUnload = 1, name = \"\", width, height } = options;\n\n let top = 0;\n let left = 0;\n\n if (width) {\n if (window.outerWidth) {\n left = Math.round((window.outerWidth - width) / 2) + window.screenX;\n } else if (window.screen.width) {\n left = Math.round((window.screen.width - width) / 2);\n }\n }\n\n if (height) {\n if (window.outerHeight) {\n top = Math.round((window.outerHeight - height) / 2) + window.screenY;\n } else if (window.screen.height) {\n top = Math.round((window.screen.height - height) / 2);\n }\n }\n\n delete options.closeOnUnload;\n delete options.name;\n\n if (width && height) {\n // $FlowFixMe\n options = {\n top,\n left,\n width,\n height,\n status: 1,\n toolbar: 0,\n menubar: 0,\n resizable: 1,\n scrollbars: 1,\n ...options,\n };\n }\n\n const params = Object.keys(options)\n // eslint-disable-next-line array-callback-return\n .map((key) => {\n // $FlowFixMe\n if (options[key] !== null && options[key] !== undefined) {\n return `${key}=${stringify(options[key])}`;\n }\n })\n .filter(Boolean)\n .join(\",\");\n\n let win;\n\n try {\n win = window.open(url, name, params);\n } catch (err) {\n throw new PopupOpenError(\n `Can not open popup window - ${err.stack || err.message}`\n );\n }\n\n if (isWindowClosed(win)) {\n const err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n if (closeOnUnload) {\n window.addEventListener(\"beforeunload\", () => {\n win.close();\n });\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", () => {\n win.close();\n });\n } else {\n window.addEventListener(\"unload\", () => {\n win.close();\n });\n }\n }\n\n return win;\n}\n\nexport function writeToWindow(win: SameDomainWindowType, html: string) {\n try {\n win.document.open();\n win.document.write(html);\n win.document.close();\n } catch (err) {\n try {\n win.location = `javascript: document.open(); document.write(${JSON.stringify(\n html\n )}); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(\n win: SameDomainWindowType,\n el: HTMLElement\n) {\n const tag = el.tagName.toLowerCase();\n\n if (tag !== \"html\") {\n throw new Error(`Expected element to be html, got ${tag}`);\n }\n\n const documentElement = win.document.documentElement;\n\n for (const child of arrayFrom(documentElement.children)) {\n documentElement.removeChild(child);\n }\n\n for (const child of arrayFrom(el.children)) {\n documentElement.appendChild(child);\n }\n}\n\nexport function setStyle(\n el: HTMLElement,\n styleText: string,\n doc: Document = window.document\n) {\n // $FlowFixMe\n if (el.styleSheet) {\n // $FlowFixMe\n el.styleSheet.cssText = styleText;\n } else {\n el.appendChild(doc.createTextNode(styleText));\n }\n}\n\nexport type ElementOptionsType = {|\n style?: { [string]: string },\n id?: string,\n class?: ?$ReadOnlyArray,\n attributes?: { [string]: string },\n styleSheet?: ?string,\n html?: ?string,\n|};\n\nlet awaitFrameLoadPromises: WeakMap<\n HTMLIFrameElement,\n ZalgoPromise\n>;\n\nexport function awaitFrameLoad(\n frame: HTMLIFrameElement\n): ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n const promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n const promise = new ZalgoPromise((resolve, reject) => {\n frame.addEventListener(\"load\", () => {\n linkFrameWindow(frame);\n resolve(frame);\n });\n\n frame.addEventListener(\"error\", (err: Event) => {\n if (frame.contentWindow) {\n resolve(frame);\n } else {\n reject(err);\n }\n });\n });\n\n awaitFrameLoadPromises.set(frame, promise);\n\n return promise;\n}\n\nexport function awaitFrameWindow(\n frame: HTMLIFrameElement\n): ZalgoPromise {\n return awaitFrameLoad(frame).then((loadedFrame) => {\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nconst getDefaultCreateElementOptions = (): ElementOptionsType => {\n // $FlowFixMe\n return {};\n};\n\nexport function createElement(\n tag: string = \"div\",\n options: ElementOptionsType = getDefaultCreateElementOptions(),\n container: ?HTMLElement\n): HTMLElement {\n tag = tag.toLowerCase();\n const element = document.createElement(tag);\n\n if (options.style) {\n extend(element.style, options.style);\n }\n\n if (options.class) {\n element.className = options.class.join(\" \");\n }\n\n if (options.id) {\n element.setAttribute(\"id\", options.id);\n }\n\n if (options.attributes) {\n for (const key of Object.keys(options.attributes)) {\n element.setAttribute(key, options.attributes[key]);\n }\n }\n\n if (options.styleSheet) {\n setStyle(element, options.styleSheet);\n }\n\n if (container) {\n appendChild(container, element);\n }\n\n if (options.html) {\n if (tag === \"iframe\") {\n // $FlowFixMe\n if (!container || !element.contentWindow) {\n throw new Error(\n `Iframe html can not be written unless container provided and iframe in DOM`\n );\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\ntype StringMap = {|\n [string]: string,\n|};\n\nexport type IframeElementOptionsType = {|\n style?: StringMap,\n class?: ?$ReadOnlyArray,\n attributes?: StringMap,\n styleSheet?: ?string,\n html?: ?string,\n url?: ?string,\n|};\n\nconst getDefaultIframeOptions = (): IframeElementOptionsType => {\n // $FlowFixMe\n return {};\n};\n\nconst getDefaultStringMap = (): StringMap => {\n // $FlowFixMe\n return {};\n};\n\nexport function iframe(\n options: IframeElementOptionsType = getDefaultIframeOptions(),\n container: ?HTMLElement\n): HTMLIFrameElement {\n const attributes = options.attributes || getDefaultStringMap();\n const style = options.style || getDefaultStringMap();\n\n // $FlowFixMe\n const newAttributes = {\n allowTransparency: \"true\",\n ...attributes,\n };\n\n // $FlowFixMe\n const newStyle = {\n backgroundColor: \"transparent\",\n border: \"none\",\n ...style,\n };\n\n const frame = createElement(\"iframe\", {\n attributes: newAttributes,\n style: newStyle,\n html: options.html,\n class: options.class,\n });\n\n const isIE = window.navigator.userAgent.match(/MSIE|Edge/i);\n\n if (!frame.hasAttribute(\"id\")) {\n frame.setAttribute(\"id\", uniqueID());\n }\n\n // $FlowFixMe\n awaitFrameLoad(frame);\n\n if (container) {\n const el = getElement(container);\n el.appendChild(frame);\n }\n\n if (options.url || isIE) {\n frame.setAttribute(\"src\", options.url || \"about:blank\");\n }\n\n // $FlowFixMe\n return frame;\n}\n\nexport function addEventListener(\n obj: HTMLElement,\n event: string,\n handler: (event: Event) => void\n): CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n },\n };\n}\n\nexport function bindEvents(\n element: HTMLElement,\n eventNames: $ReadOnlyArray,\n handler: (event: Event) => void\n): CancelableType {\n handler = once(handler);\n\n for (const eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (const eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n }),\n };\n}\n\nconst VENDOR_PREFIXES = [\"webkit\", \"moz\", \"ms\", \"o\"];\n\nexport function setVendorCSS(\n element: HTMLElement,\n name: string,\n value: string\n) {\n // $FlowFixMe\n element.style[name] = value;\n\n const capitalizedName = capitalizeFirstLetter(name);\n\n for (const prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${prefix}${capitalizedName}`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [\n \"animationstart\",\n \"webkitAnimationStart\",\n \"oAnimationStart\",\n \"MSAnimationStart\",\n];\nconst ANIMATION_END_EVENTS = [\n \"animationend\",\n \"webkitAnimationEnd\",\n \"oAnimationEnd\",\n \"MSAnimationEnd\",\n];\n\nexport function animate(\n element: ElementRefType,\n name: string,\n clean: (Function) => void,\n timeout: number = 1000\n): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n const el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n // eslint-disable-next-line prefer-const\n let startTimeout;\n let endTimeout;\n // eslint-disable-next-line prefer-const\n let startEvent;\n // eslint-disable-next-line prefer-const\n let endEvent;\n\n function cleanUp() {\n clearTimeout(startTimeout);\n clearTimeout(endTimeout);\n startEvent.cancel();\n endEvent.cancel();\n }\n\n startEvent = bindEvents(el, ANIMATION_START_EVENTS, (event) => {\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n clearTimeout(startTimeout);\n\n event.stopPropagation();\n\n startEvent.cancel();\n hasStarted = true;\n\n endTimeout = setTimeout(() => {\n cleanUp();\n resolve();\n }, timeout);\n });\n\n endEvent = bindEvents(el, ANIMATION_END_EVENTS, (event) => {\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n if (\n // $FlowFixMe\n typeof event.animationName === \"string\" &&\n event.animationName !== name\n ) {\n return reject(\n `Expected animation name to be ${name}, found ${event.animationName}`\n );\n }\n\n return resolve();\n });\n\n setVendorCSS(el, \"animationName\", name);\n\n startTimeout = setTimeout(() => {\n if (!hasStarted) {\n cleanUp();\n return resolve();\n }\n }, 200);\n\n if (clean) {\n clean(cleanUp);\n }\n });\n}\n\nexport function makeElementVisible(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"\");\n}\n\nexport function makeElementInvisible(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"hidden\", \"important\");\n}\n\nexport function showElement(element: HTMLElement) {\n element.style.setProperty(\"display\", \"\");\n}\n\nexport function hideElement(element: HTMLElement) {\n element.style.setProperty(\"display\", \"none\", \"important\");\n}\n\nexport function destroyElement(element: HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(\n element: HTMLElement,\n name: string,\n clean: (Function) => void\n): ZalgoPromise {\n const animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(\n element: HTMLElement,\n name: string,\n clean: (Function) => void\n): ZalgoPromise {\n return animate(element, name, clean).then(() => {\n hideElement(element);\n });\n}\n\nexport function addClass(element: HTMLElement, name: string) {\n element.classList.add(name);\n}\n\nexport function removeClass(element: HTMLElement, name: string) {\n element.classList.remove(name);\n}\n\nexport function isElementClosed(el: HTMLElement): boolean {\n if (\n !el ||\n !el.parentNode ||\n !el.ownerDocument ||\n !el.ownerDocument.documentElement ||\n !el.ownerDocument.documentElement.contains(el)\n ) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(\n element: HTMLElement,\n handler: () => mixed,\n options?: {| isBfcacheEnabled?: boolean |}\n): CancelableType {\n const { isBfcacheEnabled = false } = options || {};\n // eslint-disable-next-line no-console\n console.log(\n `[bfcache-belter] watchElementForClose called with isBfcacheEnabled=${String(\n isBfcacheEnabled\n )}`\n );\n handler = once(handler);\n const terminationEvent = \"onpagehide\" in window ? \"pagehide\" : \"unload\";\n // eslint-disable-next-line no-console\n console.log(`[bfcache-belter] terminationEvent=${terminationEvent}`);\n\n let cancelled = false;\n const mutationObservers = [];\n // eslint-disable-next-line prefer-const\n let interval;\n // eslint-disable-next-line prefer-const\n let sacrificialFrame;\n let sacrificialFrameWin;\n\n const cancel = () => {\n cancelled = true;\n for (const observer of mutationObservers) {\n observer.disconnect();\n }\n if (interval) {\n interval.cancel();\n }\n if (sacrificialFrameWin) {\n /* eslint-disable no-use-before-define */\n sacrificialFrameWin.removeEventListener(\n terminationEvent,\n elementClosedOnTermination\n );\n /* eslint-enable no-use-before-define */\n }\n if (sacrificialFrame) {\n destroyElement(sacrificialFrame);\n }\n };\n\n const elementClosed = () => {\n if (!cancelled) {\n handler();\n cancel();\n }\n };\n\n const elementClosedOnTermination = (event) => {\n // eslint-disable-next-line no-console\n console.log(\n `[bfcache-belter] sacrificial iframe ${terminationEvent} fired, persisted=${\n event.persisted\n }, isBfcacheEnabled=${String(isBfcacheEnabled)}`\n );\n if (\n isBfcacheEnabled &&\n terminationEvent === \"pagehide\" &&\n event.persisted\n ) {\n // eslint-disable-next-line no-console\n console.log(\n \"[bfcache-belter] skipping elementClosed (page entering bfcache)\"\n );\n return;\n }\n // eslint-disable-next-line no-console\n console.log(\"[bfcache-belter] calling elementClosed (real navigation)\");\n elementClosed();\n };\n\n if (isElementClosed(element)) {\n elementClosed();\n return { cancel };\n }\n\n // Strategy 1: Mutation observer\n\n if (window.MutationObserver) {\n let mutationElement = element.parentElement;\n while (mutationElement) {\n const mutationObserver = new window.MutationObserver(() => {\n if (isElementClosed(element)) {\n elementClosed();\n }\n });\n\n mutationObserver.observe(mutationElement, { childList: true });\n mutationObservers.push(mutationObserver);\n mutationElement = mutationElement.parentElement;\n }\n }\n\n // Strategy 2: Sacrificial iframe\n\n sacrificialFrame = document.createElement(\"iframe\");\n sacrificialFrame.setAttribute(\"name\", `__detect_close_${uniqueID()}__`);\n sacrificialFrame.style.display = \"none\";\n // eslint-disable-next-line no-console\n console.log(\"[bfcache-belter] sacrificial iframe created\");\n awaitFrameWindow(sacrificialFrame).then((frameWin) => {\n sacrificialFrameWin = assertSameDomain(frameWin);\n sacrificialFrameWin.addEventListener(\n terminationEvent,\n elementClosedOnTermination\n );\n // eslint-disable-next-line no-console\n console.log(\n `[bfcache-belter] event listener attached to sacrificial iframe for ${terminationEvent}`\n );\n });\n element.appendChild(sacrificialFrame);\n\n // Strategy 3: Poller\n\n const check = () => {\n if (isElementClosed(element)) {\n elementClosed();\n }\n };\n interval = safeInterval(check, 1000);\n\n return { cancel };\n}\n\nexport function fixScripts(el: HTMLElement, doc: Document = window.document) {\n for (const script of querySelectorAll(\"script\", el)) {\n const parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n const newScript = doc.createElement(\"script\");\n newScript.text = script.textContent;\n parentNode.replaceChild(newScript, script);\n }\n}\n\ntype OnResizeOptions = {|\n width?: boolean,\n height?: boolean,\n interval?: number,\n win?: SameDomainWindowType,\n|};\n\nexport function onResize(\n el: HTMLElement,\n handler: ({| width: number, height: number |}) => void,\n {\n width = true,\n height = true,\n interval = 100,\n win = window,\n }: OnResizeOptions = {}\n): {| cancel: () => void |} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n let canceled = false;\n\n handler({ width: currentWidth, height: currentHeight });\n\n const check = () => {\n if (canceled || !isElementVisible(el)) {\n return;\n }\n\n const newWidth = el.offsetWidth;\n const newHeight = el.offsetHeight;\n\n if (\n (width && newWidth !== currentWidth) ||\n (height && newHeight !== currentHeight)\n ) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n win.addEventListener(\"resize\", check);\n\n if (typeof win.ResizeObserver !== \"undefined\") {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n timeout = safeInterval(check, interval * 10);\n } else if (typeof win.MutationObserver !== \"undefined\") {\n observer = new win.MutationObserver(check);\n observer.observe(el, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: false,\n });\n timeout = safeInterval(check, interval * 10);\n } else {\n timeout = safeInterval(check, interval);\n }\n\n return {\n cancel: () => {\n canceled = true;\n observer.disconnect();\n window.removeEventListener(\"resize\", check);\n timeout.cancel();\n },\n };\n}\n\nexport function getResourceLoadTime(url: string): ?number {\n const performance = getPerformance();\n\n if (!performance) {\n return;\n }\n\n // $FlowFixMe[method-unbinding]\n if (typeof performance.getEntries !== \"function\") {\n return;\n }\n\n const entries = performance.getEntries();\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n\n if (\n entry &&\n entry.name &&\n entry.name.indexOf(url) === 0 &&\n typeof entry.duration === \"number\"\n ) {\n return Math.floor(entry.duration);\n }\n }\n}\n\nexport function isShadowElement(element: Node): boolean {\n while (element.parentNode) {\n element = element.parentNode;\n }\n\n return element.toString() === \"[object ShadowRoot]\";\n}\n\nexport function getShadowRoot(element: Node): ?Node {\n while (element.parentNode) {\n element = element.parentNode;\n }\n\n if (isShadowElement(element)) {\n return element;\n }\n}\n\nexport function getShadowHost(element: Node): ?HTMLElement {\n const shadowRoot = getShadowRoot(element);\n\n // $FlowFixMe\n if (shadowRoot && shadowRoot.host) {\n // $FlowFixMe\n return shadowRoot.host;\n }\n}\n\nexport function insertShadowSlot(element: HTMLElement): HTMLElement {\n const shadowHost = getShadowHost(element);\n\n if (!shadowHost) {\n throw new Error(`Element is not in shadow dom`);\n }\n\n const slotName = `shadow-slot-${uniqueID()}`;\n const slot = document.createElement(\"slot\");\n slot.setAttribute(\"name\", slotName);\n element.appendChild(slot);\n\n const slotProvider = document.createElement(\"div\");\n slotProvider.setAttribute(\"slot\", slotName);\n shadowHost.appendChild(slotProvider);\n\n if (isShadowElement(shadowHost)) {\n return insertShadowSlot(slotProvider);\n }\n\n return slotProvider;\n}\n\nexport function preventClickFocus(el: HTMLElement) {\n const onFocus = (event: Event) => {\n el.removeEventListener(\"focus\", onFocus);\n event.preventDefault();\n el.blur();\n return false;\n };\n\n el.addEventListener(\"mousedown\", () => {\n el.addEventListener(\"focus\", onFocus);\n setTimeout(() => {\n el.removeEventListener(\"focus\", onFocus);\n }, 1);\n });\n}\n\nexport function getStackTrace(): string {\n try {\n throw new Error(\"_\");\n } catch (err) {\n return err.stack || \"\";\n }\n}\n\nfunction inferCurrentScript(): ?HTMLScriptElement {\n try {\n const stack = getStackTrace();\n const stackDetails = /.*at [^(]*\\((.*):(.+):(.+)\\)$/gi.exec(stack);\n const scriptLocation = stackDetails && stackDetails[1];\n\n if (!scriptLocation) {\n return;\n }\n\n // $FlowFixMe[method-unbinding]\n for (const script of Array.prototype.slice\n .call(document.getElementsByTagName(\"script\"))\n .reverse()) {\n if (script.src && script.src === scriptLocation) {\n return script;\n }\n }\n } catch (err) {\n // pass\n }\n}\n\nlet currentScript =\n // eslint-disable-next-line compat/compat\n typeof document !== \"undefined\" ? document.currentScript : null;\n\ntype GetCurrentScript = () => HTMLScriptElement;\n\nexport const getCurrentScript: GetCurrentScript = memoize(() => {\n if (currentScript) {\n return currentScript;\n }\n\n currentScript = inferCurrentScript();\n\n if (currentScript) {\n return currentScript;\n }\n\n throw new Error(\"Can not determine current script\");\n});\n\nconst currentUID = uniqueID();\n\ntype GetCurrentScriptUID = () => string;\n\nexport const getCurrentScriptUID: GetCurrentScriptUID = memoize(() => {\n let script;\n\n try {\n script = getCurrentScript();\n } catch (err) {\n return currentUID;\n }\n\n let uid = script.getAttribute(ATTRIBUTES.UID);\n\n if (uid && typeof uid === \"string\") {\n return uid;\n }\n\n uid = script.getAttribute(`${ATTRIBUTES.UID}-auto`);\n\n if (uid && typeof uid === \"string\") {\n return uid;\n }\n\n if (script.src) {\n const { src, dataset } = script;\n const stringToHash = JSON.stringify({ src, dataset });\n const hashedString = strHashStr(stringToHash);\n const hashResult = hashedString.slice(\n hashedString.length - UID_HASH_LENGTH\n );\n\n uid = `uid_${hashResult}`;\n } else {\n uid = uniqueID();\n }\n\n script.setAttribute(`${ATTRIBUTES.UID}-auto`, uid);\n\n return uid;\n});\n\ntype SubmitFormOptions = {|\n url: string,\n target: string,\n body?: {| [string]: string | boolean |},\n method?: string,\n|};\n\nexport function submitForm({\n url,\n target,\n body,\n method = \"post\",\n}: SubmitFormOptions) {\n const form = document.createElement(\"form\");\n form.setAttribute(\"target\", target);\n form.setAttribute(\"method\", method);\n form.setAttribute(\"action\", url);\n form.style.display = \"none\";\n\n if (body) {\n for (const key of Object.keys(body)) {\n const input = document.createElement(\"input\");\n input.setAttribute(\"name\", key);\n input.setAttribute(\"value\", body[key]?.toString());\n form.appendChild(input);\n }\n }\n\n getBody().appendChild(form);\n form.submit();\n getBody().removeChild(form);\n}\n","/* @flow */\n\nimport { uniqueID, getGlobal, inlineMemoize } from \"./util\";\nimport { isLocalStorageEnabled } from \"./dom\";\n\ntype Getter = (handler: (Object) => T) => T;\n\nexport type Storage = {|\n getState: Getter<*>,\n getID: () => string,\n isStateFresh: () => boolean,\n getSessionState: Getter<*>,\n getSessionID: () => string,\n|};\n\nconst DEFAULT_SESSION_STORAGE = 20 * 60 * 1000;\n\nexport function getStorage({\n name,\n lifetime = DEFAULT_SESSION_STORAGE,\n // a sticky session id helps to identify sdk sessions that were created by other sdks\n // like the situation where the Braintree SDK loads the PP SDK\n stickySessionId,\n}: {|\n name: string,\n lifetime?: number,\n stickySessionId?: string,\n|}): Storage {\n return inlineMemoize(\n getStorage,\n () => {\n const STORAGE_KEY = `__${name}_storage__`;\n const newStateID = uniqueID();\n\n let accessedStorage;\n\n function getState(handler: (storage: Object) => T): T {\n const localStorageEnabled = isLocalStorageEnabled();\n let storage;\n\n if (accessedStorage) {\n storage = accessedStorage;\n }\n\n if (!storage && localStorageEnabled) {\n const rawStorage = window.localStorage.getItem(STORAGE_KEY);\n\n if (rawStorage) {\n storage = JSON.parse(rawStorage);\n }\n }\n\n if (!storage) {\n storage = getGlobal()[STORAGE_KEY];\n }\n\n if (!storage) {\n storage = {\n id: newStateID,\n };\n }\n\n if (!storage.id) {\n storage.id = newStateID;\n }\n\n accessedStorage = storage;\n\n const result = handler(storage);\n\n if (localStorageEnabled) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(storage));\n } else {\n getGlobal()[STORAGE_KEY] = storage;\n }\n\n accessedStorage = null;\n\n return result;\n }\n\n function getID(): string {\n return getState((storage) => storage.id);\n }\n\n function isStateFresh(): boolean {\n return getID() === newStateID;\n }\n\n function getSession(handler: (state: Object) => T): T {\n return getState((storage) => {\n let session = storage.__session__;\n const now = Date.now();\n\n if (session && now - session.created > lifetime) {\n session = null;\n }\n\n if (!session) {\n session = {\n guid: stickySessionId || uniqueID(),\n created: now,\n };\n }\n\n storage.__session__ = session;\n\n return handler(session);\n });\n }\n\n function getSessionState(handler: (state: Object) => T): T {\n return getSession((session) => {\n session.state = session.state || {};\n return handler(session.state);\n });\n }\n\n function getSessionID(): string {\n return getSession((session) => session.guid);\n }\n\n return {\n getState,\n getID,\n isStateFresh,\n getSessionState,\n getSessionID,\n };\n },\n [{ name, lifetime }]\n );\n}\n","/* @flow */\n\nimport { noop } from \"./util\";\nimport { getStorage } from \"./storage\";\n\nfunction getBelterExperimentStorage(): Object {\n return getStorage({ name: \"belter_experiment\" });\n}\n\nfunction isEventUnique(name: string): boolean {\n return getBelterExperimentStorage().getSessionState((state) => {\n state.loggedBeacons = state.loggedBeacons || [];\n\n if (state.loggedBeacons.indexOf(name) === -1) {\n state.loggedBeacons.push(name);\n return true;\n }\n\n return false;\n });\n}\n\ntype Payload = {\n [string]: ?(string | boolean),\n};\n\nexport type Experiment = {|\n isEnabled: () => boolean,\n isDisabled: () => boolean,\n getTreatment: () => string,\n log: (string, payload?: Payload) => Experiment,\n logStart: (payload?: Payload) => Experiment,\n logComplete: (payload?: Payload) => Experiment,\n|};\n\nfunction getRandomInteger(range: number): number {\n return Math.floor(Math.random() * range);\n}\n\nfunction getThrottlePercentile(name: string): number {\n return getBelterExperimentStorage().getState((state) => {\n state.throttlePercentiles = state.throttlePercentiles || {};\n state.throttlePercentiles[name] =\n state.throttlePercentiles[name] || getRandomInteger(100);\n return state.throttlePercentiles[name];\n });\n}\n\nconst THROTTLE_GROUP = {\n TEST: \"test\",\n CONTROL: \"control\",\n THROTTLE: \"throttle\",\n};\n\ntype ExperimentOptions = {|\n name: string,\n sample?: number,\n logTreatment?: ({|\n name: string,\n treatment: string,\n payload: Payload,\n throttle: number,\n |}) => void,\n logCheckpoint?: ({|\n name: string,\n treatment: string,\n checkpoint: string,\n payload: Payload,\n throttle: number,\n |}) => void,\n sticky?: boolean,\n|};\n\nexport function experiment({\n name,\n sample = 50,\n logTreatment = noop,\n logCheckpoint = noop,\n sticky = true,\n}: ExperimentOptions): Experiment {\n const throttle = sticky ? getThrottlePercentile(name) : getRandomInteger(100);\n\n let group;\n\n if (throttle < sample && !__TEST__) {\n group = THROTTLE_GROUP.TEST;\n } else if (sample >= 50 || (sample <= throttle && throttle < sample * 2)) {\n group = THROTTLE_GROUP.CONTROL;\n } else {\n group = THROTTLE_GROUP.THROTTLE;\n }\n\n const treatment = `${name}_${group}`;\n\n let started = false;\n let forced = false;\n\n try {\n if (window.localStorage && window.localStorage.getItem(name)) {\n forced = true;\n }\n } catch (err) {\n // pass\n }\n\n const exp = {\n isEnabled(): boolean {\n return group === THROTTLE_GROUP.TEST || forced;\n },\n\n isDisabled(): boolean {\n return group !== THROTTLE_GROUP.TEST && !forced;\n },\n\n getTreatment(): string {\n return treatment;\n },\n\n log(checkpoint: string, payload?: Payload = {}): Experiment {\n if (!started) {\n return exp;\n }\n\n if (isEventUnique(`${treatment}_${JSON.stringify(payload)}`)) {\n logTreatment({ name, treatment, payload, throttle });\n }\n\n if (\n isEventUnique(`${treatment}_${checkpoint}_${JSON.stringify(payload)}`)\n ) {\n logCheckpoint({ name, treatment, checkpoint, payload, throttle });\n }\n\n return exp;\n },\n\n logStart(payload?: Payload = {}): Experiment {\n started = true;\n return exp.log(`start`, payload);\n },\n\n logComplete(payload?: Payload = {}): Experiment {\n return exp.log(`complete`, payload);\n },\n };\n\n return exp;\n}\n","/* @flow */\n\nimport { getGlobal } from \"./util\";\n\nexport function getGlobalNameSpace({\n name,\n version = \"latest\",\n}: {|\n name: string,\n version?: string,\n|}): {| get: (string, defValue?: T) => T |} {\n const global = getGlobal();\n const globalKey = `__${name}__${version}_global__`;\n\n const namespace = (global[globalKey] = global[globalKey] || {});\n\n return {\n get: (key: string, defValue?: T): T => {\n // $FlowFixMe\n defValue = defValue || {};\n const item = (namespace[key] = namespace[key] || defValue);\n return item;\n },\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\nimport { type SameDomainWindowType } from \"@krakenjs/cross-domain-utils/src\";\n\ntype RequestOptionsType = {|\n url: string,\n method?: string,\n headers?: { [key: string]: string },\n json?: $ReadOnlyArray | Object,\n data?: { [key: string]: string },\n body?: string,\n win?: SameDomainWindowType,\n timeout?: number,\n|};\n\ntype ResponseType = {|\n status: number,\n headers: { [string]: string },\n body: Object,\n|};\n\nconst HEADERS = {\n CONTENT_TYPE: \"content-type\",\n ACCEPT: \"accept\",\n};\n\nconst headerBuilders = [];\n\nfunction parseHeaders(rawHeaders: string = \"\"): { [string]: string } {\n const result = {};\n for (const line of rawHeaders.trim().split(\"\\n\")) {\n const [key, ...values] = line.split(\":\");\n result[key.toLowerCase()] = values.join(\":\").trim();\n }\n return result;\n}\n\nexport function request({\n url,\n method = \"get\",\n headers = {},\n json,\n data,\n body,\n win = window,\n timeout = 0,\n}: RequestOptionsType): ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n if ((json && data) || (json && body) || (data && json)) {\n throw new Error(\n `Only options.json or options.data or options.body should be passed`\n );\n }\n\n const normalizedHeaders = {};\n\n for (const key of Object.keys(headers)) {\n normalizedHeaders[key.toLowerCase()] = headers[key];\n }\n\n if (json) {\n normalizedHeaders[HEADERS.CONTENT_TYPE] =\n normalizedHeaders[HEADERS.CONTENT_TYPE] || \"application/json\";\n } else if (data || body) {\n normalizedHeaders[HEADERS.CONTENT_TYPE] =\n normalizedHeaders[HEADERS.CONTENT_TYPE] ||\n \"application/x-www-form-urlencoded; charset=utf-8\";\n }\n\n normalizedHeaders[HEADERS.ACCEPT] =\n normalizedHeaders[HEADERS.ACCEPT] || \"application/json\";\n\n for (const headerBuilder of headerBuilders) {\n const builtHeaders = headerBuilder();\n\n for (const key of Object.keys(builtHeaders)) {\n normalizedHeaders[key.toLowerCase()] = builtHeaders[key];\n }\n }\n\n const xhr = new win.XMLHttpRequest();\n\n xhr.addEventListener(\n \"load\",\n function xhrLoad(): void {\n const responseHeaders = parseHeaders(this.getAllResponseHeaders());\n\n if (!this.status) {\n return reject(\n new Error(\n `Request to ${method.toLowerCase()} ${url} failed: no response status code.`\n )\n );\n }\n\n const contentType = responseHeaders[\"content-type\"];\n const isJSON =\n contentType &&\n (contentType.indexOf(\"application/json\") === 0 ||\n contentType.indexOf(\"text/json\") === 0);\n let responseBody = this.responseText;\n\n try {\n responseBody = JSON.parse(responseBody);\n } catch (err) {\n if (isJSON) {\n return reject(new Error(`Invalid json: ${this.responseText}.`));\n }\n }\n\n const res = {\n status: this.status,\n headers: responseHeaders,\n body: responseBody,\n };\n\n return resolve(res);\n },\n false\n );\n\n xhr.addEventListener(\n \"error\",\n (evt) => {\n reject(\n new Error(\n `Request to ${method.toLowerCase()} ${url} failed: ${evt.toString()}.`\n )\n );\n },\n false\n );\n\n xhr.open(method, url, true);\n\n for (const key in normalizedHeaders) {\n if (normalizedHeaders.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, normalizedHeaders[key]);\n }\n }\n\n if (json) {\n body = JSON.stringify(json);\n } else if (data) {\n body = Object.keys(data)\n .map((key) => {\n return `${encodeURIComponent(key)}=${\n data ? encodeURIComponent(data[key]) : \"\"\n }`;\n })\n .join(\"&\");\n }\n\n xhr.timeout = timeout;\n xhr.ontimeout = function xhrTimeout() {\n reject(\n new Error(`Request to ${method.toLowerCase()} ${url} has timed out`)\n );\n };\n\n xhr.send(body);\n });\n}\n\nexport function addHeaderBuilder(method: () => { [string]: string }) {\n headerBuilders.push(method);\n}\n","/* @flow */\n\n// export something to force webpack to see this as an ES module\nexport const TYPES = true;\n\ndeclare var __TEST__: boolean;\n\nexport type JSONPrimitive = string | boolean | number;\nexport type JSONObject =\n | { [string]: JSONPrimitive | JSONObject }\n | $ReadOnlyArray;\nexport type JSONType = JSONObject | JSONPrimitive;\n\nexport type CancelableType = {|\n cancel: () => void,\n|};\n","/* @flow */\n\nimport { memoize, promisify } from \"./util\";\n\nexport function memoized(target: Object, name: string, descriptor: Object) {\n descriptor.value = memoize(descriptor.value, { name, thisNamespace: true });\n}\n\nexport function promise(target: Object, name: string, descriptor: Object) {\n descriptor.value = promisify(descriptor.value, { name });\n}\n","/* @flow */\n\nexport function isPerc(str: string): boolean {\n return typeof str === \"string\" && /^[0-9]+%$/.test(str);\n}\n\nexport function isPx(str: string): boolean {\n return typeof str === \"string\" && /^[0-9]+px$/.test(str);\n}\n\nexport function toNum(val: string | number): number {\n if (typeof val === \"number\") {\n return val;\n }\n\n const match = val.match(/^([0-9]+)(px|%)$/);\n\n if (!match) {\n throw new Error(`Could not match css value from ${val}`);\n }\n\n return parseInt(match[1], 10);\n}\n\nexport function toPx(val: number | string): string {\n return `${toNum(val)}px`;\n}\n\nexport function toCSS(val: number | string): string {\n if (typeof val === \"number\") {\n return toPx(val);\n }\n\n return isPerc(val) ? val : toPx(val);\n}\n\nexport function percOf(num: number, perc: string): number {\n return parseInt((num * toNum(perc)) / 100, 10);\n}\n\nexport function normalizeDimension(dim: string | number, max: number): number {\n if (typeof dim === \"number\") {\n return dim;\n } else if (isPerc(dim)) {\n return percOf(max, dim);\n } else if (isPx(dim)) {\n return toNum(dim);\n } else {\n throw new Error(`Can not normalize dimension: ${dim}`);\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from \"@krakenjs/zalgo-promise/src\";\n\nimport { noop, tryCatch, removeFromArray } from \"./util\";\n\ntype Prom = Promise | ZalgoPromise; // eslint-disable-line no-restricted-globals, promise/no-native\n\n// eslint-disable-next-line no-undef\ntype Handler = >(\n name: string,\n // eslint-disable-next-line no-undef\n fn?: (...args: A) => T\n // eslint-disable-next-line no-undef\n) => (...args: A) => T;\ntype Wrapper = ({|\n expect: Handler,\n avoid: Handler,\n expectError: Handler,\n error: Handler,\n wait: () => Prom,\n|}) => Prom | void;\n\nexport function wrapPromise(\n method: Wrapper,\n { timeout = 5000 }: {| timeout?: number |} = {}\n): ZalgoPromise {\n const expected: Array<{| name: string, handler: Handler |}> = [];\n const promises: Array<{| name: string, promise: ZalgoPromise<*> |}> = [];\n\n return new ZalgoPromise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (expected.length) {\n reject(\n new Error(`Expected ${expected[0].name} to be called in ${timeout}ms`)\n );\n }\n\n if (promises.length) {\n reject(\n new Error(\n `Expected ${promises[0].name} promise to complete in ${timeout}ms`\n )\n );\n }\n }, timeout);\n\n // $FlowFixMe[escaped-generic]\n const expect: Handler = (name, handler = noop) => {\n const exp = { name, handler };\n // $FlowFixMe\n expected.push(exp);\n\n // $FlowFixMe\n return function expectWrapper(...args): * {\n removeFromArray(expected, exp);\n\n // $FlowFixMe\n const { result, error } = tryCatch(() => handler.call(this, ...args));\n\n if (error) {\n promises.push({ name, promise: ZalgoPromise.asyncReject(error) });\n throw error;\n }\n\n // $FlowFixMe[escaped-generic]\n promises.push({ name, promise: ZalgoPromise.resolve(result) });\n\n // $FlowFixMe[escaped-generic]\n return result;\n };\n };\n\n // $FlowFixMe[escaped-generic]\n const avoid: Handler = (name: string, fn = noop) => {\n // $FlowFixMe\n return function avoidWrapper(...args): * {\n promises.push({\n name,\n promise: ZalgoPromise.asyncReject(\n new Error(`Expected ${name} to not be called`)\n ),\n });\n // $FlowFixMe\n return fn.call(this, ...args);\n };\n };\n\n // $FlowFixMe[escaped-generic]\n const expectError: Handler = (name, handler = noop) => {\n const exp = { name, handler };\n // $FlowFixMe\n expected.push(exp);\n\n // $FlowFixMe\n return function expectErrorWrapper(...args): * {\n removeFromArray(expected, exp);\n\n // $FlowFixMe\n const { result, error } = tryCatch(() => handler.call(this, ...args));\n\n if (error) {\n throw error;\n }\n\n promises.push({\n name,\n // $FlowFixMe[escaped-generic]\n promise: ZalgoPromise.resolve(result).then(() => {\n throw new Error(`Expected ${name} to throw an error`);\n }, noop),\n });\n\n // $FlowFixMe[escaped-generic]\n return result;\n };\n };\n\n const wait = () => {\n return ZalgoPromise.try(() => {\n if (promises.length) {\n const prom = promises[0];\n return prom.promise\n .finally(() => {\n removeFromArray(promises, prom);\n })\n .then(wait);\n }\n }).then(() => {\n if (expected.length) {\n return ZalgoPromise.delay(10).then(wait);\n }\n });\n };\n\n promises.push({\n name: \"wrapPromise handler\",\n promise: ZalgoPromise.try(() =>\n method({\n expect,\n avoid,\n expectError,\n error: avoid,\n wait: () => ZalgoPromise.resolve(),\n })\n ),\n });\n\n wait()\n .finally(() => {\n clearTimeout(timer);\n })\n .then(resolve, reject);\n });\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/module/dom.js b/dist/module/dom.js index 3d67f84..95dc4f1 100644 --- a/dist/module/dom.js +++ b/dist/module/dom.js @@ -686,9 +686,14 @@ export function isElementClosed(el) { } return false; } -export function watchElementForClose(element, handler) { +export function watchElementForClose(element, handler, options) { + var _ref2 = options || {}, + _ref2$isBfcacheEnable = _ref2.isBfcacheEnabled, + isBfcacheEnabled = _ref2$isBfcacheEnable === void 0 ? false : _ref2$isBfcacheEnable; + console.log("[bfcache-belter] watchElementForClose called with isBfcacheEnabled=" + String(isBfcacheEnabled)); handler = once(handler); var terminationEvent = "onpagehide" in window ? "pagehide" : "unload"; + console.log("[bfcache-belter] terminationEvent=" + terminationEvent); var cancelled = false; var mutationObservers = []; var interval; @@ -704,7 +709,7 @@ export function watchElementForClose(element, handler) { interval.cancel(); } if (sacrificialFrameWin) { - sacrificialFrameWin.removeEventListener(terminationEvent, elementClosed); + sacrificialFrameWin.removeEventListener(terminationEvent, elementClosedOnTermination); } if (sacrificialFrame) { destroyElement(sacrificialFrame); @@ -716,6 +721,15 @@ export function watchElementForClose(element, handler) { cancel(); } }; + var elementClosedOnTermination = function elementClosedOnTermination(event) { + console.log("[bfcache-belter] sacrificial iframe " + terminationEvent + " fired, persisted=" + event.persisted + ", isBfcacheEnabled=" + String(isBfcacheEnabled)); + if (isBfcacheEnabled && terminationEvent === "pagehide" && event.persisted) { + console.log("[bfcache-belter] skipping elementClosed (page entering bfcache)"); + return; + } + console.log("[bfcache-belter] calling elementClosed (real navigation)"); + elementClosed(); + }; if (isElementClosed(element)) { elementClosed(); return { @@ -740,9 +754,11 @@ export function watchElementForClose(element, handler) { sacrificialFrame = document.createElement("iframe"); sacrificialFrame.setAttribute("name", "__detect_close_" + uniqueID() + "__"); sacrificialFrame.style.display = "none"; + console.log("[bfcache-belter] sacrificial iframe created"); awaitFrameWindow(sacrificialFrame).then(function (frameWin) { sacrificialFrameWin = assertSameDomain(frameWin); - sacrificialFrameWin.addEventListener(terminationEvent, elementClosed); + sacrificialFrameWin.addEventListener(terminationEvent, elementClosedOnTermination); + console.log("[bfcache-belter] event listener attached to sacrificial iframe for " + terminationEvent); }); element.appendChild(sacrificialFrame); var check = function check() { @@ -771,15 +787,15 @@ export function fixScripts(el, doc) { } } export function onResize(el, handler, _temp) { - var _ref2 = _temp === void 0 ? {} : _temp, - _ref2$width = _ref2.width, - width = _ref2$width === void 0 ? true : _ref2$width, - _ref2$height = _ref2.height, - height = _ref2$height === void 0 ? true : _ref2$height, - _ref2$interval = _ref2.interval, - interval = _ref2$interval === void 0 ? 100 : _ref2$interval, - _ref2$win = _ref2.win, - win = _ref2$win === void 0 ? window : _ref2$win; + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$width = _ref3.width, + width = _ref3$width === void 0 ? true : _ref3$width, + _ref3$height = _ref3.height, + height = _ref3$height === void 0 ? true : _ref3$height, + _ref3$interval = _ref3.interval, + interval = _ref3$interval === void 0 ? 100 : _ref3$interval, + _ref3$win = _ref3.win, + win = _ref3$win === void 0 ? window : _ref3$win; var currentWidth = el.offsetWidth; var currentHeight = el.offsetHeight; var canceled = false; @@ -964,12 +980,12 @@ export var getCurrentScriptUID = memoize(function () { script.setAttribute(ATTRIBUTES.UID + "-auto", uid); return uid; }); -export function submitForm(_ref3) { - var url = _ref3.url, - target = _ref3.target, - body = _ref3.body, - _ref3$method = _ref3.method, - method = _ref3$method === void 0 ? "post" : _ref3$method; +export function submitForm(_ref4) { + var url = _ref4.url, + target = _ref4.target, + body = _ref4.body, + _ref4$method = _ref4.method, + method = _ref4$method === void 0 ? "post" : _ref4$method; var form = document.createElement("form"); form.setAttribute("target", target); form.setAttribute("method", method); diff --git a/package.json b/package.json index 214583e..f4e7482 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@krakenjs/belter", - "version": "2.9.3", + "version": "2.10.0-alpha.4", "description": "Utilities.", "main": "index.js", "scripts": { diff --git a/src/dom.js b/src/dom.js index 5e8e0ea..a12a421 100644 --- a/src/dom.js +++ b/src/dom.js @@ -1041,10 +1041,20 @@ export function isElementClosed(el: HTMLElement): boolean { export function watchElementForClose( element: HTMLElement, - handler: () => mixed + handler: () => mixed, + options?: {| isBfcacheEnabled?: boolean |} ): CancelableType { + const { isBfcacheEnabled = false } = options || {}; + // eslint-disable-next-line no-console + console.log( + `[bfcache-belter] watchElementForClose called with isBfcacheEnabled=${String( + isBfcacheEnabled + )}` + ); handler = once(handler); const terminationEvent = "onpagehide" in window ? "pagehide" : "unload"; + // eslint-disable-next-line no-console + console.log(`[bfcache-belter] terminationEvent=${terminationEvent}`); let cancelled = false; const mutationObservers = []; @@ -1063,8 +1073,12 @@ export function watchElementForClose( interval.cancel(); } if (sacrificialFrameWin) { - // eslint-disable-next-line no-use-before-define - sacrificialFrameWin.removeEventListener(terminationEvent, elementClosed); + /* eslint-disable no-use-before-define */ + sacrificialFrameWin.removeEventListener( + terminationEvent, + elementClosedOnTermination + ); + /* eslint-enable no-use-before-define */ } if (sacrificialFrame) { destroyElement(sacrificialFrame); @@ -1078,6 +1092,29 @@ export function watchElementForClose( } }; + const elementClosedOnTermination = (event) => { + // eslint-disable-next-line no-console + console.log( + `[bfcache-belter] sacrificial iframe ${terminationEvent} fired, persisted=${ + event.persisted + }, isBfcacheEnabled=${String(isBfcacheEnabled)}` + ); + if ( + isBfcacheEnabled && + terminationEvent === "pagehide" && + event.persisted + ) { + // eslint-disable-next-line no-console + console.log( + "[bfcache-belter] skipping elementClosed (page entering bfcache)" + ); + return; + } + // eslint-disable-next-line no-console + console.log("[bfcache-belter] calling elementClosed (real navigation)"); + elementClosed(); + }; + if (isElementClosed(element)) { elementClosed(); return { cancel }; @@ -1105,9 +1142,18 @@ export function watchElementForClose( sacrificialFrame = document.createElement("iframe"); sacrificialFrame.setAttribute("name", `__detect_close_${uniqueID()}__`); sacrificialFrame.style.display = "none"; + // eslint-disable-next-line no-console + console.log("[bfcache-belter] sacrificial iframe created"); awaitFrameWindow(sacrificialFrame).then((frameWin) => { sacrificialFrameWin = assertSameDomain(frameWin); - sacrificialFrameWin.addEventListener(terminationEvent, elementClosed); + sacrificialFrameWin.addEventListener( + terminationEvent, + elementClosedOnTermination + ); + // eslint-disable-next-line no-console + console.log( + `[bfcache-belter] event listener attached to sacrificial iframe for ${terminationEvent}` + ); }); element.appendChild(sacrificialFrame);