From 904c47e9c0beb7fda4c3c1bb895b010d3b200aa1 Mon Sep 17 00:00:00 2001 From: Justin Nguyen Date: Mon, 8 Apr 2019 18:36:26 +0700 Subject: [PATCH 1/2] try build --- dist/module/child/index.js | 4 +- dist/zoid.frame.js | 8 +- dist/zoid.frame.js.map | 2 +- dist/zoid.frame.min.js | 2 +- dist/zoid.frame.min.js.map | 2 +- dist/zoid.frameworks.js | 8 +- dist/zoid.frameworks.js.map | 2 +- dist/zoid.frameworks.min.js | 2 +- dist/zoid.frameworks.min.js.map | 2 +- dist/zoid.js | 8 +- dist/zoid.js.map | 2 +- dist/zoid.min.js | 2 +- dist/zoid.min.js.map | 2 +- package.json | 2 +- src/child/index.js | 511 +- yarn.lock | 10941 ++++++++++++++++++++++++++++++ 16 files changed, 11245 insertions(+), 255 deletions(-) create mode 100644 yarn.lock diff --git a/dist/module/child/index.js b/dist/module/child/index.js index 63d3356b..04092c45 100644 --- a/dist/module/child/index.js +++ b/dist/module/child/index.js @@ -61,7 +61,9 @@ class ChildComponent { } if (childPayload.version !== __ZOID__.__VERSION__) { - throw new Error(`Parent window has zoid version ${childPayload.version}, child window has version ${__ZOID__.__VERSION__}`); + const msg = `Parent window has zoid version ${childPayload.version}, child window has version ${__ZOID__.__VERSION__}`; // throw new Error(msg); + + console.log(msg); } const { diff --git a/dist/zoid.frame.js b/dist/zoid.frame.js index e8a1d355..b4ff68ba 100644 --- a/dist/zoid.frame.js +++ b/dist/zoid.frame.js @@ -1804,7 +1804,7 @@ } function lib_global_getGlobal(win) { if (void 0 === win && (win = window), !isSameDomain(win)) throw new Error("Can not get global for window on different domain"); - return win.__zoid_9_0_22__ || (win.__zoid_9_0_22__ = {}), win.__zoid_9_0_22__; + return win.__zoid_9_0_23__ || (win.__zoid_9_0_23__ = {}), win.__zoid_9_0_23__; } function getProxyObject(obj) { return { @@ -1878,7 +1878,7 @@ _this.component = component, _this.onPropHandlers = []; var childPayload = getChildPayload(); if (!childPayload) throw new Error("No child payload found"); - if ("9_0_21" !== childPayload.version) throw new Error("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_21"); + "9_0_22" !== childPayload.version && console.log("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_22"); var parent = childPayload.parent, domain = childPayload.domain, exports = childPayload.exports, props = childPayload.props; _this.context = childPayload.context, _this.parentComponentWindow = _this.getParentComponentWindow(parent), _this.parentDomain = domain, _this.parent = setup_deserializeMessage(_this.parentComponentWindow, domain, exports), @@ -2280,7 +2280,7 @@ return { uid: uid, context: context, - version: "9_0_21", + version: "9_0_22", domain: utils_getDomain(window), tag: this.component.tag, parent: this.getWindowRef(target, initialDomain, uid, context), @@ -3097,7 +3097,7 @@ var destroyComponents = destroyAll; function component_destroy() { var listener; - destroyAll(), delete window.__zoid_9_0_22__, function() { + destroyAll(), delete window.__zoid_9_0_23__, function() { for (var responseListeners = globalStore("responseListeners"), _i2 = 0, _responseListeners$ke2 = responseListeners.keys(); _i2 < _responseListeners$ke2.length; _i2++) { var hash = _responseListeners$ke2[_i2], listener = responseListeners.get(hash); listener && (listener.cancelled = !0), responseListeners.del(hash); diff --git a/dist/zoid.frame.js.map b/dist/zoid.frame.js.map index e3ab6a18..a691982a 100644 --- a/dist/zoid.frame.js.map +++ b/dist/zoid.frame.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","log","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frame.min.js b/dist/zoid.frame.min.js index f39d1215..48c696c4 100644 --- a/dist/zoid.frame.min.js +++ b/dist/zoid.frame.min.js @@ -1,2 +1,2 @@ -!function(n,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("zoid",[],r):"object"==typeof exports?exports.zoid=r():n.zoid=r()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function t(e){if(r[e])return r[e].exports;var i=r[e]={i:e,l:!1,exports:{}};return n[e].call(i.exports,i,i.exports,t),i.l=!0,i.exports}return t.m=n,t.c=r,t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{enumerable:!0,get:e})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,r){if(1&r&&(n=t(n)),8&r)return n;if(4&r&&"object"==typeof n&&n&&n.__esModule)return n;var e=Object.create(null);if(t.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:n}),2&r&&"string"!=typeof n)for(var i in n)t.d(e,i,function(r){return n[r]}.bind(null,i));return e},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,r){return{}.hasOwnProperty.call(n,r)},t.p="",t(t.s=0)}([function(n,r,t){"use strict";t.r(r);var e={};function i(){return(i=Object.assign||function(n){for(var r=1;r>>0)+"__"+H,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var n=new WeakMap,r={};return Object.freeze(r),n.set(r,"__testvalue__"),"__testvalue__"===n.get(r)}catch(n){return!1}}())try{this.weakmap=new WeakMap}catch(n){}this.keys=[],this.values=[]}var r=n.prototype;return r._cleanupClosedWindows=function(){for(var n=this.weakmap,r=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!n)return"";if("string"==typeof n)return n;if(n instanceof Error){var t=n&&n.stack,e=n&&n.message;if(t&&e)return-1!==t.indexOf(e)?t:e+"\n"+t;if(t)return t;if(e)return e}return"function"==typeof n.toString?n.toString():{}.toString.call(n)}catch(n){return"Error while stringifying error: "+tn(n,r+1)}}function en(n){return"string"==typeof n?n:n&&"function"==typeof n.toString?n.toString():{}.toString.call(n)}function on(n,r){if(!r)return n;if(Object.assign)return Object.assign(n,r);for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t]);return n}function un(n,r){var t;return function e(){t=setTimeout(function(){n(),e()},r)}(),{cancel:function(){clearTimeout(t)}}}function fn(n){return null!=n}function cn(n){return"[object RegExp]"==={}.toString.call(n)}function an(n,r,t){if(n.hasOwnProperty(r))return n[r];var e=t();return n[r]=e,e}function sn(n){var r=[],t=!1;return{set:function(r,e){return t||(n[r]=e,this.register(function(){delete n[r]})),e},register:function(n){t?n():r.push(rn(n))},all:function(){var n=[];for(t=!0;r.length;){var e=r.pop();n.push(e())}return w.all(n).then(nn)}}}function dn(n,r){if(null==r)throw new Error("Expected "+n+" to be present");return r}function hn(){return Boolean(document.body)&&"complete"===document.readyState}function wn(n){return n.replace(/\?/g,"%3F").replace(/&/g,"%26").replace(/#/g,"%23").replace(/\+/g,"%2B")}function vn(){return Q(vn,function(){return new w(function(n){if(hn())return n();var r=setInterval(function(){if(hn())return clearInterval(r),n()},10)})})}function ln(n){return Q(ln,function(){var r={};if(!n)return r;if(-1===n.indexOf("="))return r;for(var t=0,e=n.split("&");t1?r-1:0),i=1;i1?t-1:0),i=1;i iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+r+" > iframe."+Hr.nn+" {\n opacity: 0;\n }\n\n #"+r+" > iframe."+Hr.K+" {\n opacity: 1;\n }\n ")),s.appendChild(t),s.appendChild(e),s.appendChild(d),e.classList.add(Hr.K),t.classList.add(Hr.nn),u.on(zr.H,function(){e.classList.remove(Hr.K),e.classList.add(Hr.nn),t.classList.remove(Hr.nn),t.classList.add(Hr.K),setTimeout(function(){Tn(e)},1)}),u.on(zr.V,function(n){var r=n.width,t=n.height;"number"==typeof r&&(s.style.width=Dn(r)),"number"==typeof t&&(s.style.height=Dn(t))}),s}}function Zr(n){var r=n.doc,t=n.props,e=r.createElement("html"),i=r.createElement("body"),o=r.createElement("style"),u=r.createElement("div");return u.classList.add("spinner"),t.cspNonce&&o.setAttribute("nonce",t.cspNonce),e.appendChild(i),i.appendChild(u),i.appendChild(o),o.appendChild(r.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),e}var $r=function(){return nn},Vr=function(n){return rn(n.value)},Kr=function(){function n(n){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(n){if(!n)throw new Error("Expected options to be passed");if(!n.tag||!n.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+n.tag);if(function(n){if(n.props&&"object"!=typeof n.props)throw new Error("Expected options.props to be an object");var r=function(n){var r=[];for(var t in n)n.hasOwnProperty(t)&&r.push(n[t]);return r}(Dr);if(n.props)for(var t=0,e=Object.keys(n.props);t>>0)+"__"+V,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var e=new WeakMap,n={};return Object.freeze(n),e.set(n,"__testvalue__"),"__testvalue__"===e.get(n)}catch(e){return!1}}())try{this.weakmap=new WeakMap}catch(e){}this.keys=[],this.values=[]}var n=e.prototype;return n._cleanupClosedWindows=function(){for(var e=this.weakmap,n=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!e)return"";if("string"==typeof e)return e;if(e instanceof Error){var t=e&&e.stack,r=e&&e.message;if(t&&r)return-1!==t.indexOf(r)?t:r+"\n"+t;if(t)return t;if(r)return r}return"function"==typeof e.toString?e.toString():{}.toString.call(e)}catch(e){return"Error while stringifying error: "+te(e,n+1)}}function re(e){return"string"==typeof e?e:e&&"function"==typeof e.toString?e.toString():{}.toString.call(e)}function oe(e,n){if(!n)return e;if(Object.assign)return Object.assign(e,n);for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}function ie(e,n){var t;return function r(){t=setTimeout(function(){e(),r()},n)}(),{cancel:function(){clearTimeout(t)}}}function ae(e){return null!=e}function se(e){return"[object RegExp]"==={}.toString.call(e)}function ue(e,n,t){if(e.hasOwnProperty(n))return e[n];var r=t();return e[n]=r,r}function ce(e){var n=[],t=!1;return{set:function(n,r){return t||(e[n]=r,this.register(function(){delete e[n]})),r},register:function(e){t?e():n.push(ne(e))},all:function(){var e=[];for(t=!0;n.length;){var r=n.pop();e.push(r())}return l.all(e).then(ee)}}}function de(e,n){if(null==n)throw new Error("Expected "+e+" to be present");return n}function fe(){return Boolean(document.body)&&"complete"===document.readyState}function he(e){return e.replace(/\?/g,"%3F").replace(/&/g,"%26").replace(/#/g,"%23").replace(/\+/g,"%2B")}function le(){return Q(le,function(){return new l(function(e){if(fe())return e();var n=setInterval(function(){if(fe())return clearInterval(n),e()},10)})})}function pe(e){return Q(pe,function(){var n={};if(!e)return n;if(-1===e.indexOf("="))return n;for(var t=0,r=e.split("&");t1?n-1:0),o=1;o1?t-1:0),o=1;o iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+n+" > iframe."+Vn.INVISIBLE+" {\n opacity: 0;\n }\n\n #"+n+" > iframe."+Vn.VISIBLE+" {\n opacity: 1;\n }\n ")),d.appendChild(t),d.appendChild(r),d.appendChild(f),r.classList.add(Vn.VISIBLE),t.classList.add(Vn.INVISIBLE),a.on(zn.RENDERED,function(){r.classList.remove(Vn.VISIBLE),r.classList.add(Vn.INVISIBLE),t.classList.remove(Vn.INVISIBLE),t.classList.add(Vn.VISIBLE),setTimeout(function(){xe(r)},1)}),a.on(zn.RESIZE,function(e){var n=e.width,t=e.height;"number"==typeof n&&(d.style.width=Ie(n)),"number"==typeof t&&(d.style.height=Ie(t))}),d}}function Xn(e){var n=e.doc,t=e.props,r=n.createElement("html"),o=n.createElement("body"),i=n.createElement("style"),a=n.createElement("div");return a.classList.add("spinner"),t.cspNonce&&i.setAttribute("nonce",t.cspNonce),r.appendChild(o),o.appendChild(a),o.appendChild(i),i.appendChild(n.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),r}var Zn=function(){return ee},$n=function(e){return ne(e.value)},Kn=function(){function e(e){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(e){if(!e)throw new Error("Expected options to be passed");if(!e.tag||!e.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+e.tag);if(function(e){if(e.props&&"object"!=typeof e.props)throw new Error("Expected options.props to be an object");var n=function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(e[t]);return n}(Nn);if(e.props)for(var t=0,r=Object.keys(e.props);t(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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frameworks.js b/dist/zoid.frameworks.js index cb56d051..737d559a 100644 --- a/dist/zoid.frameworks.js +++ b/dist/zoid.frameworks.js @@ -1857,7 +1857,7 @@ } function lib_global_getGlobal(win) { if (void 0 === win && (win = window), !isSameDomain(win)) throw new Error("Can not get global for window on different domain"); - return win.__zoid_9_0_22__ || (win.__zoid_9_0_22__ = {}), win.__zoid_9_0_22__; + return win.__zoid_9_0_23__ || (win.__zoid_9_0_23__ = {}), win.__zoid_9_0_23__; } function getProxyObject(obj) { return { @@ -1931,7 +1931,7 @@ _this.component = component, _this.onPropHandlers = []; var childPayload = getChildPayload(); if (!childPayload) throw new Error("No child payload found"); - if ("9_0_21" !== childPayload.version) throw new Error("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_21"); + "9_0_22" !== childPayload.version && console.log("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_22"); var parent = childPayload.parent, domain = childPayload.domain, exports = childPayload.exports, props = childPayload.props; _this.context = childPayload.context, _this.parentComponentWindow = _this.getParentComponentWindow(parent), _this.parentDomain = domain, _this.parent = setup_deserializeMessage(_this.parentComponentWindow, domain, exports), @@ -2333,7 +2333,7 @@ return { uid: uid, context: context, - version: "9_0_21", + version: "9_0_22", domain: utils_getDomain(window), tag: this.component.tag, parent: this.getWindowRef(target, initialDomain, uid, context), @@ -3274,7 +3274,7 @@ var destroyComponents = destroyAll; function component_destroy() { var listener; - destroyAll(), delete window.__zoid_9_0_22__, function() { + destroyAll(), delete window.__zoid_9_0_23__, function() { for (var responseListeners = globalStore("responseListeners"), _i2 = 0, _responseListeners$ke2 = responseListeners.keys(); _i2 < _responseListeners$ke2.length; _i2++) { var hash = _responseListeners$ke2[_i2], listener = responseListeners.get(hash); listener && (listener.cancelled = !0), responseListeners.del(hash); diff --git a/dist/zoid.frameworks.js.map b/dist/zoid.frameworks.js.map index 1ad4b82c..8551a194 100644 --- a/dist/zoid.frameworks.js.map +++ b/dist/zoid.frameworks.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","log","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frameworks.min.js b/dist/zoid.frameworks.min.js index 2b92a6cf..8c125517 100644 --- a/dist/zoid.frameworks.min.js +++ b/dist/zoid.frameworks.min.js @@ -1,2 +1,2 @@ -!function(n,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("zoid",[],r):"object"==typeof exports?exports.zoid=r():n.zoid=r()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function t(e){if(r[e])return r[e].exports;var i=r[e]={i:e,l:!1,exports:{}};return n[e].call(i.exports,i,i.exports,t),i.l=!0,i.exports}return t.m=n,t.c=r,t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{enumerable:!0,get:e})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,r){if(1&r&&(n=t(n)),8&r)return n;if(4&r&&"object"==typeof n&&n&&n.__esModule)return n;var e=Object.create(null);if(t.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:n}),2&r&&"string"!=typeof n)for(var i in n)t.d(e,i,function(r){return n[r]}.bind(null,i));return e},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,r){return{}.hasOwnProperty.call(n,r)},t.p="",t(t.s=0)}([function(n,r,t){"use strict";t.r(r);var e={};function i(){return(i=Object.assign||function(n){for(var r=1;r>>0)+"__"+G,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var n=new WeakMap,r={};return Object.freeze(r),n.set(r,"__testvalue__"),"__testvalue__"===n.get(r)}catch(n){return!1}}())try{this.weakmap=new WeakMap}catch(n){}this.keys=[],this.values=[]}var r=n.prototype;return r._cleanupClosedWindows=function(){for(var n=this.weakmap,r=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!n)return"";if("string"==typeof n)return n;if(n instanceof Error){var t=n&&n.stack,e=n&&n.message;if(t&&e)return-1!==t.indexOf(e)?t:e+"\n"+t;if(t)return t;if(e)return e}return"function"==typeof n.toString?n.toString():{}.toString.call(n)}catch(n){return"Error while stringifying error: "+tn(n,r+1)}}function en(n){return"string"==typeof n?n:n&&"function"==typeof n.toString?n.toString():{}.toString.call(n)}function on(n,r){if(!r)return n;if(Object.assign)return Object.assign(n,r);for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t]);return n}function un(n,r){var t;return function e(){t=setTimeout(function(){n(),e()},r)}(),{cancel:function(){clearTimeout(t)}}}function fn(n,r,t){if(Array.isArray(n)){if("number"!=typeof r)throw new TypeError("Array key must be number")}else if("object"==typeof n&&null!==n&&"string"!=typeof r)throw new TypeError("Object key must be string");Object.defineProperty(n,r,{configurable:!0,enumerable:!0,get:function(){delete n[r];var e=t();return n[r]=e,e},set:function(t){delete n[r],n[r]=t}})}function cn(n){return"object"==typeof(r=n)&&null!==r&&"[object Object]"==={}.toString.call(n);var r}function an(n){if(!cn(n))return!1;var r=n.constructor;if("function"!=typeof r)return!1;var t=r.prototype;return!!cn(t)&&!!t.hasOwnProperty("isPrototypeOf")}function sn(n,r,t){if(void 0===t&&(t=""),Array.isArray(n)){for(var e=n.length,i=[],o=function(e){fn(i,e,function(){var i=t?t+"."+e:""+e,o=r(n[e],e,i);return(an(o)||Array.isArray(o))&&(o=sn(o,r,i)),o})},u=0;u1?r-1:0),i=1;i1?t-1:0),i=1;i",inputs:["props"]}).Class({constructor:[o,u,function(n,r){this._props={},this.elementRef=n,this.zone=r}],ngOnInit:function(){var r=this.elementRef.nativeElement;this.parent=n.init(f(this)),this.parent.render(r,Wr.g)},ngDoCheck:function(){this.parent&&!function(n,r){var t={};for(var e in n)if(n.hasOwnProperty(e)&&(t[e]=!0,n[e]!==r[e]))return!1;for(var i in r)if(!t[i])return!1;return!0}(this._props,this.props)&&(this._props=i({},this.props),this.parent.updateProps(f(this)))}});return e({declarations:[c],exports:[c]}).Class({constructor:function(){}})}},rt={K:"visible",nn:"invisible"};function tt(n){var r=n.uid,t=n.frame,e=n.prerenderFrame,i=n.doc,o=n.props,u=n.event,f=n.dimensions,c=f.width,a=f.height;if(t&&e){var s=i.createElement("div");s.setAttribute("id",r);var d=i.createElement("style");return o.cspNonce&&d.setAttribute("nonce",o.cspNonce),d.appendChild(i.createTextNode("\n #"+r+" {\n display: inline-block;\n position: relative;\n width: "+c+";\n height: "+a+";\n }\n\n #"+r+" > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+r+" > iframe."+rt.nn+" {\n opacity: 0;\n }\n\n #"+r+" > iframe."+rt.K+" {\n opacity: 1;\n }\n ")),s.appendChild(t),s.appendChild(e),s.appendChild(d),e.classList.add(rt.K),t.classList.add(rt.nn),u.on(Br.G,function(){e.classList.remove(rt.K),e.classList.add(rt.nn),t.classList.remove(rt.nn),t.classList.add(rt.K),setTimeout(function(){In(e)},1)}),u.on(Br.V,function(n){var r=n.width,t=n.height;"number"==typeof r&&(s.style.width=Sn(r)),"number"==typeof t&&(s.style.height=Sn(t))}),s}}function et(n){var r=n.doc,t=n.props,e=r.createElement("html"),i=r.createElement("body"),o=r.createElement("style"),u=r.createElement("div");return u.classList.add("spinner"),t.cspNonce&&o.setAttribute("nonce",t.cspNonce),e.appendChild(i),i.appendChild(u),i.appendChild(o),o.appendChild(r.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),e}var it=function(){return nn},ot=function(n){return rn(n.value)},ut=function(){function n(n){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(n){if(!n)throw new Error("Expected options to be passed");if(!n.tag||!n.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+n.tag);if(function(n){if(n.props&&"object"!=typeof n.props)throw new Error("Expected options.props to be an object");var r=function(n){var r=[];for(var t in n)n.hasOwnProperty(t)&&r.push(n[t]);return r}(Sr);if(n.props)for(var t=0,e=Object.keys(n.props);t>>0)+"__"+G,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var e=new WeakMap,n={};return Object.freeze(n),e.set(n,"__testvalue__"),"__testvalue__"===e.get(n)}catch(e){return!1}}())try{this.weakmap=new WeakMap}catch(e){}this.keys=[],this.values=[]}var n=e.prototype;return n._cleanupClosedWindows=function(){for(var e=this.weakmap,n=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!e)return"";if("string"==typeof e)return e;if(e instanceof Error){var t=e&&e.stack,r=e&&e.message;if(t&&r)return-1!==t.indexOf(r)?t:r+"\n"+t;if(t)return t;if(r)return r}return"function"==typeof e.toString?e.toString():{}.toString.call(e)}catch(e){return"Error while stringifying error: "+te(e,n+1)}}function re(e){return"string"==typeof e?e:e&&"function"==typeof e.toString?e.toString():{}.toString.call(e)}function oe(e,n){if(!n)return e;if(Object.assign)return Object.assign(e,n);for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}function ie(e,n){var t;return function r(){t=setTimeout(function(){e(),r()},n)}(),{cancel:function(){clearTimeout(t)}}}function ae(e,n,t){if(Array.isArray(e)){if("number"!=typeof n)throw new TypeError("Array key must be number")}else if("object"==typeof e&&null!==e&&"string"!=typeof n)throw new TypeError("Object key must be string");Object.defineProperty(e,n,{configurable:!0,enumerable:!0,get:function(){delete e[n];var r=t();return e[n]=r,r},set:function(t){delete e[n],e[n]=t}})}function se(e){return"object"==typeof(n=e)&&null!==n&&"[object Object]"==={}.toString.call(e);var n}function ue(e){if(!se(e))return!1;var n=e.constructor;if("function"!=typeof n)return!1;var t=n.prototype;return!!se(t)&&!!t.hasOwnProperty("isPrototypeOf")}function ce(e,n,t){if(void 0===t&&(t=""),Array.isArray(e)){for(var r=e.length,o=[],i=function(r){ae(o,r,function(){var o=t?t+"."+r:""+r,i=n(e[r],r,o);return(ue(i)||Array.isArray(i))&&(i=ce(i,n,o)),i})},a=0;a1?n-1:0),o=1;o1?t-1:0),o=1;o",inputs:["props"]}).Class({constructor:[i,a,function(e,n){this._props={},this.elementRef=e,this.zone=n}],ngOnInit:function(){var n=this.elementRef.nativeElement;this.parent=e.init(s(this)),this.parent.render(n,Fn.IFRAME)},ngDoCheck:function(){this.parent&&!function(e,n){var t={};for(var r in e)if(e.hasOwnProperty(r)&&(t[r]=!0,e[r]!==n[r]))return!1;for(var o in n)if(!t[o])return!1;return!0}(this._props,this.props)&&(this._props=o({},this.props),this.parent.updateProps(s(this)))}});return r({declarations:[u],exports:[u]}).Class({constructor:function(){}})}},nt={VISIBLE:"visible",INVISIBLE:"invisible"};function tt(e){var n=e.uid,t=e.frame,r=e.prerenderFrame,o=e.doc,i=e.props,a=e.event,s=e.dimensions,u=s.width,c=s.height;if(t&&r){var f=o.createElement("div");f.setAttribute("id",n);var d=o.createElement("style");return i.cspNonce&&d.setAttribute("nonce",i.cspNonce),d.appendChild(o.createTextNode("\n #"+n+" {\n display: inline-block;\n position: relative;\n width: "+u+";\n height: "+c+";\n }\n\n #"+n+" > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+n+" > iframe."+nt.INVISIBLE+" {\n opacity: 0;\n }\n\n #"+n+" > iframe."+nt.VISIBLE+" {\n opacity: 1;\n }\n ")),f.appendChild(t),f.appendChild(r),f.appendChild(d),r.classList.add(nt.VISIBLE),t.classList.add(nt.INVISIBLE),a.on(Un.RENDERED,function(){r.classList.remove(nt.VISIBLE),r.classList.add(nt.INVISIBLE),t.classList.remove(nt.INVISIBLE),t.classList.add(nt.VISIBLE),setTimeout(function(){Se(r)},1)}),a.on(Un.RESIZE,function(e){var n=e.width,t=e.height;"number"==typeof n&&(f.style.width=je(n)),"number"==typeof t&&(f.style.height=je(t))}),f}}function rt(e){var n=e.doc,t=e.props,r=n.createElement("html"),o=n.createElement("body"),i=n.createElement("style"),a=n.createElement("div");return a.classList.add("spinner"),t.cspNonce&&i.setAttribute("nonce",t.cspNonce),r.appendChild(o),o.appendChild(a),o.appendChild(i),i.appendChild(n.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),r}var ot=function(){return ee},it=function(e){return ne(e.value)},at=function(){function e(e){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(e){if(!e)throw new Error("Expected options to be passed");if(!e.tag||!e.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+e.tag);if(function(e){if(e.props&&"object"!=typeof e.props)throw new Error("Expected options.props to be an object");var n=function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(e[t]);return n}(kn);if(e.props)for(var t=0,r=Object.keys(e.props);t(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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.js b/dist/zoid.js index b64c63fe..50b786ae 100644 --- a/dist/zoid.js +++ b/dist/zoid.js @@ -2064,7 +2064,7 @@ } function lib_global_getGlobal(win) { if (void 0 === win && (win = window), !isSameDomain(win)) throw new Error("Can not get global for window on different domain"); - return win.__zoid_9_0_21__ || (win.__zoid_9_0_21__ = {}), win.__zoid_9_0_21__; + return win.__zoid_9_0_22__ || (win.__zoid_9_0_22__ = {}), win.__zoid_9_0_22__; } function getProxyObject(obj) { return { @@ -2192,7 +2192,7 @@ _this.component = component, _this.onPropHandlers = []; var childPayload = getChildPayload(); if (!childPayload) throw new Error("No child payload found"); - if ("9_0_21" !== childPayload.version) throw new Error("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_21"); + "9_0_22" !== childPayload.version && console.log("Parent window has zoid version " + childPayload.version + ", child window has version 9_0_22"); var parent = childPayload.parent, domain = childPayload.domain, exports = childPayload.exports, props = childPayload.props; _this.context = childPayload.context, _this.parentComponentWindow = _this.getParentComponentWindow(parent), _this.parentDomain = domain, _this.parent = setup_deserializeMessage(_this.parentComponentWindow, domain, exports), @@ -2640,7 +2640,7 @@ return { uid: uid, context: context, - version: "9_0_21", + version: "9_0_22", domain: utils_getDomain(window), tag: this.component.tag, parent: this.getWindowRef(target, initialDomain, uid, context), @@ -3473,7 +3473,7 @@ var destroyComponents = destroyAll; function component_destroy() { var listener; - destroyAll(), delete window.__zoid_9_0_21__, function() { + destroyAll(), delete window.__zoid_9_0_22__, function() { for (var responseListeners = globalStore("responseListeners"), _i2 = 0, _responseListeners$ke2 = responseListeners.keys(); _i2 < _responseListeners$ke2.length; _i2++) { var hash = _responseListeners$ke2[_i2], listener = responseListeners.get(hash); listener && (listener.cancelled = !0), responseListeners.del(hash); diff --git a/dist/zoid.js.map b/dist/zoid.js.map index 18b489af..2cac7500 100644 --- a/dist/zoid.js.map +++ b/dist/zoid.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","log","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"CAAA,SAAAA,MAAAC;IACA,mBAAAC,WAAA,mBAAAC,SACAA,OAAAD,UAAAD,YACA,qBAAAG,iBAAAC,MACAD,OAAA,YAAAH,WACA,mBAAAC,UACAA,QAAA,OAAAD,YAEAD,KAAA,OAAAC;CARA,CASC,sBAAAK,cAAAC,MAAA;IACD;QCTA,IAAAC,mBAAA;QAGA,SAAAC,oBAAAC;YAGA,IAAAF,iBAAAE,WACA,OAAAF,iBAAAE,UAAAR;YAGA,IAAAC,SAAAK,iBAAAE,YAAA;gBACAC,GAAAD;gBACAE,IAAA;gBACAV,SAAA;;YAUA,OANAW,QAAAH,UAAAI,KAAAX,OAAAD,SAAAC,eAAAD,SAAAO;YAGAN,OAAAS,KAAA,GAGAT,OAAAD;;QA0DA,OArDAO,oBAAAM,IAAAF,SAGAJ,oBAAAO,IAAAR;QAGAC,oBAAAQ,IAAA,SAAAf,SAAAgB,MAAAC;YACAV,oBAAAW,EAAAlB,SAAAgB,SACAG,OAAAC,eAAApB,SAAAgB,MAAA;gBAA0CK,aAAA;gBAAAC,KAAAL;;WAK1CV,oBAAAgB,IAAA,SAAAvB;YACA,sBAAAwB,iBAAAC,eACAN,OAAAC,eAAApB,SAAAwB,OAAAC,aAAA;gBAAwDC,OAAA;gBAExDP,OAAAC,eAAApB,SAAA;gBAAiD0B,QAAA;;WAQjDnB,oBAAAoB,IAAA,SAAAD,OAAAE;YAEA,IADA,IAAAA,SAAAF,QAAAnB,oBAAAmB,SACA,IAAAE,MAAA,OAAAF;YACA,QAAAE,QAAA,mBAAAF,wBAAAG,YAAA,OAAAH;YACA,IAAAI,KAAAX,OAAAY,OAAA;YAGA,IAFAxB,oBAAAgB,EAAAO,KACAX,OAAAC,eAAAU,IAAA;gBAAyCT,aAAA;gBAAAK;gBACzC,IAAAE,QAAA,mBAAAF,OAAA,SAAAM,OAAAN,OAAAnB,oBAAAQ,EAAAe,IAAAE,KAAA,SAAAA;gBAAgH,OAAAN,MAAAM;cAAqBC,KAAA,MAAAD;YACrI,OAAAF;WAIAvB,oBAAA2B,IAAA,SAAAjC;YACA,IAAAgB,SAAAhB,iBAAA4B,aACA;gBAA2B,OAAA5B,OAAA;gBAC3B;gBAAiC,OAAAA;;YAEjC,OADAM,oBAAAQ,EAAAE,QAAA,KAAAA,SACAA;WAIAV,oBAAAW,IAAA,SAAAiB,QAAAC;YAAsD,OAAAjB,GAAAkB,eAAAzB,KAAAuB,QAAAC;WAGtD7B,oBAAA+B,IAAA,IAIA/B,wCAAAgC,IAAA;;;;;QClFe,SAASC;YAetB,QAdAA,WAAWrB,OAAOsB,UAAU,SAAUC;gBACpC,KAAK,IAAIjC,IAAI,GAAGA,IAAIkC,UAAUC,QAAQnC,KAAK;oBACzC,IAAIoC,SAASF,UAAUlC;oBAEvB,KAAK,IAAIuB,OAAOa,SACV1B,IAAiBkB,eAAezB,KAAKiC,QAAQb,SAC/CU,OAAOV,OAAOa,OAAOb;;gBAK3B,OAAOU;eAGOI,MAAMzC,MAAMsC;;QCbvB,SAASI,gBAAUC;YACtB;gBACI,KAAKA,MACD,QAAO;gBAGX,IAAuB,sBAAZC,WAA2BD,gBAAgBC,SAClD,QAAO;gBAGX,IAAsB,sBAAXC,UAA0BA,OAAOC,UAAUH,gBAAgBE,OAAOC,QACzE,QAAO;gBAGX,IAAsB,sBAAXD,UAA0BA,OAAOE,eAAeJ,gBAAgBE,OAAOE,aAC9E,QAAO;gBAGX,IAAIC,YAAY,GAAIA;gBAEpB,IAAIA,WAAU;oBACV,IAAIrC,OAAOqC,UAASzC,KAAKoC;oBAEzB,IAAa,sBAAThC,QAAuC,sBAATA,QAAuC,yBAATA,MAC5D,QAAO;;gBAIf,IAAyB,qBAAdgC,KAAKM,MACZ,QAAO;cAEb,OAAOC;gBACL,QAAO;;YAGX,QAAO;;;;;QCjCX,ICCIC,cDDEC,mBAAmB,IACnBC,mCAAmC,ICDrCC,cAAc;QAGlB,SAASC;YACL,KAAKD,eAAeH,cAAc;gBAC9B,IAAMK,UAAUL;gBAChBA,eAAe,MACfK,QAAQC;;;QAIT,SAASC;YACZJ,eAAe;;QAGZ,SAASK;YACZL,eAAe,GACfC;;QCfG,IAAMK,uBAAb;YAeI,SAAAA,aAAYC;gBAAuF,IAAAC,QAAA9D;gBAQ/F,IAR+FA,KAbnG+D,gBAamG,GAAA/D,KAZnGgE,gBAYmG,GAAAhE,KAXnGiE,oBAWmG;gBAAAjE,KAVnGqB,aAUmG,GAAArB,KATnGkE,aASmG,GAAAlE,KARnGmE,gBAQmG,GAAAnE,KAHnGoE,mBAGmG;gBAAApE,KAFnGqE,aAEmG,GAE/FrE,KAAK+D,YAAW,GAChB/D,KAAKgE,YAAW,GAChBhE,KAAKiE,gBAAe;gBAEpBjE,KAAKmE,WAAW,IAEZN,SAAS;oBAET,IAAIS,SACAJ,QACAH,YAAW,GACXC,YAAW,GACXO,WAAU;oBAEdb;oBAEA;wBACIG,QAAQ,SAAAW;4BACAD,UACAT,MAAKL,QAAQe,QAEbT,YAAW,GACXO,UAASE;2BAGd,SAAAtB;4BACKqB,UACAT,MAAKW,OAAOvB,QAEZc,YAAW,GACXE,SAAQhB;;sBAIlB,OAAOA;wBAGL,OAFAS,kBACA3D,KAAKyE,OAAOvB;;oBAIhBS,aAEAY,WAAU,GAENR,WAEA/D,KAAKyD,QAAQa,WACNN,YACPhE,KAAKyE,OAAOP;;;YAjE5B,IAAAQ,SAAAd,aAAAe;YAAA,OAAAD,OA8EIjB,UAAA,SAAQa;gBACJ,IAAItE,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI0C,gBAAU4B,SACV,MAAM,IAAIM,MAAM;gBAOpB,OAJA5E,KAAK+D,YAAW,GAChB/D,KAAKqB,QAAQiD,QACbtE,KAAK6E,YAEE7E;eA3Ff0E,OA8FID,SAAA,SAAOP;gBAAiC,IAAAY,SAAA9E;gBACpC,IAAIA,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI0C,gBAAUwB,QACV,MAAM,IAAIU,MAAM;gBAGpB,KAAKV,OAAO;oBACR,IAAIhB,OAAOgB,SAAmC,qBAAnBA,MAAMlB,WAA0BkB,MAAMlB,aAAalC,GAAiBkC,SAASzC,KAAK2D;oBAC7GA,QAAQ,IAAIU,MAAJ,kDAA2D1B;;gBAgBvE,OAbAlD,KAAKgE,YAAW,GAChBhE,KAAKkE,QAAQA,OAERlE,KAAKiE,gBACNc,WAAW;oBACFD,OAAKb,gBFhHnB,SAA2Cf,KAAaM;wBAE3D,KAAuC,MAAnCJ,iBAAiB4B,QAAQ9B,MAA7B;4BAIAE,iBAAiB6B,KAAK/B,MAEtB6B,WAAW;gCAMP,MAAM7B;+BACP;4BAEH,KAAK,IAAIgC,IAAI,GAAGA,IAAI7B,iCAAiCd,QAAQ2C,KAEzD7B,iCAAiC6B,GAAGhC,KAAKM;;qBE8F7B2B,CAA+BjB,OAAOY;mBAE3C,IAGP9E,KAAK6E,YAEE7E;eAzHf0E,OA4HIU,cAAA,SAAYlB;gBAGR,OAFAlE,KAAKiE,gBAAe,GACpBjE,KAAKyE,OAAOP,QACLlE;eA/Hf0E,OAkIIG,WAAA;gBAAW,IAAAQ,SAAArF,MAEY+D,WAAiC/D,KAAjC+D,UAAUC,WAAuBhE,KAAvBgE,UAAUG,WAAanE,KAAbmE;gBAEvC,KAFoDnE,KAA9CoE,gBAMDL,YAAaC,WAAlB;oBAIAhE,KAAKoE,eAAc,GACnBV;oBAEA,KAfO,IAAA4B,QAAA,SAeElF;wBAfF,IAAAmF,cAiBmCpB,SAAS/D,IAAzCoF,YAjBHD,YAiBGC,WAAWC,UAjBdF,YAiBcE,SAASjC,UAjBvB+B,YAiBuB/B,SAEtBc,cAAM;wBAEV,IAAIP,UAEA;4BACIO,SAASkB,YAAYA,UAAUH,OAAKhE,SAASgE,OAAKhE;0BACpD,OAAO6B;4BAEL,OADAM,QAAQiB,OAAOvB,MACf;+BAGD,IAAIc,UAAU;4BAEjB,KAAKyB,SAED,OADAjC,QAAQiB,OAAOY,OAAKnB,QACpB;4BAGJ;gCACII,SAASmB,QAAQJ,OAAKnB;8BACxB,OAAOhB;gCAEL,OADAM,QAAQiB,OAAOvB,MACf;;;wBAIJoB,kBAAkBV,iBAAiBU,OAAOP,YAAYO,OAAON,aAEzDM,OAAOP,WACPP,QAAQC,QAAQa,OAAOjD,SAEvBmC,QAAQiB,OAAOH,OAAOJ;wBAG1BI,OAAOL,gBAAe,KAEfvB,gBAAU4B,UAEbA,kBAAkBV,iBAAiBU,OAAOP,YAAYO,OAAON,YACzDM,OAAOP,WACPP,QAAQC,QAAQa,OAAOjD,SAEvBmC,QAAQiB,OAAOH,OAAOJ,SAK1BI,OAAOrB,KAAK,SAAAuB;4BACRhB,QAAQC,QAAQe;2BACjB,SAAAtB;4BACCM,QAAQiB,OAAOvB;6BAMvBM,QAAQC,QAAQa;uBA5DflE,IAAI,GAAGA,IAAI+D,SAAS5B,QAAQnC,KAAKkF,MAAjClF;oBAgET+D,SAAS5B,SAAS,GAClBvC,KAAKoE,eAAc,GACnBT;;eAnNRe,OAsNIzB,OAAA,SAA2BuC,WAA0DC;gBAEjF,IAAID,aAAkC,qBAAdA,cAA6BA,UAAUjF,MAC3D,MAAM,IAAIqE,MAAM;gBAGpB,IAAIa,WAA8B,qBAAZA,YAA2BA,QAAQlF,MACrD,MAAM,IAAIqE,MAAM;gBAGpB,IAAIpB,UAAgC,IAAII;gBAYxC,OAVA5D,KAAKmE,SAASc,KAAK;oBACfzB;oBACAgC;oBACAC;oBAGJzF,KAAKiE,gBAAe,GAEpBjE,KAAK6E,YAEErB;eA5OfkB,OA+OIgB,QAAA,SAA4BD;gBACxB,OAAOzF,KAAKiD,UAAK0C,GAAWF;eAhPpCf,OAmPIkB,UAAA,SAAQC;gBAEJ,IAAIA,aAAkC,qBAAdA,cAA6BA,UAAUtF,MAC3D,MAAM,IAAIqE,MAAM;gBAGpB,OAAO5E,KAAKiD,KAAK,SAACqB;oBACd,OAAOV,aAAakC,IAAID,WACnB5C,KAAK;wBACF,OAAOqB;;mBAEhB,SAACpB;oBACA,OAAOU,aAAakC,IAAID,WACnB5C,KAAK;wBACF,MAAMC;;;eAjQ1BwB,OAsQIqB,UAAA,SAAQC,MAAe9C;gBAAgC,IAAA+C,SAAAjG;gBAEnD,IAAIA,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI+F,UAAUhB,WAAW;oBAEjBkB,OAAKlC,YAAYkC,OAAKjC,YAI1BiC,OAAKxB,OAAOvB,OAAO,IAAI0B,MAAJ,6BAAsCoB,OAAtC;mBAEpBA;gBAEH,OAAOhG,KAAKiD,KAAK,SAAAqB;oBAEb,OADA4B,aAAaH,UACNzB;;eAxRnBI,OA6RIyB,YAAA;gBAEI,IAAuB,sBAAZvD,SACP,MAAM,IAAIwD,UAAJ;gBAGV,OAAOxD,QAAQa,QAAQzD;eAnS/B4D,aAsSWH,UAAP,SAA0BpC;gBAEtB,OAAIA,iBAAiBuC,eACVvC,QAGPqB,gBAAUrB,SAEH,IAAIuC,aAAa,SAACH,SAASgB;oBAAV,OAAqBpD,MAAM4B,KAAKQ,SAASgB;qBAG9D,IAAIb,eAAeH,QAAQpC;eAjT1CuC,aAoTWa,SAAP,SAAcP;gBACV,OAAO,IAAIN,eAAea,OAAOP;eArTzCN,aAwTWwB,cAAP,SAAmBlB;gBACf,OAAO,IAAIN,eAAewB,YAAYlB;eAzT9CN,aA4TWyC,MAAP,SAA+LC;gBAE3L,IAAI9C,UAAU,IAAII,gBACd2C,QAAQD,SAAS/D,QACjBiE,UAAU;gBAEd,KAAKD,OAED,OADA/C,QAAQC,QAAQ+C,UACThD;gBAGX,KAXqQ,IAAAiD,SAAA,SAW5PrG;oBACL,IAAIsG,OAAOJ,SAASlG;oBAEpB,IAAIsG,gBAAgB9C;wBAChB,IAAI8C,KAAK3C,UAGL,OAFAyC,QAAQpG,KAAKsG,KAAKrF,OAClBkF,SAAS,GACT;2BAED,KAAK7D,gBAAUgE,OAGlB,OAFAF,QAAQpG,KAAKsG,MACbH,SAAS,GACT;oBAGJ3C,aAAaH,QAAQiD,MAAMzD,KAAK,SAAAqB;wBAC5BkC,QAAQpG,KAAKkE,QAEC,MADdiC,SAAS,MAEL/C,QAAQC,QAAQ+C;uBAErB,SAAAtD;wBACCM,QAAQiB,OAAOvB;;mBAtBd9C,IAAI,GAAGA,IAAIkG,SAAS/D,QAAQnC,KAAKqG,OAAjCrG;gBA8BT,OAJc,MAAVmG,SACA/C,QAAQC,QAAQ+C,UAGbhD;eArWfI,aAwWW+C,OAAP,SAAkCL;gBAC9B,IAAIhC,SAAS;gBAEb,OAAOV,aAAayC,IAAIvF,OAAO8F,KAAKN,UAAUO,IAAI,SAAAlF;oBAC9C,OAAOiC,aAAaH,QAAQ6C,SAAS3E,MAAMsB,KAAK,SAAA5B;wBAC5CiD,OAAO3C,OAAON;;oBAElB4B,KAAK;oBACL,OAAOqB;;eAhXnBV,aAoXWiD,MAAP,SAAiBC,OAAkBC;gBAE/B,OAAOnD,aAAayC,IAAIS,MAAMD,IAAIE;eAtX1CnD,aAyXWoD,+BAAP,SAAoCnD;gBAChC,OFlWD,SAAsCA;oBAGzC,OAFAR,iCAAiC4B,KAAKpB,UAE/B;wBACHoD,QADG;4BAEC5D,iCAAiC6D,OAAO7D,iCAAiC2B,QAAQnB,UAAU;;;iBE6VxFmD,CAA6BnD;eA1X5CD,aA6XWkC,MAAP,SAA8DiB,QAAiDI,SAAcC;gBAEzH,IAAIL,UAA4B,qBAAXA,WAA0BA,OAAOxG,MAClD,MAAM,IAAIqE,MAAM;gBAGpB,IAAIN;gBAEJZ;gBAEA;oBAEIY,SAASyC,OAAOtE,MAAM0E,SAASC,QAAQ;kBACzC,OAAOlE;oBAEL,OADAS,aACOC,aAAaa,OAAOvB;;gBAK/B,OAFAS,aAEOC,aAAaH,QAAQa;eAjZpCV,aAoZWyD,QAAP,SAAaA;gBACT,OAAO,IAAIzD,aAAa,SAAAH;oBACpBsB,WAAWtB,SAAS4D;;eAtZhCzD,aA0ZWlB,YAAP,SAAiBrB;gBAEb,UAAIA,SAASA,iBAAiBuC,iBAIvBlB,gBAAUrB;eAhazBuC,aAmaW0D,QAAP;gBACI,ODjZA9D,UAAUL,eAAeA,gBAAgB,ICiZtBS,gBDhZvBL;gBACOC;gBAHJ,IACCA;eCnBRI;SAAA;QCJO,SAAS2D,QAAQ5E;YACpB,OAAgD,sBAAzC7B,GAAiBkC,SAASzC,KAAKoC;;QCDnC,IAAM6E,WAAW;YACpBC,MAAQ;YACRC,MAAQ;YACRC,OAAQ;WAGCC,WAAW,KAEXC,cAAc;YACvBC,QAAS;YACTC,OAAS;WCLTC,sBAAsB;QAMnB,SAASC,gBAAgBC;YAC5B,YAD2E,MAA/CA,cAA6BrF,SAClDqF,IAAIC,SAASC,aAAaZ,SAASG;;QAGvC,SAASU,UAAUH;YAEtB,IAAKA,KAIL;gBACI,IAAIA,IAAII,UAAUJ,IAAII,WAAWJ,KAC7B,OAAOA,IAAII;cAEjB,OAAOpF;;QAKN,SAASqF,UAAUL;YAEtB,IAAKA,QAKDG,UAAUH,MAId;gBACI,OAAOA,IAAIM;cACb,OAAOtF;;QAKN,SAASuF,kBAAkBP;YAC9B;gBAGI,QAAO;cACT,OAAOhF;YAIT,QAAO;;QAGJ,SAASwF,gBAAgBR;YAI5B,IAAIC,YAFJD,MAAMA,OAAOrF,QAEMsF;YAEnB,KAAKA,UACD,MAAM,IAAIvD,MAAJ;YAGV,IAAIwD,WAAWD,SAASC;YAExB,KAAKA,UACD,MAAM,IAAIxD,MAAJ;YAGV,IAAIwD,aAAaZ,SAASE,MACtB,OAAWF,SAASE,OAApB;YAGJ,IAAIU,aAAaZ,SAASG,OAAO;gBAE7B,IAAIW,SAASD,UAAUH;gBACvB,OAAII,UAAUG,sBAEHC,gBAAgBJ,UAGhBd,SAASG,QAApB;;YAGJ,IAAIgB,OAAOR,SAASQ;YAEpB,KAAKA,MACD,MAAM,IAAI/D,MAAJ;YAGV,OAAWwD,WAAX,OAA0BO;;QAGvB,SAASC,gBAAUV;YAItB,IAAIW,SAASH,gBAFbR,MAAMA,OAAOrF;YAIb,OAAIgG,UAAUX,IAAIY,cAAwD,MAA1CZ,IAAIY,WAAW9D,QAAQwC,SAASC,QACrDS,IAAIY,aAGRD;;QAgEJ,SAASE,aAAab;YAEzB,KA9CG,SAA8BA;gBAEjC;oBACI,IAAIA,QAAQrF,QACR,QAAO;kBAGb,OAAOK;gBAIT;oBACI,IAAI8F,OAAOlI,OAAOmI,yBAAyBf,KAAK;oBAEhD,IAAIc,SAA4B,MAApBA,KAAKhI,YACb,QAAO;kBAGb,OAAOkC;gBAIT;oBAEI,IAAI+E,gBAAgBC,QAAQO,qBACxB,QAAO;kBAEb,OAAOvF;gBAIT;oBAEI,IAAIwF,gBAAgBR,SAASQ,gBAAgB7F,SACzC,QAAO;kBAGb,OAAOK;gBAIT,QAAO;aAKFgG,CAAqBhB,MACtB,QAAO;YAGX;gBAEI,IAAIA,QAAQrF,QACR,QAAO;gBAIX,IAAIoF,gBAAgBC,QAAQO,qBACxB,QAAO;gBAIX,IAAIG,gBAAU/F,YAAY+F,gBAAUV,MAChC,QAAO;cAGb,OAAOhF;YAIT,QAAO;;QAIJ,SAASiG,iBAAiBjB;YAC7B,KAAKa,aAAab,MACd,MAAM,IAAItD,MAAJ;YAIV,OAAOsD;;QAqBJ,SAASkB,iBAAiBd,QAAgCe;YAE7D,KAAKf,WAAWe,OACZ,QAAO;YAGX,IAAIC,cAAcjB,UAAUgB;YAE5B,OAAIC,cACOA,gBAAgBhB,UAGgB,MA9BxC,SAAoBJ;gBAEvB,IAAI5D,SAAS;gBAEb;oBAEI,MAAO4D,IAAII,WAAWJ,OAClB5D,OAAOW,KAAKiD,IAAII,SAChBJ,MAAMA,IAAII;kBAGhB,OAAOpF;gBAIT,OAAOoB;aAeHiF,CAAWF,OAAOrE,QAAQsD;;QAO3B,SAASkB,UAAUtB;YAEtB,IAEIuB,QAQAC,KAVApF,SAAS;YAIb;gBACImF,SAASvB,IAAIuB;cACf,OAAOvG;gBACLuG,SAASvB;;YAKb;gBACIwB,MAAMD,OAAOlH;cACf,OAAOW;YAIT,IAAY,MAARwG,KACA,OAAOpF;YAGX,IAAIoF,KAAK;gBACL,KAAK,IAAItJ,IAAI,GAAGA,IAAIsJ,KAAKtJ,KAAK;oBAE1B,IAAIuJ,aAAK;oBAET;wBACIA,QAAQF,OAAOrJ;sBACjB,OAAO8C;wBACL;;oBAGJoB,OAAOW,KAAK0E;;gBAGhB,OAAOrF;;YAGX,KAAK,IAAIlE,KAAI,GAAGA,KAAI,KAAKA,MAAK;gBAC1B,IAAIuJ,cAAK;gBAET;oBACIA,SAAQF,OAAOrJ;kBACjB,OAAO8C;oBACL,OAAOoB;;gBAGX,KAAKqF,QACD,OAAOrF;gBAGXA,OAAOW,KAAK0E;;YAGhB,OAAOrF;;QAIJ,SAASsF,kBAAkB1B;YAA4D,KAE1F,IAAI5D,SAAS,IAF6EuF,MAAA,GAAAC,cAIxEN,UAAUtB,MAJ8D2B,MAAAC,YAAAvH,QAAAsH,OAIxD;gBAA7B,IAAIF,QAAKG,YAAAD;gBACVvF,OAAOW,KAAK0E;gBADkB,SAAAI,MAAA,GAAAC,sBAGPJ,kBAAkBD,QAHXI,MAAAC,oBAAAzH,QAAAwH,OAI1BzF,OAAOW,KADQ+E,oBAAAD;;YAKvB,OAAOzF;;QAGJ,SAAS2F,OAAO/B;YAEnB,IAAKA,KAAL;gBAIA;oBACI,IAAIA,IAAIgC,KACJ,OAAOhC,IAAIgC;kBAEjB,OAAOhH;gBAIT,IAAImF,UAAUH,SAASA,KACnB,OAAOA;gBAGX;oBACI,IAAIkB,iBAAiBvG,QAAQqF,QAAQrF,OAAOqH,KACxC,OAAOrH,OAAOqH;kBAEpB,OAAOhH;gBAIT;oBACI,IAAIkG,iBAAiBlB,KAAKrF,WAAWA,OAAOqH,KACxC,OAAOrH,OAAOqH;kBAEpB,OAAOhH;gBA9BgE,SAAAiH,MAAA,GAAAC,sBAkCvDR,kBAAkB1B,MAlCqCiC,MAAAC,oBAAA7H,QAAA4H,OAkC/B;oBAArC,IAAIR,QAAKS,oBAAAD;oBACV;wBACI,IAAIR,MAAMO,KACN,OAAOP,MAAMO;sBAEnB,OAAOhH;oBAIT,IAAImF,UAAUsB,WAAWA,OACrB,OAAOA;;;;QAmBZ,SAASU,qBAAqBnC;YACjC,IAAIgC,MAAMD,OAAO/B;YAEjB,KAAKgC,KACD,MAAM,IAAItF,MAAJ;YAGV,UAAA0F,OAAYV,kBAAkBM,MAA9B,EAAoCA;;QAoDxC,IAAIK,gBAAgB,IAChBC,eAAe;QAEZ,SAASC,eAAevC,KAA6BwC;iBAAsC,MAAtCA,2BAAsB;YAE9E;gBACI,IAAIxC,QAAQrF,QACR,QAAO;cAEb,OAAOK;gBACL,QAAO;;YAGX;gBACI,KAAKgF,KACD,QAAO;cAGb,OAAOhF;gBACL,QAAO;;YAGX;gBACI,IAAIgF,IAAIyC,QACJ,QAAO;cAGb,OAAOzH;gBAIL,QAAIA,OAAOA,IAAI0H,YAAY5C;;YAQ/B,IAAI0C,aAAa3B,aAAab,MAC1B;gBAEI,IAAIA,IAAI2C,YACJ,QAAO;cAEb,OAAO3H;YAOb;gBACI,KAAKgF,IAAII,WAAWJ,IAAIgC,KACpB,QAAO;cAEb,OAAOhH;YAeT,IAAI4H,cAtFR,SAAwBC,YAAuBpI;gBAC3C,KAAK,IAAIvC,IAAI,GAAGA,IAAI2K,WAAWxI,QAAQnC,KAEnC;oBACI,IAAI2K,WAAW3K,OAAOuC,MAClB,OAAOvC;kBAEb,OAAO8C;gBAKb,QAAQ;aA0EU8H,CAAYT,eAAerC;YAE7C,KAAqB,MAAjB4C,aAAoB;gBACpB,IAAInB,QAAQa,aAAaM;gBAEzB,IAAInB,SA9GL,SAA6BA;oBAEhC,KAAKA,MAAMsB,eACP,QAAO;oBAGX,KAAKtB,MAAMuB,YACP,QAAO;oBAGX,IAAIC,MAAMxB,MAAMyB;oBAEhB,UAAID,QAAOA,IAAIE,mBAAoBF,IAAIE,gBAAgBC,SAAS3B;iBAkG/C4B,CAAoB5B,QAC7B,QAAO;;YAIf,QAAO;;QAkCJ,SAAS6B,mBAAatD;YAEzB,QADAA,MAAMA,OAAOrF,QACF4I,UAAUC,iBAAiBxD,IAAIuD,UAAUE;;QAIjD,SAASC,eAAe1D,KAA6BvH;YAAwC,KAEhG,IAAIkL,YAAYrC,UAAUtB,MAFsE4D,MAAA,GAAAA,MAIzED,UAJyEtJ,QAAAuJ,OAI9D;gBAA7B,IAAIC,aAAcF,UAAJC;gBACf;oBAEI,IAAI/C,aAAagD,eAAeA,WAAWpL,SAASA,SAA2C,MAAnCkL,UAAU7G,QAAQ+G,aAC1E,OAAOA;kBAEb,OAAO7I;;YAKb;gBAEI,KAA6C,MAAzC2I,UAAU7G,QAAQkD,IAAIuB,OAAO9I,QAE7B,OAAOuH,IAAIuB,OAAO9I;cAExB,OAAOuC;YAIT;gBACI,KAAsC,MAAlC2I,UAAU7G,QAAQkD,IAAIvH,QACtB,OAAOuH,IAAIvH;cAEjB,OAAOuC;;QAsDN,SAAS8I,SAAS1D,QAAgCe;YAErD,OAAOf,WAAWC,UAAUc;;QAGzB,SAAS4C,YAAY/D;YAKxB,OAFaK,UAFbL,MAAMA,OAAOrF,WAQAwF,UAAUH,aAEvB;;QA+DJ,SAASgE,SAASC,aAAaC;YAAuB,SAAAC,OAAA,GAAAA,OAEhCF,YAFgC5J,QAAA8J,QAEnB,KAA1B,IAAIC,QAASH,YAAJE,OAAiBE,OAAA,GAAAA,OACTH,YADS7J,QAAAgK,QAEvB,IAAID,UADUF,YAAJG,OAEN,QAAO;YAKnB,QAAO;;QAGJ,SAASC,mBAAmBtE;iBAA+C,MAA/CA,cAA8BrF;YAI7D,KAHA,IAAI4J,WAAW,GACXnE,SAASJ,KAENI,WACHA,SAASD,UAAUC,aAEfmE,YAAY;YAIpB,OAAOA;;QAqBJ,SAASC,gBAAgBC,MAA8BC;YAE1D,IAAIC,OAAO5C,OAAO0C,SAASA,MACvBG,OAAO7C,OAAO2C,SAASA;YAE3B;gBACI,IAAIC,QAAQC,MACR,OAAID,SAASC;cAMnB,OAAO5J;YAIT,IAAI6J,aAAa1C,qBAAqBsC,OAClCK,aAAa3C,qBAAqBuC;YAEtC,IAAIV,SAASa,YAAYC,aACrB,QAAO;YAGX,IAAIC,UAAU1E,UAAUsE,OACpBK,UAAU3E,UAAUuE;YAExB,SAAIG,WAAWf,SAAS7B,qBAAqB4C,UAAUD,gBAInDE,WAAWhB,SAAS7B,qBAAqB6C,UAAUH;YAC5C;;QAMR,SAASI,YAAYC,SAAyBC;YAEjD,IAAuB,mBAAZD,SAAsB;gBAE7B,IAAsB,mBAAXC,QACP,OAAOD,YAAYxF,YAAYyF,WAAWD;gBAG9C,IAAI7F,QAAQ8F,SACR,QAAO;gBAGX,IAAIC,MAAMC,QAAQF,SACd,QAAO;;YAIf,OAAI9F,QAAQ6F,WAEJ7F,QAAQ8F,UACDD,QAAQpK,eAAeqK,OAAOrK,cAGrCsK,MAAMC,QAAQF,WAKXG,QAAQH,OAAOI,MAAML,cAG5BE,MAAMC,QAAQH,aAEVE,MAAMC,QAAQF,UACPK,KAAKC,UAAUP,aAAaM,KAAKC,UAAUN,WAGlD9F,QAAQ8F,WAILD,QAAQQ,KAAK,SAAAC;gBAAU,OAAIV,YAAYU,YAAYR;;;QAgB3D,SAASS,iBAAiBC;YAI7B,OAAIA,IAAIN,MAAM,8BACDM,IAKGC,MAAM,KAAKC,MAAM,GAAG,GAAGC,KAAK,OAHjCtF;;QAQR,SAASuF,cAAcjG,KAA6BkG,UAAqB/G,OAAuBgH;YAEnG,IAAItI;YAuBJ,YAzB0J,MAA9EsB,kBAAiB,WAA6D,MAAvDgH,sBAAmBC;YAI1G,SAARC;gBAEA,IAAI9D,eAAevC,MAMf,OAJInC,WACAG,aAAaH,UAGVqI;gBAGPC,WAAW,IACXnI,aAAaH,YAEbsI,WAAWhH,OACXtB,UAAUhB,WAAWwJ,OAAOlH;aAIpCkH,IAEO;gBACHtH,QADG;oBAEKlB,WACAG,aAAaH;;;;QAOtB,SAASyI,SAASC;YAErB;gBACI,IAAIA,QAAQ5L,QACR,QAAO;cAEb,OAAOK;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAA4C,sBAAxClH,GAAiBkC,SAASzC,KAAKkO,MAC/B,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAInF,OAAOC,UAAU2L,eAAe5L,OAAOC,QACvC,QAAO;cAEb,OAAOI;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAI1O,SAAS0O,KACpB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAInG,WAAWmG,KACtB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAIvE,QAAQuE,KACnB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAkBf,QAAO;;QAmBJ,SAAS0G,iBAAiBX;YAC7B,IAJyC,MAIvBD,iBAAiBC,KAJrB/I,QAAQwC,SAASC,OAK3B,OAAOsG;YAIP,MAAM,IAAInJ,MAAJ;;QC9/BP,SAASoG,iBAAeD,YAAuBpI;YAClD,KAAK,IAAIvC,IAAI,GAAGA,IAAI2K,WAAWxI,QAAQnC,KAEnC;gBACI,IAAI2K,WAAW3K,OAAOuC,MAClB,OAAOvC;cAEb,OAAO8C;YAKb,QAAQ;;QCPZ,ICmDIyL,WCodAC,wBFvgBA7N,iBAAiBD,OAAOC,gBACxB8N,UAAUC,KAAKC,QAAQ,KAEdC,iCAAb;YAOI,SAAAA;gBAMI,IANUhP,KALdW,YAKc,GAAAX,KAJdiP,eAIc,GAAAjP,KAHd4G,YAGc,GAAA5G,KAFdkP,cAEc;gBACVL,WAAW,GAGX7O,KAAKW,OAAL,gBAA0C,MAAhBwO,KAAKC,aAAmB,KAAlD,OAA0DP;gBGnB3D;oBAEH,IAAuB,sBAAZQ,SACP,QAAO;oBAGX,SAA6B,MAAlBvO,OAAOwO,QACd,QAAO;oBAGX;wBAEI,IAAIC,cAAc,IAAIF,WAClBG,UAAU;wBAOd,OAJA1O,OAAOwO,OAAOE,UAEdD,YAAYE,IAAID,SAJA,sCAMZD,YAAYtO,IAAIuO;sBAMtB,OAAOtM;wBAEL,QAAO;;iBHPHwM,IACA;oBACI1P,KAAKiP,UAAU,IAAII;kBACrB,OAAOnM;gBAKblD,KAAK4G,OAAQ,IACb5G,KAAKkP,SAAS;;YAtBtB,IAAAxK,SAAAsK,uBAAArK;YAAA,OAAAD,OAyBIiL,wBAAA;gBAKI,KAHA,IAAIV,UAAUjP,KAAKiP,SACfrI,OAAO5G,KAAK4G,MAEPxG,IAAI,GAAGA,IAAIwG,KAAKrE,QAAQnC,KAAK;oBAClC,IAAIiB,QAAQuF,KAAKxG;oBAEjB,IAAIoO,SAASnN,UAAUoJ,eAAepJ,QAAQ;wBAE1C,IAAI4N,SACA;4BACIA,QAAQW,OAAOvO;0BACjB,OAAO6B;wBAKb0D,KAAKM,OAAO9G,GAAG,IACfJ,KAAKkP,OAAOhI,OAAO9G,GAAG,IAEtBA,KAAK;;;eA9CrBsE,OAmDImL,oBAAA,SAAkBlO;gBAEd,QAAI6M,SAAS7M;eArDrB+C,OAmEI+K,MAAA,SAAI9N,KAASN;gBAET,KAAKM,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACIA,QAAQQ,IAAI9N,KAAKN;kBACnB,OAAO6B;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAerB;oBAEH,IAAIhB,OAAOX,KAAKW,MACZmP,QAAQnO,IAAIhB;oBAEZmP,SAASA,MAAM,OAAOnO,MACtBmO,MAAM,KAAKzO,QAEXN,eAAeY,KAAKhB,MAAM;wBACtBU,OAAU,EAAEM,KAAKN;wBACjB0O,WAAU;;uBAzBY;oBAE9B/P,KAAK2P;oBAEL,IAAI/I,OAAO5G,KAAK4G,MACZsI,SAASlP,KAAKkP,QACdc,QAAQhF,iBAAYpE,MAAMjF;qBAEf,MAAXqO,SACApJ,KAAK3B,KAAKtD,MACVuN,OAAOjK,KAAK5D,UAEZ6N,OAAOc,SAAS3O;;eA/FhCqD,OAkHIzD,MAAA,SAAIU;gBAEA,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACI,IAAIA,QAAQgB,IAAItO,MACZ,OAAOsN,QAAQhO,IAAIU;kBAEzB,OAAOuB;2BACElD,KAAKiP;;gBAIpB,KAAKjP,KAAK6P,kBAAkBlO,MAAM;oBAE9B3B,KAAK2P;oBAEL,IACIK,QAAQhF,iBADDhL,KAAK4G,MACcjF;oBAE9B,KAAe,MAAXqO,OACA;oBAGJ,OAAOhQ,KAAKkP,OAAOc;;gBAInB,IAAIF,QAAQnO,IAAI3B,KAAKW;gBAErB,IAAImP,SAASA,MAAM,OAAOnO,KACtB,OAAOmO,MAAM;eAtJ7BpL,OA2JIkL,SAAA,SAAOjO;gBAEH,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACIA,QAAQW,OAAOjO;kBACjB,OAAOuB;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAYrB;oBAEH,IAAImO,QAAQnO,IAAI3B,KAAKW;oBAEjBmP,SAASA,MAAM,OAAOnO,QACtBmO,MAAM,KAAKA,MAAM,UAAKnK;uBAjBI;oBAE9B3F,KAAK2P;oBAEL,IAAI/I,OAAO5G,KAAK4G,MACZoJ,QAAQhF,iBAAYpE,MAAMjF;qBAEf,MAAXqO,UACApJ,KAAKM,OAAO8I,OAAO,IACnBhQ,KAAKkP,OAAOhI,OAAO8I,OAAO;;eApL1CtL,OAiMIuL,MAAA,SAAItO;gBAEA,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACI,IAAIA,QAAQgB,IAAItO,MACZ,QAAO;kBAEb,OAAOuB;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAOrB;oBAEH,IAAImO,QAAQnO,IAAI3B,KAAKW;oBAErB,UAAImP,SAASA,MAAM,OAAOnO;;gBAN1B,OAHA3B,KAAK2P,0BAGa,MADN3E,iBAAYhL,KAAK4G,MAAMjF;eAvN/C+C,OAsOIwL,WAAA,SAASvO,KAASf;gBACd,IAAIZ,KAAKiQ,IAAItO,MAET,OAAO3B,KAAKiB,IAAIU;gBAGpB,IAAIN,QAAQT;gBAEZ,OADAZ,KAAKyP,IAAI9N,KAAKN,QACPA;eA9Of2N;SAAA;QCFO,SAASmB,aAAaC;YACzB,IAAoB,qBAATC,MACP,OAAOA,KAAKD;YACT,IAAsB,sBAAXE,QACd,OAAOA,OAAOC,KAAKH,KAAK,QAAQpN,SAAS;YAG7C,MAAM,IAAI4B,MAAJ;;QAeH,SAAS4L;YAEZ,IAAIC,QAAQ;YAUZ,OARe,aAAaC,QAAQ,MAAM;gBACtC,OAAOD,MAAME,OAAOxB,KAAKyB,MAAMzB,KAAKC,WAAWqB,MAAMlO;iBAOzD,MAJa4N,aACT,IAAIrB,OAAO+B,cAAc5C,MAAM,IAAI,IAAIyC,QAAQ,KAAK,MACtDA,QAAQ,iBAAiB,IAAII;;QAsCnC,SAASC,cAAc3J;YACnB;gBACI,OAAOsG,KAAKC,UAAUL,GAAgBW,MAAM1N,KAAK6G,OAAO,SAAC4J,QAAQC;oBAC7D,OAAmB,qBAARA,MACP,aAtBT,SAAqBxC;wBAIxB,IAFAE,YAAYA,aAAa,IAAIU,kCAEzBZ,eAAqD,mBAARA,OAAmC,qBAARA,KACxE,MAAM,IAAI7J,MAAJ;wBAGV,IAAIsM,MAAMvC,UAAU1N,IAAIwN;wBAOxB,OALKyC,QACDA,aAAiBzC,MAAd,MAAuB+B,YAC1B7B,UAAUc,IAAIhB,KAAKyC,OAGhBA;qBAOwBC,CAAYF,OAA/B,MAEGA;;cAEb,OAAO/N;gBACL,MAAM,IAAI0B,MAAJ;;;QA2CP,SAASwM,eAAkBrK;YAC9B,IAAIsK,QAAQ;YAGZ,SAASC;gBAAgE,SAAAC,QAAAjP,UAAAC,QAArC6E,OAAqC,IAAAkG,MAAAiE,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAArCpK,KAAqCoK,SAAAlP,UAAAkP;gBACrE,IAAI7P,MAAeoP,cAAc3J;gBAEjC,OAAIiK,MAAMrP,eAAeL,OACd0P,MAAM1P,QAGjB0P,MAAM1P,OAAOoF,OAAOtE,MAAMzC,MAAMsC,WAC3BsD,QAAQ;2BACEyL,MAAM1P;oBAGd0P,MAAM1P;;YAOjB,OAJA2P,wBAAwBG,QAAQ;gBAC5BJ,QAAQ;eAGLC;;QAiBJ,SAASI,cAAiB3K,QAAsC4K,OAAqCvK;iBAA4B,MAA5BA,gBAAoB;YAC5H,IAAIiK,QAAQtK,OAAO6K,2BAA2B7K,OAAO6K,4BAA4B,IAC7EjQ,MAAMoP,cAAc3J;YAExB,OAAIiK,MAAMrP,eAAeL,OACd0P,MAAM1P,OAGJ0P,MAAM1P,OAAOgQ,MAAKlP,WAAL,GAAS2E;;QAKhC,SAASyK;QAIT,SAASC,KAAK/K;YACjB,IAAIgL,UAAS;YAEb,OAAO;gBACH,KAAKA,QAED,OADAA,UAAS,GACFhL,OAAOtE,MAAMzC,MAAMsC;;;QAkE/B,SAAS0P,eAAe9O,KAAa+O;YAExC,SAFqE,MAA7BA,kBAAiB,IAErDA,SAAS,GACT,OAAO;YAGX;gBACI,KAAK/O,KACD,4BAA2BpC,GAAiBkC,SAASzC,KAAK2C,OAA1D;gBAGJ,IAAmB,mBAARA,KACP,OAAOA;gBAGX,IAAIA,eAAe0B,OAAO;oBACtB,IAAIP,QAAQnB,OAAOA,IAAImB,OACnBuG,UAAU1H,OAAOA,IAAI0H;oBAEzB,IAAIvG,SAASuG,SACT,QAAgC,MAA5BvG,MAAMW,QAAQ4F,WACPvG,QAEIuG,UAAX,OAAyBvG;oBAE1B,IAAIA,OACP,OAAOA;oBACJ,IAAIuG,SACP,OAAOA;;gBAIf,OAA4B,qBAAjB1H,IAAIF,WACJE,IAAIF,aAGRlC,GAAiBkC,SAASzC,KAAK2C;cAExC,OAAOgP;gBACL,4CAA2CF,eAAeE,QAAQD,QAAQ;;;QAuB3E,SAAStE,UAAUhL;YACtB,OAAoB,mBAATA,OACAA,OAGPA,QAAiC,qBAAlBA,KAAKK,WACbL,KAAKK,aAGTlC,GAAiBkC,SAASzC,KAAKoC;;QAsBnC,SAASwP,OAA8B1D,KAASjM;YACnD,KAAKA,QACD,OAAOiM;YAGX,IAAI3N,OAAOsB,QACP,OAAOtB,OAAOsB,OAAOqM,KAAKjM;YAG9B,KAAK,IAAIb,OAAOa,QACRA,OAAOR,eAAeL,SACtB8M,IAAI9M,OAAOa,OAAOb;YAI1B,OAAO8M;;QA8FJ,SAAS2D,aAAarL,QAAmBf;YAE5C,IAAID;YAWJ,OATA,SAASsM;gBACLtM,UAAUhB,WAAW;oBACjBgC,UACAsL;mBACDrM;aAGPqM,IAEO;gBACHpL,QADG;oBAECf,aAAaH;;;;QAmZlB,SAASuM,UAAUjR;YACtB,OAAOA;;QAoBJ,SAASkG,aAAQ5E;YACpB,OAAgD,sBAAzC7B,GAAiBkC,SAASzC,KAAKoC;;QAiCnC,SAASuN,cAAgCzB,KAAS9M,KAAcf;YACnE,IAAI6N,IAAIzM,eAAeL,MACnB,OAAO8M,IAAI9M;YAGf,IAAMsP,MAAMrQ;YAEZ,OADA6N,IAAI9M,OAAOsP,KACJA;;QASJ,SAASsB,QAAQ9D;YAEpB,IAAM+D,QAAQ,IACVC,WAAU;YAEd,OAAO;gBACHhD,KADG,SACY9O,MAAegC;oBAO1B,OANK8P,YACDhE,IAAI9N,QAAQgC,MACZ3C,KAAK0S,SAAS;+BACHjE,IAAI9N;yBAGZgC;;gBAGX+P,UAXG,SAWM3L;oBACD0L,UACA1L,WAEAyL,MAAMvN,KAAK6M,KAAK/K;;gBAIxBV,KAnBG;oBAoBC,IAAMG,UAAU;oBAGhB,KAFAiM,WAAU,GAEHD,MAAMjQ,UAAQ;wBACjB,IAAMoQ,OAAOH,MAAMI;wBACnBpM,QAAQvB,KAAK0N;;oBAGjB,OAAO/O,qBAAayC,IAAIG,SAASvD,KAAK4O;;;;QA0B3C,SAASgB,aAAgBlS,MAAemS;YAC3C,IAAIA,eACA,MAAM,IAAIlO,MAAJ,cAAuBjE,OAAvB;YAGV,OAAOmS;;QCt+BJ,SAASC;YACZ,OAAOvF,QAAQwF,SAASC,SAAiC,eAAxBD,SAASE;;QAGvC,SAASC,UAAU/C;YACtB,OAAOA,IAAIM,QAAQ,OAAO,OAAOA,QAAQ,MAAM,OAAOA,QAAQ,MAAM,OAAOA,QAAQ,OAAO;;QAevF,SAAS0C;YACZ,OAAO1B,cAAc0B,sBAAsB;gBACvC,OAAO,IAAIxP,qBAAa,SAAAH;oBAEpB,IAAIsP,mBACA,OAAOtP;oBAGX,IAAI4P,WAAWC,YAAY;wBACvB,IAAIP,mBAEA,OADAQ,cAAcF,WACP5P;uBAEZ;;;;QAeR,SAAS+P,WAAWC;YACvB,OAAO/B,cAAc8B,YAAY;gBAC7B,IAAIE,SAAS;gBAEb,KAAKD,aACD,OAAOC;gBAGX,KAAkC,MAA9BD,YAAYzO,QAAQ,MACpB,OAAO0O;gBARiC,SAAAC,MAAA,GAAAC,sBAW3BH,YAAYzF,MAAM,MAXS2F,MAAAC,oBAAArR,QAAAoR,OAWH;oBAApC,IAAIE,OAAID,oBAAAD;qBACTE,OAAOA,KAAK7F,MAAM,MAET,MAAM6F,KAAK,OAChBH,OAAOI,mBAAmBD,KAAK,OAAOC,mBAAmBD,KAAK;;gBAItE,OAAOH;eACR,EAAED;;QAkCF,SAASM,YAAYC,eAAwBC;YAEhD,YAF+F,MAA/CA,kBAAkC,KAE7EA,SAAUnT,OAAO8F,KAAKqN,OAAO1R,eAXmC,OAA7CkM,MAeLtM,SAAA,IACZqR,WAAWQ,gBACXC,YAjBiBxF,MAAgC;YAEjD3N,OAAO8F,KAAK6H,KAAKyF,OAAO,SAAAvS;gBAC3B,OAA2B,mBAAb8M,IAAI9M;eACnBkF,IAAI,SAAAlF;gBACH,OAAWwR,UAAUxR,OAArB,MAA+BwR,UAAU1E,IAAI9M;eAC9CuM,KAAK,QAMG8F;YAZR,IAAqBvF;;QA6MrB,SAAS0F,YAAYC,WAAyB/K;YACjD+K,UAAUD,YAAY9K;;QAGnB,SAASgL,UAAUC;YAEtB,OAAIA,mBAAmBzR,OAAO0R,WAId,SAAZD,WAAuC,mBAAZA,WAA6C,MAArBA,QAAQE,YAA2C,mBAAlBF,QAAQG,SAAuD,mBAA1BH,QAAQlJ;;QAOlI,SAASsJ,eAAeC,IAAqBxJ;YAEhD,YAFwG,MAAxDA,cAA+B6H,WAE3EqB,UAAUM,MAEHA,KAGO,mBAAPA,KACAxJ,IAAIyJ,cAAcD,WAD7B;;QAgBG,SAASE,aAAaF;YACzB,OAAO,IAAI/Q,qBAAa,SAACH,SAASgB;gBAE9B,IAAI9D,OAAOgN,UAAUgH,KACjBG,KAAKJ,eAAeC;gBAExB,IAAIG,IACA,OAAOrR,QAAQqR;gBAGnB,IAAI/B,mBACA,OAAOtO,OAAO,IAAIG,MAAJ,mCAA4CjE,OAA5C;gBAGlB,IAAI0S,WAAWC,YAAY;oBAIvB,QAFAwB,KAAKJ,eAAeC,QAGhBpB,cAAcF,WACP5P,QAAQqR,OAGf/B,qBACAQ,cAAcF;oBACP5O,OAAO,IAAIG,MAAJ,mCAA4CjE,OAA5C,4BAFlB;mBAID;;;QAIJ,SAASoU,eAAenK;YAC3B5K,KAAK4K,UAAUA;;QA6IZ,SAASoK,eAAerL;YAG3B,KAFAiF,yBAAyBA,0BAA0B,IAAIS,kCAE5BY,IAAItG,QAAQ;gBACnC,IAAInG,WAAUoL,uBAAuB3N,IAAI0I;gBACzC,IAAInG,UACA,OAAOA;;YAIf,IAAIA,UAAU,IAAII,qBAAa,SAACH,SAASgB;gBACrCkF,MAAMsL,iBAAiB,QAAQ;qBJYhC,SAAyBtL;wBAI5B,IArBJ;4BACI,KAAK,IAAIvJ,IAAI,GAAGA,IAAImK,cAAchI,QAAQnC,KAAK;gCAC3C,IAAIuK,UAAS;gCAEb;oCACIA,SAASJ,cAAcnK,GAAGuK;kCAC5B,OAAOzH;gCAILyH,WACAH,aAAatD,OAAO9G,GAAG,IACvBmK,cAAcrD,OAAO9G,GAAG;;yBAOhC8U,IAEIvL,SAASA,MAAMsB,eACf;4BACIV,cAActF,KAAK0E,MAAMsB,gBACzBT,aAAavF,KAAK0E;0BACpB,OAAOzG;sBInBLiS,CAAgBxL,QAChBlG,QAAQkG;oBAGZA,MAAMsL,iBAAiB,SAAS,SAAC/R;oBACzByG,MAAMsB,gBACNxH,QAAQkG,SAERlF,OAAOvB;;;YAOnB,OAFA0L,uBAAuBa,IAAI9F,OAAOnG,UAE3BA;;QAGJ,SAAS4R,iBAAiBzL;YAC7B,OAAOqL,eAAerL,OAAO1G,KAAK,SAAAoS;gBAE9B,KAAKA,YAAYpK,eACb,MAAM,IAAIrG,MAAJ;gBAGV,OAAOyQ,YAAYpK;;;QA+DpB,SAASqK,WAAOC,SAAyCnB;iBAA8C,MAAvFmB,sBAAqC;YAExD,IACId,QAAQc,QAAQd,SAAS,IAEzB9K,QAhED,SAAuB6L,KAAsBD,SAAmCnB;qBAAwC,MAAjGoB,cAAe,aAAkF,MAA3ED,sBAA+B,KAE/EC,MAAMA,IAAI1E;gBACV,IAjEqBgE,IAAkBW,WAAoBtK,KAiEvDmJ,UAAUtB,SAAS0C,cAAcF;gBAcrC,IAZID,QAAQd,SACRtC,OAAOmC,QAAQG,OAAOc,QAAQd,QAG9Bc,QAAQI,UACRrB,QAAQsB,YAAYL,QAAQI,MAAMzH,KAAK;gBAGvCqH,QAAQZ,MACRL,QAAQuB,aAAa,MAAMN,QAAQZ,KAGnCY,QAAQO,YAAY,SAAAC,MAAA,GAAAC,gBACJlV,OAAO8F,KAAK2O,QAAQO,aADhBC,MAAAC,cAAAzT,QAAAwT,OAC6B;oBAA5C,IAAIpU,MAAGqU,cAAAD;oBACRzB,QAAQuB,aAAalU,KAAK4T,QAAQO,WAAWnU;;gBAYrD,IARI4T,QAAQU,eArFSnB,KAsFRR,SAtF0BmB,YAsFjBF,QAAQU,iBAtF+D,MAAlC9K,cAAiBtI,OAAOmQ;gBAE/E8B,GAAGmB,aAEHnB,GAAGmB,WAAWC,UAAUT,YAExBX,GAAGX,YAAYhJ,IAAIgL,eAAeV;gBAuFlCF,QAAQa,MACR;oBAAA,IAAY,aAARZ,KAGI,MAAM,IAAI5Q,MAAJ;oBAOV0P,QAAQ+B,YAAYd,QAAQa;;gBAIpC,OAAO9B;aAkBKoB,CAAc,UAAU;gBAChCI,YAAY3T,SAAA;oBACRmU,mBAAmB;mBALVf,QAAQO,cAAc;gBAQnCrB,OAAOtS,SAAA;oBACHoU,iBAAiB;oBACjBC,QAAiB;mBACd/B;gBAEP2B,MAAOb,QAAQa;gBACfT,OAAOJ,QAAQI;gBAGbc,OAAO5T,OAAO4I,UAAUE,UAAU8B,MAAM;YAmB9C,OAjBK9D,MAAM+M,aAAa,SACpB/M,MAAMkM,aAAa,MAAMrF,aAI7BwE,eAAerL;YAEXyK,aAxTD,SAAoBO,IAAqBxJ;qBAAuD,MAAvDA,cAA+B6H;gBAE3E,IAAIsB,UAAUI,eAAeC,IAAIxJ;gBAEjC,IAAImJ,SACA,OAAOA;gBAGX,MAAM,IAAI1P,MAAJ,2BAAoC+I,UAAUgH;aAiTvCgC,CAAWvC,WACjBD,YAAYxK,SAGf4L,QAAQxH,OAAO0I,SACf9M,MAAMkM,aAAa,OAAON,QAAQxH,OAAO;YAItCpE;;QAGJ,SAASsL,iBAAiBxG,KAAmBmI,OAAgB/S;YAEhE,OADA4K,IAAIwG,iBAAiB2B,OAAO/S,UACrB;gBACHoD,QADG;oBAECwH,IAAIoI,oBAAoBD,OAAO/S;;;;QAmJpC,SAASiT,eAAexC;YACvBA,WAAWA,QAAQpJ,cACnBoJ,QAAQpJ,WAAW6L,YAAYzC;;QAwBhC,SAAS0C,gBAAgBlC;YAC5B,QAAKA,OAAOA,GAAG5J;;QAoDZ,SAAS+L,SAASnC,IAAkBjR,SAApCqT;YAAwL,IAAAC,aAAA,MAAAD,QAAT,KAASA,OAAAE,cAAAD,MAAzFE,oBAAyF,MAAAD,4BAAAE,eAAAH,MAA3EI,sBAA2E,MAAAD,8BAAAE,iBAAAL,MAA5D9D,0BAA4D,MAAAmE,iBAAjD,MAAiDA,gBAAAC,YAAAN,MAA5CjP,gBAA4C,MAAAuP,YAAtC5U,SAAsC4U,WACvLC,eAAe5C,GAAG6C,aAClBC,gBAAgB9C,GAAG+C;YAEvBhU,QAAQ;gBAAEwT,OAAOK;gBAAcH,QAAQK;;YAEvC,IAYIE,UACA/R,SAbAwI,QAAQ;gBACR,IAAIwJ,WAAWjD,GAAG6C,aACdK,YAAYlD,GAAG+C;iBAEdR,SAASU,aAAaL,gBAAkBH,UAAUS,cAAcJ,kBACjE/T,QAAQ;oBAAEwT,OAAOU;oBAAUR,QAAQS;oBAGvCN,eAAeK,UACfH,gBAAgBI;;YA2BpB,YArBkC,MAAvB9P,IAAI+P,kBACXH,WAAW,IAAI5P,IAAI+P,eAAe1J,QACzB2J,QAAQpD,WAEsB,MAAzB5M,IAAIiQ,qBAClBL,WAAW,IAAI5P,IAAIiQ,iBAAiB5J,QAC3B2J,QAAQpD,IAAI;gBACjBgB,aAAe;gBACfsC,YAAe;gBACfC,UAAe;gBACfC,gBAAe;gBAEnBpQ,IAAI+M,iBAAiB,UAAU1G,UAEpB,SAAP8D;gBACA9D,SACAxI,UAAUhB,WAAWsN,MAAMgB;aAE/BhB,IAGG;gBACHpL,QAAQ;oBACJ6Q,SAASS,cACT1V,OAAOgU,oBAAoB,UAAUtI,QACrCrI,aAAaH;;;;QE/6BlB,SAASyS,OAAOpI;YACnB,OAAsB,mBAARA,OAAqB,YAAaqI,KAAKrI;;QAGlD,SAASsI,KAAKtI;YACjB,OAAsB,mBAARA,OAAqB,aAAcqI,KAAKrI;;QAGnD,SAASuI,MAAM1H;YAElB,IAAmB,mBAARA,KACP,OAAOA;YAGX,IAAIxD,QAAQwD,IAAIxD,MAAM;YAEtB,KAAKA,OACD,MAAM,IAAI7I,MAAJ,oCAA6CqM;YAGvD,OAAO2H,SAASnL,MAAM,IAAI;;QAGvB,SAASoL,KAAK5H;YACjB,OAAW0H,MAAM1H,OAAjB;;QAGG,SAAS6H,MAAM7H;YAElB,OAAmB,mBAARA,MACA4H,KAAK5H,OAGTuH,OAAOvH,OAAOA,MAAM4H,KAAK5H;;QAO7B,SAAS8H,mBAAmBC,KAAuBC;YACtD,IAAmB,mBAARD,KACP,OAAOA;YACJ,IAAIR,OAAOQ,MACd,OAPGJ,SAOWK,MAPIN,MAOCK,OAPc,KAAK;YAQnC,IAAIN,KAAKM,MACZ,OAAOL,MAAMK;YAEb,MAAM,IAAIpU,MAAJ,kCAA2CoU;;QFoVzDjE,eAAepQ,YAAY7D,OAAOY,OAAOkD,MAAMD;QGpYxC,ICWMuU,eAAe;YACxBC,QAAc;YACdC,OAAc;YACdC,aAAc;WASLC,qBAAqB,wBAGrB1R,qBAAW,KAEX2R,qBAAqB;YAC9BC,4BAA6B;YAC7BC,uBAA6B;YAC7BC,qBAA6B;;QC3B1B,SAASC,iBAAUzR;YACtB,YADoE,MAA9CA,cAA6BrF,SAC/CqF,QAAQrF,SACDqF,IAAG,yBAEUA,IAAG,yBAAkCA,IAAG,0BAAmC;;QASvG,IAAM0R,SAAwB;YAAA,OAAO;;QAe9B,SAASC,YAAuBlY,KAAyBmY;YAC5D,YADgH,MAA7EnY,cAAgB,eAA6D,MAApDmY,wBAA2BF;YAChF1J,cAASyJ,oBAAahY,KAAK;gBAC9B,IAAIoY,QAAQD;gBAEZ,OAAO;oBACH7J,KAAK,SAAC+J;wBACF,OAAOD,MAAM/X,eAAegY;;oBAEhC/Y,KAAK,SAAC+Y,UAAUC;wBAEZ,OAAOF,MAAM/X,eAAegY,YAAYD,MAAMC,YAAYC;;oBAE9DxK,KAAK,SAACuK,UAAU/I;wBAEZ,OADA8I,MAAMC,YAAY/I,KACXA;;oBAEXiJ,KAAK,SAACF;+BACKD,MAAMC;;oBAEjB9J,UAAU,SAAC8J,UAAUpZ;wBAEjB,OAAOsP,cAAS6J,OAAOC,UAAUpZ;;oBAErC6Q,OAAO;wBACHsI,QAAQD;;oBAEZlT,MAAM;wBACF,OAAO9F,OAAO8F,KAAKmT;;;;;QAM5B,IAAMI,WAAb;QAEO,SAASC;YACZ,IAAMC,SAASV;YAEf,OADAU,OAAOC,kBAAkBD,OAAOC,mBAAmB,IAAIH,YAChDE,OAAOC;;QAYX,SAASC,YAAe5Y,KAAyBmY;YACpD,YADwG,MAA7EnY,cAAgB,eAA6D,MAApDmY,wBAA2BF;YACxEC,YAAY,eAAe3J,SAASvO,KAAK;gBAC5C,IAAM6Y,WAAW,IAAInL,kCAEfoL,WAAW,SAACvS;oBACd,OAAOsS,SAAStK,SAAShI,KAAK4R;;gBAGlC,OAAO;oBACH7J,KAAK,SAAC/H;wBAEF,OADcuS,SAASvS,KACVlG,eAAeL;;oBAEhCV,KAAK,SAACiH,KAAK+R;wBACP,IAAMF,QAAQU,SAASvS;wBAEvB,OAAO6R,MAAM/X,eAAeL,OAAOoY,MAAMpY,OAAOsY;;oBAEpDxK,KAAK,SAACvH,KAAK+I;wBAGP,OAFcwJ,SAASvS,KACjBvG,OAAOsP,KACNA;;oBAEXiJ,KAAK,SAAChS;+BACYuS,SAASvS,KACVvG;;oBAEjBuO,UAAU,SAAChI,KAAKtH;wBAEZ,OAAOsP,cADOuK,SAASvS,MACAvG,KAAKf;;;;;QCvG5C,SAAS8Z;YACL,OAAOb,YAAY,YAAY3J,SAAS,cAAcM;;QAG1D,SAASmK,gBAAgBzS;YAErB,OADsBqS,YAAY,iBACbrK,SAAShI,KAAK;gBAAA,OAAM,IAAItE;;;QAU1C,SAASgX,SAAS1S,KAAlB2S;YACH,QAAOC,GADiKD,MAApHC,MACxC5S,KAAKgR,aAAaE,OAAO;gBAAE2B,YAAYL;eAAmB;gBAAE7R,QAAQjB;gBAAU7B,UAAU;eAC/F9C,KAAK,SAAA+X;gBAAsC,IAAnC3N,SAAmC2N,MAAnC3N,QAAgB0N,aAAmBC,MAA3BC,KAAQF;gBAErB,OADAJ,gBAAgBzS,KAAKzE,QAAQ;oBAAEyE;oBAAKW,QAAQwE;oBACrC;oBAAEnF;oBAAKW,QAAQwE;oBAAQ0N;;;;QAInC,SAASG,oBAAoBhT,KAA7BiT;YAAiH,IAArDL,OAAqDK,MAArDL;YAC/D,OAAOP,YAAY,4BAA4BrK,SAAShI,KAAK;gBACzD,OAAO0S,SAAS1S,KAAK;oBAAE4S;mBAAQ7X,KAAK,SAAAmY;oBAAA,OAAAA,MAAGL;;;;QAiBxC,SAASM,iBAAiBnT,KAA6BnC,SAAyBpF;iBAA2F,MAApHoF,sBAAmB,WAAiG,MAA3FpF,gBAAgB;YACnG,IAAI6C,UAAUmX,gBAAgBzS;YAM9B,QAJiB,MAAbnC,YACAvC,UAAUA,QAAQuC,QAAQA,SAAS,IAAInB,MAAUjE,OAAd,yBAA2CoF,UAA3C;YAGhCvC;;QCtDJ,SAAS8X,gBAAgBpT;YACPqS,YAAY,gBACpB9K,IAAIvH,MAAK;;QCNnB,iBAAMqT,OAAO;YAChBC,UAAY;YACZC,OAAY;YACZC,SAAY;YACZC,OAAY;YACZC,MAAY;YACZC,OAAY;YACZC,QAAY;YACZC,QAAY;YACZC,QAAY;YACZC,SAAY;YACZC,MAAY;YACZC,WAAY;;QCTT,SAASC,iBAAiBzZ;YAC7B,OAAwB,mBAATA,QAA8B,SAATA,QAA0C,mBAAlBA,KAAK0Z;;QAG9D,SAASC,cAAcrL;YAC1B,YAAmB,MAARA,MACAsK,KAAKY,YAGJ,SAARlL,MACOsK,KAAKW,OAGZ5O,MAAMC,QAAQ0D,OACPsK,KAAKM,QAGG,qBAAR5K,MACAsK,KAAKC,WAGG,mBAARvK,MAEHA,eAAerM,QACR2W,KAAKE,QAGQ,qBAAbxK,IAAIhO,OACJsY,KAAKG,UAG4B,sBAAxC5a,GAAiBkC,SAASzC,KAAK0Q,OACxBsK,KAAKI,QAG4B,oBAAxC7a,GAAiBkC,SAASzC,KAAK0Q,OACxBsK,KAAKK,OAGTL,KAAKO,SAGG,mBAAR7K,MACAsK,KAAKQ,SAGG,mBAAR9K,MACAsK,KAAKS,SAGG,oBAAR/K,MACAsK,KAAKU,eADhB;;QAKG,SAASM,cAAqCC,MAAUvL;YAC3D,OAAO;gBACHoL,UAAUG;gBACVC,SAAUxL;;;QCxBlB,mBAAMyL,eAAwBC,cAAA,IACxBpB,KAAKC,YCpCJ;QDmCuBmB,YAExBpB,KAAKE,SE5BJ,SAAAmB;YACH,OAAOL,cAAchB,KAAKE,OAAO;gBAAE7Q,SADqFgS,KAA3FhS;gBACevG,OAD4EuY,KAAlFvY;gBACawY,MADqED,KAA3EC;;WF0BnBF,YAGxBpB,KAAKG,WGtCJ,eHmCuBiB,YAIxBpB,KAAKI,SInCJ,SAAwB1K;YAC3B,OAAOsL,cAAchB,KAAKI,OAAO1K,IAAIzO;WJ8BXma,YAKxBpB,KAAKK,QKpCJ,SAAuB3K;YAC1B,OAAOsL,cAAchB,KAAKK,MAAM3K,IAAI6L;WL8BVH,YAMxBpB,KAAKM,SMzCJ,SAAmC5K;YACtC,OAAOA;WNkCmB0L,YAOxBpB,KAAKO,UO1CJ,SAAyB7K;YAC5B,OAAOA;WPkCmB0L,YAQxBpB,KAAKQ,UQ3CJ,SAAyB9K;YAC5B,OAAOA;WRkCmB0L,YASxBpB,KAAKS,US5CJ,SAAyB/K;YAC5B,OAAOA;WTkCmB0L,YAUxBpB,KAAKU,WU7CJ,SAA0BhL;YAC7B,OAAOA;WVkCmB0L,YAWxBpB,KAAKW,QW9CJ,SAAuBjL;YAC1B,OAAOA;WXkCmB0L,cAexBI,qBAAmC,IYhBnCC,iBAA4BC,gBAAA,IAC5B1B,KAAKC,YX/BJ;YACH,MAAM,IAAI5W,MAAJ;WW6BwBqY,cAE5B1B,KAAKE,SVvBJ,SAAAtE;YAA8E,IAAzC9S,QAAyC8S,MAAzC9S,OAAOwY,OAAkC1F,MAAlC0F,MACzC3Y,QAAQ,IAAIU,MAD+DuS,MAAlDvM;YAK/B,OAFA1G,MAAM2Y,OAAOA,MACb3Y,MAAMG,QAAYA,QAAlB,SAAgCH,MAAMG,OAC/BH;WUgBuB+Y,cAG5B1B,KAAKG,WTjCJ;YACH,MAAM,IAAI9W,MAAJ;WS6BwBqY,cAI5B1B,KAAKI,SR9BJ,SAA0B1K;YAE7B,OAAO,IAAIiM,OAAOjM;WQwBYgM,cAK5B1B,KAAKK,QP/BJ,SAAyB3K;YAC5B,OAAO,IAAInC,KAAKmC;WOyBcgM,cAM5B1B,KAAKM,SNpCJ,SAAqC5K;YACxC,OAAOA;WM6BuBgM,cAO5B1B,KAAKO,ULrCJ,SAA2B7K;YAC9B,OAAOA;WK6BuBgM,cAQ5B1B,KAAKQ,UJtCJ,SAA2B9K;YAC9B,OAAOA;WI6BuBgM,cAS5B1B,KAAKS,UHvCJ,SAA2B/K;YAC9B,OAAOA;WG6BuBgM,cAU5B1B,KAAKU,WFxCJ,SAA4BhL;YAC/B,OAAOA;WE6BuBgM,cAW5B1B,KAAKW,QDzCJ,SAAyBjL;YAC5B,OAAOA;WC6BuBgM,gBAe5BE,uBAAuC;QC5CtC,SAASC;YAEZ,SAAI5R,mBAAa3I,QAAQ4K,MAAM;;QAO5B,SAAS4P,kBAAkBnV;YAE9B,QAAKwE,gBAAgB7J,QAAQqF;;QAO1B,SAASoV,qBAAqBzU,QAAkBX;YAEnD,IAAIW;gBACA,IAAID,sBAAgBkF,iBAAiBjF,SACjC,QAAO;mBAER,IAAIX,QACFa,aAAab,MACd,QAAO;YAIf,QAAO;;QAGJ,SAASqV,YAATX;YAAqG,IAA9E1U,MAA8E0U,KAA9E1U,KAAKW,SAAyE+T,KAAzE/T;YAE/B,UAAKuU,2BAIDvU,WAAWyU,qBAAqBzU,QAAQX,QAIxCA,QAAQmV,kBAAkBnV;;QAO3B,SAASsV,cAAc3U;YAI1B,IAAM4U,mBAFN5U,SAASA,UAAUiF,iBAAiBjF,SAEL6H,QAAQ,kBAAkB;YAIzD,OAFe4I,qBAAP,MAA+BmE;;QAKpC,SAASC;YACZ,OAAOlQ,QAAQ3K,OAAOlC,QAAQkC,OAAOlC,SAAS6c,cAAc5U;;QAGzD,IAAM+U,oBAAoB,IAAI/Z,qBAAa,SAAAH;YAE9C,IAAIZ,OAAOmQ,YAAYnQ,OAAOmQ,SAASC,MACnC,OAAOxP,QAAQZ,OAAOmQ,SAASC;YAGnC,IAAMI,WAAWC,YAAY;gBACzB,IAAIzQ,OAAOmQ,YAAYnQ,OAAOmQ,SAASC,MAEnC,OADAM,cAAcF,WACP5P,QAAQZ,OAAOmQ,SAASC;eAEpC;;QAGA,SAAS2K,qBAAqB1V;YACJqS,YAAY,wBACpBrK,SAAShI,KAAK;gBAAA,OAAM,IAAItE;;;QAG1C,SAASia,iBAAiB3V;YAC7B,IACM4V,mBADuBvD,YAAY,wBACKtZ,IAAIiH;YAElD,KAAK4V,kBACD,MAAM,IAAIlZ,MAAJ;YAGV,OAAOkZ;;QAGJ,SAASC,0BAA0B7V,KAA6BW,QAAiBmV;YAapFH,iBAAiB3V,KAAKzE,QAZK,SAACwa,WAAmCC,cAAuBtT;gBAClF,IAAIqT,cAAc/V,KACd,MAAM,IAAItD,MAAJ;gBAGV,KAAKuI,YAAY+Q,cAAcrV,SAC3B,MAAM,IAAIjE,MAAJ,mBAA4BsZ,eAA5B,4BAAoErV;gBAG9EmV,YAAYG,cAAcvT;;;QAM3B,SAASwT,wBAAwBlW,KAA6BhF;YACjE2a,iBAAiB3V,KAAKzD,OAAOvB,KAAKwC,MAAMmM;;QCyCrC,SAASwM,WAATxD;YAAqE,SAA/C3S,MAA+C2S,MAA/C3S,KAAKvH,OAA0Cka,MAA1Cla,MAAMkI,SAAoCgS,MAApChS,QAC9ByV,qBAAqBzE,YAAY,uBACjC0E,oBAAoBhE,YAAY,sBAFkC5G,MAAA,GAAA6K,yBAIlDF,mBAAmB1X,QAJ+B+M,MAAA6K,uBAAAjc,QAAAoR,OAIvB;gBAA5C,IAAM8K,UAAOD,uBAAA7K;gBAEVlJ,eAAe6T,mBAAmBrd,IAAIwd,SAASvW,QAC/CoW,mBAAmBpE,IAAIuE;;YAI/B,IAAMC,UAAuBH,kBAAkBrO,SAAShI,KAAK;gBACzD,OAAKvH,OAIE2d,mBAAmBpO,SAASvP,MAAM;oBACrC,OAAO;wBAAEuH;wBAAKvH;;qBAJP;oBAAEuH;;;YAQjB,IAAIwW,QAAQxW,OAAOwW,QAAQxW,QAAQA,KAC/B,MAAM,IAAItD,MAAJ,kDAA0DjE,QAAQ;YAG5E,IAAIA,MAAM;gBACN,IAAI+d,QAAQ/d,QAAQ+d,QAAQ/d,SAASA,MACjC,MAAM,IAAIiE,MAAJ,8CAAuDjE,OAAvD,OAAkE+d,QAAQ/d;gBAGpF+d,QAAQ/d,OAAOA,MACf2d,mBAAmB7O,IAAI9O,MAAM+d;;YAUjC,OAPI7V,WACA6V,QAAQ7V,SAASA,QACjB+U,qBAAqB1V,OAGzBqW,kBAAkB9O,IAAIvH,KAAKwW;YAEpBA;;QCnMJ,SAASC,YAAT/B;YAA2H,ID2MxHgC,YC3MoBC,KAAoGjC,KAApGiC,IAAI/D,OAAgG8B,KAAhG9B,MAAMgE,iBAA0FlC,KAA1FkC;YD2M9BF,aAAa/b,OAAOkc,MAE1Blc,OAAOkc,OAAO,SAA2BhR,KAAcpN,MAAe4U,SAAkByJ;gBACpF,IAAM9W,MAAM0W,WAAWre,KAAKP,MAAM0O,iBAAiBX,MAAMpN,MAAM4U,SAASyJ;gBAExE,OAAK9W,OAILmW,WAAW;oBAAEnW;oBAAKvH;oBAAMkI,QAAQkF,MAAMD,iBAAiBC,OAAO;oBAEvD7F,OALIA;eA7MZ,SAAA0U;gBAAmI,IAApGiC,KAAoGjC,KAApGiC,IAAI/D,OAAgG8B,KAAhG9B,MAAMgE,iBAA0FlC,KAA1FkC,gBACtCR,qBAAqBzE,YAAY;gBAEvCgF,GAAG3F,aAAaG,aAAa,SAAAlC;oBAA8B,IAA3B3U,SAA2B2U,MAA3B3U,QAAQ6K,SAAmB8J,MAAnB9J,QAAQ4N,OAAW9D,MAAX8D,MACtCgE,gBAAgBpF,YAAY,WAAW5Y,IAAIoM;oBAEjD,KAAK4R,eACD,MAAM,IAAIra,MAAJ,4CAAqDyI;oBAG/D,OAAO4R,cAAchc,KAAK,SAAAic;wBAGtB,IAAI1c,WAAW0c,QAEX,MAAM,IAAIta,MAAJ,kEAA2EyI;wBAGrF,KAAK4N,KAAKta,MACN,MAAM,IAAIiE,MAAJ;wBAGV,KAAKqW,KAAK+C,aACN,MAAM,IAAIpZ,MAAJ;wBAGV,KAAK0Z,mBAAmBrO,IAAIgL,KAAKta,OAC7B,MAAM,IAAIiE,MAAJ,sBAA+BqW,KAAKta,OAApC;wBAIV,KAAK2d,mBAAmBrd,IAAIga,KAAKta,MAAMkI,QACnC,MAAM,IAAIjE,MAAJ,mDAA4DqW,KAAKta;wBAI3E,IAAI2d,mBAAmBrd,IAAIga,KAAKta,MAAMkI,WAAWwE,QAE7C,MAAM,IAAIzI,MAAJ,oBAA6ByI,SAA7B,gDAAmFiR,mBAAmBrd,IAAIga,KAAKta,MAAMkI;wBAM/H,OAFAkV,0BAA0BO,mBAAmBrd,IAAIga,KAAKta,MAAMuH,KAAKmF,QAAQ4N,KAAK+C;wBAEvE;4BACHA,aADG,SACSpT;gCAER,IAAK/H,WAAUA,OAAO8H,QAAtB;oCAIA,IAAMwU,aAAab,mBAAmBrd,IAAIga,KAAKta;oCAE/C,IAAKwe,YAIL;wCACIL,eAAe;4CACX7D,MAAQrQ;4CACRyC,QAAQ8R,WAAWtW;4CACnBrG,QAAQ2c,WAAWjX;2CACpB;4CAAE2W;4CAAI/D;;sCACX,OAAO5X;wCACLU,qBAAaa,OAAOvB;;;;;;;aClExCkc,CAAoB;gBAAEP;gBAAI/D;gBAAMgE;gBCkC7B,SAAA3H;gBAAiE,IAA9B2D,OAA8B3D,MAA9B2D;gBACtCnB,iBAAU9W,QAAQwc,qBAAqB,SAAAxE;oBAA+H,IAAjGla,OAAiGka,MAAjGla,MAAM6B,SAA2FqY,MAA3FrY,QAAQ8c,SAAmFzE,MAAnFyE,QAAQtB,cAA2EnD,MAA3EmD,aAEjFuB,gBAAgB1F,YAAY,kBAC5B2F,eAAenX,UAAUxF;oBAE/B,KAAK2c,cACD,MAAM,IAAI5a,MAAJ;oBAGV,IAAM+P,KAlBd,SAAAiI;wBAAgG,IAArEjc,OAAqEic,KAArEjc,MAAM6B,SAA+Doa,KAA/Dpa,QAAQ8c,SAAuD1C,KAAvD0C,QAAQtB,cAA+CpB,KAA/CoB;yBA1BjD;4BAA8B,KAC1B,IAAMuB,gBAAgB1F,YAAY,kBADRlG,MAAA,GAAA8L,uBAGRF,cAAc3Y,QAHN+M,MAAA8L,qBAAAld,QAAAoR,OAGc;gCAAnC,IAAMhS,MAAG8d,qBAAA9L;gCAUNlJ,eATiB8U,cAAc5d,KASHa,WAC5B+c,cAAcrF,IAAIvY;;yBAa1B+d;wBACA,IAAM/K,KAAKnE;wBAGX,OAFsBqJ,YAAY,iBACpBpK,IAAIkF,IAAI;4BAAEhU;4BAAM6B;4BAAQ8c;4BAAQtB;4BACvCrJ;qBAaQgL,CAAgB;wBAAEhf;wBAAM6B;wBAAQ8c;wBAAQtB;;oBAEnD,OAAOlD,KAAK0E,cAActG,aAAaG,aAAa;wBAEhD1Y;wBAEAqd,aAJgD;4BAM5C,IAAM4B,eAAeL,cAActe,IAAI0T;4BAUvC,IAAKiL,gBAAiBA,aAAapd,WAAUiI,eAAemV,aAAapd,SAAzE;gCAIA;oCACIod,aAAaN;kCACf,OAAOpc;oCACL;;gCAGJ0c,aAAa5B,YAAYvb,MAAMzC,MAAMsC;;;uBAG1C;wBAAEuG,QAAQjB;;;aD1EjBiY,CAAwB;gBAAEhB;gBAAI/D;gBEqC3B,SAAA8B;gBAAuJ,IAAzHiC,KAAyHjC,KAAzHiC,IAAI/D,OAAqH8B,KAArH9B,MAAMgE,iBAA+GlC,KAA/GkC;gBACpClb,qBAAakC,IAAI;oBACpB,IAvC6BoC,KAuCvBM,SAASD,UAAU1F;oBAEzB,IAAK2F,UAAW+U,YAAY;wBAAErV,KAAKM;wBAMnC,OAFAoV,qBAAqBpV,UA7CQN,MA+CKM,QA9C/B+R,YAAY,wBAAwBrK,SAAShI,KAAK;wBACrD,OAAOtE,qBAAakC,IAAI;4BACpB,IAAM6D,QAAQiC,eAAe1D,KAAKsV,cAAc5U;4BAEhD,IAAKe,OAKL,OAAIZ,aAAaY,UAAUZ,aAAaY,UAAUgQ,iBAAUhQ,SACjDA,QAGJ,IAAI/F,qBAAa,SAAAH;gCAEpB,IAAI4P,UACAtN;gCAEJsN,WAAWC,YAAY;oCAEnB,IAAI3J,SAASZ,aAAaY,UAAUgQ,iBAAUhQ,QAG1C,OAFA4J,cAAcF;oCACdnN,aAAaH,UACNtC,QAAQkG;mCAEpB,MAEH5D,UAAUhB,WAAW;oCAEjB,OADAwO,cAAcF,WACP5P;mCACR;;;wBAgB+BR,KAAK,SAAAic;wBAE3C,OAAKA,SAIArc,OAAOlC,OAKLgZ,iBAAUuF,QAAQG,mBAAmB;4BAExC1e,MAAMkC,OAAOlC;4BAEb6B,QAAQK;4BAERyc,QANwC;4BAUxCtB,aAVwC,SAU5BpT;gCAQR,IAAK/H,WAAUA,OAAO8H,QAItB;oCACImU,eAAe;wCACX7D,MAAQrQ;wCACRyC,QAAQrN,KAAKqN;wCACb7K,QAAQxC,KAAKwC;uCACd;wCAAEqc;wCAAI/D;;kCACX,OAAO5X;oCACLU,qBAAaa,OAAOvB;;;2BAI7BD,KAAK,SAAAkU;4BAA8B,IAA3B3U,SAA2B2U,MAA3B3U,QAAQ6K,SAAmB8J,MAAnB9J,QAAQ4N,OAAW9D,MAAX8D;4BAEvB,IAAIzY,WAAWgG,QACX,MAAM,IAAI5D,MAAJ;4BAGVmZ,0BAA0Bvb,QAAQ6K,QAAQ4N,KAAK+C;2BAEhDtY,MAAM,SAAAxC;4BAGL,MADAkb,wBAAwB5V,QAAQtF,MAC1BA;6BAhDCkb,wBAAwB5V,QAAQ,IAAI5D,MAAJ,gEAJhCwZ,wBAAwB5V,QAAQ,IAAI5D,MAAJ;;;aFjDnDkb,CAAmB;gBAAEjB;gBAAI/D;gBAAMgE;;;QGEnC,SAASiB;YAAsB,KAC3B,IAAMC,kBAAkBnG,YAAY,oBADTlG,MAAA,GAAAsM,yBAEVD,gBAAgBpZ,QAFN+M,MAAAsM,uBAAA1d,QAAAoR,OAEc;gBAApC,IAAMgB,KAAEsL,uBAAAtM;gBAELqM,gBAAgB/e,IAAI0T,IAAIuL,iBACxBF,gBAAgB9F,IAAIvF;;;QAiBhC,SAASwL,oBAAoBxL,IAAazM,KAA1C0U;YAA+H,IACvHwD,YADiEtF,OAAsD8B,KAAtD9B;YAGrE,OAAO;gBACHnG;gBACA6H,MAAejU,UAAUL,OAAOL,YAAYE,QAAQF,YAAYC;gBAChE4S,eAAetJ,eAAe;oBAAA,OAAM8J,oBAAoBhT,KAAK;wBAAE4S;;;gBAC/DuF,OAAe;oBAAA,OAAMzc,qBAAakC,IAAI;wBAClCoC,IAAImY;;;gBAERC,SAAS;oBAAA,OAAM1c,qBAAakC,IAAI;wBAC5B,KAAI2E,eAAevC,MAInB,OAAOkY;;;gBAEXG,OAAS;oBAAA,OAAM3c,qBAAakC,IAAI;wBAC5BoC,IAAIqY;;;gBAERC,UAAU;oBAAA,OAAM5c,qBAAakC,IAAI;wBAC7B,OAAO2E,eAAevC;;;gBAE1BuY,aAAa,SAACC;oBAAD,OAAU9c,qBAAakC,IAAI;wBACpC,IAAIiD,aAAab,MACb;4BACI,IAAIA,IAAIC,YAA4C,qBAAzBD,IAAIC,SAASuI,SAGpC,YADAxI,IAAIC,SAASuI,QAAQgQ;0BAG3B,OAAOxd;wBAKbgF,IAAIC,WAAWuY;;;gBAEnBC,SAAS,SAAChgB;oBAAD,OAAUiD,qBAAakC,IAAI;wBAE5BuY,WAAW;4BAAEnW;4BAAKvH;6BAGtBuH,MAAMiB,iBAAiBjB,MAEnBvH,OAAOA,MAEPuH,IAAI0Y,gBACJ1Y,IAAI0Y,aAAa/K,aAAa,QAAQlV;wBAG1Cyf,aAAazf;;;;;QAKlB,IAAMkgB,qBAAb;YASI,SAAAA,YAAYC,kBAA0CC,cAAtD5J;gBAA8H,IAA9B2D,OAA8B3D,MAA9B2D;gBAA8B9a,KAP9HghB,iBAAuB,GAOuGhhB,KAN9H8gB,wBAM8H,GAAA9gB,KAL9H+gB,oBAK8H;gBAAA/gB,KAJ9HihB,2BAI8H,GAAAjhB,KAH9H8a,YAG8H,GAAA9a,KAF9HW,YAE8H,GAC1HX,KAAK8gB,mBAAmBA;gBACxB9gB,KAAKihB,sBAAsB,IAAIrd,wBAC/B5D,KAAK8a,OAAOA,MACRiG,gBACA/gB,KAAKkhB,UAAUH;;YAd3B,IAAArc,SAAAmc,YAAAlc;YAAA,OAAAD,OAkBIyc,UAAA;gBACI,OAAOnhB,KAAK8gB,iBAAiBtE;eAnBrC9X,OAsBI0c,UAAA;gBACI,OAAOphB,KAAKmhB,cAActZ,YAAYE;eAvB9CrD,OA0BI2c,WAAA;gBACI,OAAOrhB,KAAKmhB,cAActZ,YAAYC;eA3B9CpD,OA8BI+b,cAAA,SAAYC;gBAA2C,IAAA5c,QAAA9D;gBACnD,OAAOA,KAAK8gB,iBAAiBL,YAAYC,MAAMzd,KAAK;oBAAA,OAAMa;;eA/BlEY,OAkCIic,UAAA,SAAQhgB;gBAA2C,IAAAmE,SAAA9E;gBAC/C,OAAOA,KAAK8gB,iBAAiBH,QAAQhgB,MAAMsC,KAAK;oBAAA,OAAM6B;;eAnC9DJ,OAsCI2b,QAAA;gBAAoC,IAAAhb,SAAArF;gBAChC,OAAOA,KAAK8gB,iBAAiBT,QAAQpd,KAAK;oBAAA,OAAMoC;;eAvCxDX,OA0CI6b,QAAA;gBAAoC,IAAAta,SAAAjG;gBAChC,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOlC,qBAAayC,IAAI,EACpBJ,OAAKmb,aAAanb,OAAK6a,iBAAiBR,UAAUrd,KAAK,SAAAtC;wBAC/CA,QACAkC,OAAOkc,KAAK,IAAIpe;wBAGxBsF,OAAK6a,iBAAiBP;mBAE3Btd,KAAK;oBAAA,OAAMgD;;eApDtBvB,OAuDI8b,WAAA;gBACI,OAAOxgB,KAAK8gB,iBAAiBN;eAxDrC9b,OA2DI4c,YAAA;gBACI,OAAOthB,KAAK+gB;eA5DpBrc,OA+DIwc,YAAA,SAAUhZ;gBACNlI,KAAK+gB,eAAe7Y,KACpBlI,KAAK8gB,mBAAmBX,oBAAoBngB,KAAK8gB,iBAAiBnM,IAAIzM,KAAK;oBAAE4S,MAAM9a,KAAK8a;oBACxF9a,KAAKihB,oBAAoBxd,QAAQyE;eAlEzCxD,OAqEI6c,cAAA;gBACI,OAAOvhB,KAAKihB;eAtEpBvc,OAyEI8c,cAAA,SAAYtZ;gBAAqD,IAAAuZ,SAAAzhB;gBAC7D,OAAO4D,qBAAakC,IAAI;oBACpB,OAAI2b,OAAKV,eACE7Y,QAAQuZ,OAAKV,eAGjBnd,qBAAayC,IAAI,EACpBob,OAAK/G,iBACLQ,oBAAoBhT,KAAK;wBAAE4S,MAAM2G,OAAK3G;0BACvC7X,KAAK,SAAA4X;wBAAgD,IAC9CpN,QAD8CoN,MAAA,OAAAA,MAAA;wBAOpD,OAJIpN,SACAgU,OAAKP,UAAUhZ,MAGZuF;;;eAzFvB/I,OA8FIgd,SAAA;gBACI,OAAO1hB,KAAK+gB,gBAAgB/gB;eA/FpC0E,OAkGIgW,gBAAA;gBACI,OAAO1a,KAAK8gB,iBAAiBpG;eAnGrChW,OAsGIid,YAAA;gBACI,OAAO3hB,KAAK8gB;eAvGpBpc,OA0GIwb,cAAA;gBACI,OAAOlgB,KAAK+gB,gBAAgBtW,eAAezK,KAAK+gB;eA3GxDF,YA8GWa,SAAP,SAAcxZ;gBACV,OAAO2Y,YAAYG,cAAc9Y,OAE3BA,IAAIwZ,WACJxZ;eAlHd2Y,YAqHWc,YAAP,SAAiBzZ,KAAjB8S;gBAAoH,IAAtDF,OAAsDE,MAAtDF;gBAG1D,OAFAiF,uBAEOc,YAAYe,cAAc1Z,KAAK;oBAAE4S;mBAAQ6G;eAxHxDd,YA2HWgB,cAAP,SAAmBf,kBAAnB3F;gBAA4H,IAA7D0D,KAA6D1D,MAA7D0D,IAAI/D,OAAyDK,MAAzDL;gBAG/D,OAFAiF,uBAEOlG,YAAY,mBAAmB3J,SAAS4Q,iBAAiBnM,IAAI;oBAChE,OAAO,IAAIkM,YAAYC,kBAAkB,MAAM;wBAAEjC;wBAAI/D;;;eA/HjE+F,YAmIWG,gBAAP,SAAqBvS;gBAEjB,OAAOjB,QAAQiB,QAAQD,SAASC,QAAQA,IAAIuS;eArIpDH,YAwIWe,gBAAP,SAAqB1Z,KAArBkT;gBAA8G,IAA5CN,OAA4CM,MAA5CN;gBAG9D,IAFAiF,uBAEIc,YAAYG,cAAc9Y,MAE1B,OAAOA;gBAIX,IAAM4Z,UAAkC5Z;gBAGxC,OAAOqS,YAAY,oBAAoBrK,SAAShI,KAAK;oBACjD,IAAMyM,KAAKnE,YAELuR,cAAc,IAAIlB,YADCV,oBAAoBxL,IAAImN,SAAS;wBAAEhH;wBACNgH,SAAS;wBAAEhH;;oBAEjE,OAAOjB,YAAY,mBAAmBpK,IAAIkF,IAAIoN;;eAzJ1DlB;SAAA;QCxEA,SAASmB,UAAUrN,IAAa1D,KAAgBtQ,MAAe6B,QAA8CqG;YACzG,IAAMoZ,cAAc1H,YAAY,gBAC1B2H,qBAAqBrI,YAAY;YAEnCgH,mBAAYG,cAAcxe,UAC1B0f,mBAAmBzS,IAAIkF,IAAI;gBAAE1D;gBAAKtQ;gBAAMkI;gBAAQrG;kBAEhD0f,mBAAmBhI,IAAIvF,KAEPsN,YAAY/R,SAAS1N,QAAQ;gBAAA,OAAO;eAC5CmS,MAAM;gBAAE9L;gBAAQlI;gBAAMsQ;gBAAKzO;;;QAI3C,SAAS2f,aAAa3f,QAAgCmS;YAClD,IAAMsN,cAAc1H,YAAY,gBAC1B2H,qBAAqBrI,YAAY;YAEvC,OADgBoI,YAAY/R,SAAS1N,QAAQ;gBAAA,OAAO;eACrCmS,OAAOuN,mBAAmBjhB,IAAI0T;;QA0D1C,SAASyN,2BAAqBC,aAAmDxZ,QAAwBoI,KAAiCtP,KAA1IkZ;aAvDP,SAAA+B;gBAA2E,IAAzCiC,KAuD4KhE,MAA7CgE;gBAtDtJhF,YAAY,oBAAoB3J,SAAS,iBAAiB;oBAC7D,OAAO2O,GAAG3F,aAAaC,QAAQ;wBAAEtQ,QAAQjB;uBAAY,SAAAuP;wBAAmG,IAAhG3U,SAAgG2U,MAAhG3U,QAAQ6K,SAAwF8J,MAAxF9J,QAAQ4N,OAAgF9D,MAAhF8D,MAC5DtG,KAAasG,KAAbtG,IAAIhU,OAASsa,KAATta,MAEN2hB,OAAOH,aAAa3f,QAAQmS;wBAElC,KAAK2N,MACD,MAAM,IAAI1d,MAAJ,4BAAqCqW,KAAKta,OAA1C,gBAA8Dsa,KAAKtG,KAAnE,SAA8E/L,gBAAU/F;wBANkD,IASpI0f,eAA8BD,KAAtC9f,QAAsBqG,SAAgByZ,KAAhBzZ,QAAQoI,MAAQqR,KAARrR;wBAEtC,OAAOrN,qBAAakC,IAAI;4BACpB,KAAKqH,YAAYtE,QAAQwE,SAErB,MAAM,IAAIzI,MAAJ,aAAsBqW,KAAKta,OAA3B,cAA6C+M,KAAKC,UAAUpG,aAAQ+a,KAAKzZ,UAAUyZ,KAAKzZ,OAAOrG,SAAS8f,KAAKzZ,UAA7G,4BAAgJwE,SAAhJ,SAA+JzE,gBAAU/F;4BAGnL,IAAIge,mBAAYG,cAAcuB,eAE1B,OAAOA,aAAaf,YAAYhf,QAAQS,KAAK,SAAAwK;gCACzC,KAAKA,OACD,MAAM,IAAI7I,MAAJ,kBAA2BqW,KAAKta,OAAhC,sDAA0FiI,gBAAU/F;;2BAIvHI,KAAK;4BACJ,OAAOgO,IAAIxO,MAAM;gCAAED;gCAAQ6K;+BAAU4N,KAAK7T;2BAC3C,SAAAlE;4BACC,OAAOU,qBAAakC,IAAI;gCACpB,IAAImL,IAAIxL,SACJ,OAAOwL,IAAIxL,QAAQvC;+BAExBD,KAAK;gCAOJ,MALIC,IAAImB,UAEJnB,IAAImB,QAAJ,oBAA+B1D,OAA/B,WAA8CuC,IAAImB;gCAGhDnB;;2BAEXD,KAAK,SAAAqB;4BACJ,OAAO;gCAAEA;gCAAQqQ;gCAAIhU;;;;;aAYjC6hB;YAEA,IAAM7N,KAAK1D,IAAIwR,UAAUjS;YACzB6R,cAAcxB,mBAAYa,OAAOW;YACjC,IAAM1hB,OAAOsQ,IAAIyR,YAAYzR,IAAItQ,QAAQgB;YAazC,OAXIkf,mBAAYG,cAAcqB,gBAC1BL,UAAUrN,IAAI1D,KAAKtQ,MAAM0hB,aAAaxZ;YAGtCwZ,YAAYd,cAActe,KAAK,SAAAiF;gBAC3B8Z,UAAUrN,IAAI1D,KAAKtQ,MAAMuH,KAAKW;kBAGlCmZ,UAAUrN,IAAI1D,KAAKtQ,MAAM0hB,aAAaxZ,SAGnC0T,cAAchD,mBAAmBE,uBAAuB;gBAAE9E;gBAAIhU;;;QCtGlE,SAASgiB,iBAA4BN,aAAmDxZ,QAAwB4F,KAAhHmO;YAAmL,IAAAgG,YAAxD/D,KAAwDjC,KAAxDiC,IAAI/D,OAAoD8B,KAApD9B;YAClI,OpB2CG,SAA8BrM,KAASoU;qBAAyD,MAAzDA,8BAA4B9F;gBAyBtE,IAAMzY,SAASoJ,KAAKC,UAAUc,KAvB9B,SAAkB9M;oBACd,IAAMsP,MAAMjR,KAAK2B;oBAEjB,IAAIya,iBAAiBpc,OACjB,OAAOiR;oBAGX,IAAMuL,OAAOF,cAAcrL;oBAE3B,KAAKuL,MACD,OAAOvL;oBAIX,IAAM6R,aAAaD,YAAYrG,SAASE,WAAWF;oBAEnD,OAAKsG,aAIEA,WAAW7R,KAAKtP,OAHZsP;;gBAQf,YAAsB,MAAX3M,SACAiX,KAAKY,YAGT7X;aoB1EAqd,CAAUlT,OAADmU,aAAA,IACVrH,KAAKG,WAAY,SAACzK,KAAgBtP;gBAAjB,OCEpB,SAA0B0gB,aAAmDxZ,QAAwBoI,KAAgBtP,KAArHib;oBACH,OAAOL,cAAchD,mBAAmBC,4BAA4B;wBAChEvW,MAAMmf,2BAAkBC,aAAaxZ,QAAQ,SAACpF,SAASgB;4BAAV,OAAqBwM,IAAIhO,KAAKQ,SAASgB;2BAAS9C,KAAK;4BAAEkd,IAFmGjC,KAAnEiC;4BAE5B/D,MAF+F8B,KAA/D9B;;;iBDF/DiI,CAAiBV,aAAaxZ,QAAQoI,KAAKtP,KAAK;oBAAEkd;oBAAI/D;;eADnH8H,WAEVrH,KAAKC,YAAY,SAACvK,KAAgBtP;gBAAjB,OAAuDygB,2BAAkBC,aAAaxZ,QAAQoI,KAAKtP,KAAK;oBAAEkd;oBAAI/D;;eAFrH8H,WAGVrH,KAAKO,UAAY,SAAC7K;gBAChB,OAAQzC,SAASyC,QAAQ4P,mBAAYG,cAAc/P,OF4OpDsL,cAAchD,mBAAmBG,qBAAqBmH,mBAAYc,UE5O+B1Q,KF4OhB;oBAAE6J,ME5OyBA;sBAAU7J;eAJ7G2R;;QASb,SAASI,mBAA8BxgB,QAA8C6K,QAAiBzC,SAAtGuM;YAA6K,IAAA8L,cAAnDpE,KAAmD1H,MAAnD0H,IAAI/D,OAA+C3D,MAA/C2D;YACjI,ORgCG,SAA8C1K,KAAc8S;gBAC/D,SADyH,MAA1DA,kCAAgC/F,uBAC3F/M,QAAQmL,KAAKY,WAmCjB,OAAOzO,KAAKyV,MAAM/S,KA9BlB,SAAkBzO,KAAKsP;oBACnB,IAAImL,iBAAiBpc,OACjB,OAAOiR;oBAGX,IAAIuL,MACAnb;oBAUJ,IARI+a,iBAAiBnL,QACjBuL,OAAOvL,IAAIoL,UACXhb,QAAQ4P,IAAIwL,YAEZD,OAAOF,cAAcrL;oBACrB5P,QAAQ4P,OAGPuL,MACD,OAAOnb;oBAIX,IAAM+hB,eAAeF,cAAc1G,SAASQ,aAAaR;oBAEzD,OAAK4G,eAIEA,aAAa/hB,OAAOM,OAHhBN;;aQ9DRwgB,CAAYjX,WAADqY,eAAA,IACZ1J,mBAAmBC,8BAA8B,SAAC6J;gBAAD,OCDhD,IAAIzf,qBDCuGyf,kBCFfpgB;eDCjFggB,aAEZ1J,mBAAmBE,yBAA8B,SAAC6J;gBAAD,OD4FpD,SAAgC9gB,QAA8C6K,QAA9E2N,OAAAG;oBAAqO,IAApIxG,KC5Fe2O,mBD4Ff3O,IAAIhU,OC5FW2iB,mBD4FX3iB,MAA2Cma,OAAqFK,MAArFL,MAC7IyI,0BAA0B,SAACC;wBAC7B,SAASC;4BAA0D,IAAAC,aAAAphB;4BAO/D,OAAOue,mBAAYe,cAAcpf,QAAQ;gCAAEsY;+BAAQyG,cAActe,KAAK,SAAAiF;gCAClE,IAAMoa,OAAOH,aAAaja,KAAKyM;gCAE/B,IAAI2N,QAAQA,KAAKrR,QAAQwS,4BACrB,OAAOnB,KAAKrR,IAAIxO,MAAM;oCAAED,QAAQK;oCAAQwK,QAAQzE;mCAAetG;gCAG/D,IAAMiT,UAAU;oCAAE1M,QAAQwE;oCAAQ8Q,eAAeqF,KAAKrF;mCAChD/W,QAAOkG,GAAgBW,MAAM1N,KAAK+B;gCAExC,OAAOwY,KAAK5S,KAAKgR,aAAaC,QAAQ;oCAAExE;oCAAIhU;oCAAMyG;mCAAQmO,SACrDtS,KAAK,SAAAuB;oCACF,KAAKgf,KAAKrF,eACN,OAAO3Z,IAAIyW,KAAK3W;;+BAKjCoB,MAAM,SAAAxC;gCAML,MAAMA;;;wBAWd,YA3CqD,MAAxBsgB,gBAAiB,KAoC9CC,2BAA2Bf,WAAW/hB;wBACtC8iB,2BAA2BE,aAAatW,QACxCoW,2BAA2BG,aAAaphB;wBACxCihB,2BAA2BhB,SAAS9N,IAEpC8O,2BAA2BpW,SAASA;wBAE7BoW;uBAGLA,6BAA6BF;oBAGnC,OAFAE,2BAA2BtF,gBAAgBoF,wBAAwB;wBAAEpF,gBAAe;wBAE7EsF;iBC9IwEI,CAAoBrhB,QAAQ6K,QAAQiW,GAAoB;oBAAEzE;oBAAI/D;;eAF3HmI,aAGZ1J,mBAAmBG,uBAA8B,SAACoH;gBAAD,OFuOhDD,mBAAYgB,YEvO8Ff,kBFuO7E;oBAAEjC,KADnCiF,QEtOgI;wBAAEjF;wBAAI/D;uBFsOb+D;oBAClF/D,MAD+IgJ,MAAzDhJ;;gBAA7H,IAAAgJ;eEzOeb;;QEbf,IAAMc,0BAA0B;QCChC,SAAS/F,iBAAY9V,KAA6BW,QAAwB+B,SAA1EgS;YAA8I,IAAAoH,mBAA/CnF,KAA+CjC,KAA/CiC,IAAI/D,OAA2C8B,KAA3C9B;YACtG,IAAIrQ,eAAevC,MACf,MAAM,IAAItD,MAAM;YAF6H,KAKjJ,IAAMqf,oBAAoBtB,iBAAiBza,KAAKW,UAANmb,oBAAA,6BAAA7hB,SAAA;gBAElCwS,IAAQnE;gBACRnD,QAAQzE,gBAAU/F;eACf+H,UAJ+BoZ,oBAMvC;gBAAEnF;gBAAI/D;gBAEHoJ,aAAapjB,OAAO8F,KAAKmd,0BACzBI,SAAS,IAdkIxQ,MAAA,GAAAA,MAgBtHuQ,WAhBsH3hB,QAAAoR,OAgB1G;gBAAlC,IAAMyQ,eAAgBF,WAAJvQ;gBACnB;oBACIoQ,wBAAwBK,cAAclc,KAAK+b,mBAAmBpb;kBAChE,OAAO3F;oBACLihB,OAAOlf,KAAK/B;;;YAIpB,IAAIihB,OAAO5hB,WAAW2hB,WAAW3hB,QAC7B,MAAM,IAAIqC,MAAJ,oDAA6Duf,OAAOtd,IAAImL,gBAAgB9D,KAAK;;QDxB3G6V,wBAAuB,yBAA+B,SAAC7b,KAA6B+b,mBAA4Bpb;aAUxGyE,MAAMC,QAAQ1E,UACJA,SACe,mBAAXA,SACJ,EAAEA,WAEF,EAAEjB,sBAGEf,IAAI,SAAAwd;gBAkBlB,OAAmC,MAA/BA,IAAIrf,QAAQwC,SAASE,QACdE,qBAGJyc;eAGHC,QAAQ,SAAAD;gBACZnc,IAAIqc,YAAYN,mBAAmBI;;WAMvCN,wBAAuB,mBAAyB,SAAC7b,KAA6B+b,mBAA4Bpb;YAEtG,IAAKuU,2BAA4BM,YAAjC;gBAIA,IAAI3U,aAAab,MACb,MAAM,IAAItD,MAAJ;gBAGV,KAAqC,MAAjC8H,gBAAgB7J,QAAQqF,MACxB,MAAM,IAAItD,MAAJ;iBTmDX,SAA2BsD,KAA6BW,QAAiB+B;oBAE5E,IAAM4Z,iBAAkBxY,SAASnJ,QAAQqF,MACnCuc,kBAAkBzY,SAAS9D,KAAKrF;oBAEtC,KAAK2hB,mBAAmBC,iBACpB,MAAM,IAAI7f,MAAJ;oBAGHiZ,iBAAiB3V,KAAKjF,KAAK,SAAA+a;wBAC9B,OAAOA,YAAY9V,KAAKW,QAAQ+B;;iBS1DhC8Z,CAAkBxc,KAAKW,QAAQob;;WAMnCF,wBAAuB,mBAAyB,SAAC7b,KAA6B+b;YAE1E,IE9EAzY,mBAAa3I,QAAQ4K,MAAM,0CF8E3B;gBAIA,KAAK1E,aAAab,MACd,MAAM,IAAItD,MAAJ;gBAGV,KAAqC,MAAjC8H,gBAAgB7J,QAAQqF,MACxB,MAAM,IAAItD,MAAJ;gBAIV,IAAM+f,gBAAgBhL,iBAAUzR;gBAEhC,KAAKyc,eACD,MAAM,IAAI/f,MAAJ;gBAGV+f,cAAc7F,eAAe;oBACzBtc,QAAQK;oBACRwK,QAAQzE;oBACRqS,MAAQgJ;;;;QG1FpB,2BAAMW,mBAAmB;QAwBlB,SAASC,oBAAoBle;YAEhC,OAD0BkT,YAAY,qBACb5Y,IAAI0F;;QAG1B,SAASme,uBAAuBne;YACTkT,YAAY,qBACpBK,IAAIvT;;QAmBnB,SAASoe,0BAA0Bpe;YAEtC,OADiCkT,YAAY,4BACb5J,IAAItJ;;QAGjC,SAASqe,mBAATpI;YAAsK,IAAxIjc,OAAwIic,KAAxIjc,MAAMuH,MAAkI0U,KAAlI1U,KAAKW,SAA6H+T,KAA7H/T,QACtCoc,mBAAmB1K,YAAY;YAUrC,IARIrS,QAAQN,uBACRM,MAAM,OAGNW,WAAWjB,uBACXiB,SAAS;aAGRlI,MACD,MAAM,IAAIiE,MAAJ;YAZ+J,SAAAsgB,MAAA,GAAArK,QAe9I,EAAE3S,KAAKkS,iBAfuI8K,MAAArK,MAAAtY,QAAA2iB,OAetH;gBAA9C,IAAMC,eAAYtK,MAAAqK;gBACnB,IAAKC,cAAL;oBAIA,IAAMC,gBAAgBH,iBAAiBhkB,IAAIkkB;oBAE3C,IAAKC,eAAL;wBAIA,IAAMC,kBAAkBD,cAAczkB;wBAEtC,IAAK0kB,iBAAL;4BAIA,IAAIxc,UAA4B,mBAAXA,QAAqB;gCACtC,IAAIwc,gBAAgBxc,SAChB,OAAOwc,gBAAgBxc;gCAG3B,IAAIwc,gBAAgBT,mBAAmB,SAAA7O,MAAA,GAAAuP,yBACDD,gBAAgBT,mBADf7O,MAAAuP,uBAAA/iB,QAAAwT,OACkC;oCAAA,IAAAwP,yBAAAD,uBAAAvP,MAAjDyP,WAAiDD,uBAAjDC;oCAChB,IAAIrY,YAD6DoY,uBAAxDE,OACc5c,SACnB,OAAO2c;;;4BAMvB,IAAIH,gBAAgBzd,qBAChB,OAAOyd,gBAAgBzd;;;;;;QC1G5B,IAAM8d,0BAAqBC,wBAAA,yCAELnjB,QAAgC6K,QAAiBzC,SAF5CgS;YAE4I,IAApEiC,KAAoEjC,KAApEiC,IAAI/D,OAAgE8B,KAAhE9B,MAEhGvF,UAAUyP,mBAAmB;gBAAErkB,MAAMiK,QAAQjK;gBAAMuH,KAAK1F;gBAAQqG,QAAQwE;;YAS9E,SAASuY,aAAapJ,MAAqCqJ,KAAoCC;qBAAe,MAAfA,wBAAW,KAElGlb,QAAQuT,iBAAiB1T,eAAejI,WAe5Cwb,iBAAYxb,QAAQ6K,QAATlL,SAAA;oBACPqa;oBACAqJ;oBACAlf,MAAQiE,QAAQjE;oBAChBhG,MAAQiK,QAAQjK;mBACbmlB,WACJ;oBAAEjH;oBAAI/D;;;YAGb,OAAOlX,qBAAayC,IAAI,EAEpBuf,ahChDG,0BgCkDHhiB,qBAAakC,IAAI;gBAEb,KAAKyP,SACD,MAAM,IAAI3Q,MAAJ,wCAAiDgG,QAAQjK,OAAzD,WAAwE0M,SAAxE,SAAuFxK,OAAOsF,SAASC,WAAvG,OAAsHvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAGzK,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,oBAA6ByI,SAA7B,4BAA+DkI,QAAQ1M,OAAO7F;gBAKxF,OAAOuS,QAAQ1R,QAAQ;oBAAErB;oBAAQ6K;oBAAQ4N,MAF5BrQ,QAAQqQ;;eAItBhY,KAAK,SAAAgY;gBACJ,OAAO2K,ahClER,8BAKD,WgC6DkE;oBAAE3K;;eAEnE,SAAA/W;gBACC,OAAO0hB,ahCrER,8BAMD,SgC+DgE;oBAAE1hB;;kBAGrEjB,KAAK4O,eAAMnM,MAAM,SAAAxC;gBAChB,IAAIqS,WAAWA,QAAQyQ,aACnB,OAAOzQ,QAAQyQ,YAAY9iB;gBAE3B,MAAMA;;WApEYyiB,sBAAA,iCAyETnjB,QAAgC6K,QAAiBzC;YAElE,KAAIma,0BAA0Bna,QAAQjE,OAAtC;gBAIA,IAAM4O,UAAUsP,oBAAoBja,QAAQjE;gBAE5C,KAAK4O,SACD,MAAM,IAAI3Q,MAAJ,wDAAiEgG,QAAQjK,OAAzE,WAAwF0M,SAAxF,SAAuGxK,OAAOsF,SAASC,WAAvH,OAAsIvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAGzL,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,gBAAyByI,SAAzB,4BAA2DkI,QAAQ1M,OAAO7F;gBAGpF,IAAIR,WAAW+S,QAAQrN,KACnB,MAAM,IAAItD,MAAJ;gBAGV2Q,QAAQsQ,OAAM;;WA7FYF,sBAAA,sCAgGJnjB,QAAgC6K,QAAiBzC;YAEvE,KAAIma,0BAA0Bna,QAAQjE,OAAtC;gBAIA,IxC6uB+ByG,SwC7uBzBmI,UAAUsP,oBAAoBja,QAAQjE;gBAE5C,KAAK4O,SACD,MAAM,IAAI3Q,MAAJ,6DAAsEgG,QAAQjK,OAA9E,WAA6F0M,SAA7F,SAA4GxK,OAAOsF,SAASC,WAA5H,OAA2IvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAG9L,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,qBAA8ByI,SAA9B,6BxCsuBqBD,UwCtuBkEmI,QAAQ1M;gBxCuuBzGyE,MAAMC,QAAQH,WACd,MAAYA,QAAQc,KAAK,SAAzB,MACO3G,QAAQ6F,WACf,YAAkBA,QAAQpK,aAEnBoK,QAAQpK;gBwCzuBf,IAAIR,WAAW+S,QAAQrN,KACnB,MAAM,IAAItD,MAAJ;gBAGVkgB,uBAAuBla,QAAQjE,OhCtHzB,YgC0HFiE,QAAQib,MAKRtQ,QAAQ/R,QAAQiB,OAAOmG,QAAQ1G,ShChI7B,cgCkIK0G,QAAQib,OAKftQ,QAAQ/R,QAAQC,QAAQ;oBAAEjB;oBAAQ6K;oBAAQ4N,MAAMrQ,QAAQqQ;;;WApIlC0K;QCkC3B,SAAS7G,uBAAelI,OAAxBO;YAA+F,IAA/C0H,KAA+C1H,MAA/C0H,IAAI/D,OAA2C3D,MAA3C2D,MACjDmL,mBAAmBpM,YAAY;YAErC,KAAKhX,UAAUA,OAAO8H,QAClB,MAAM,IAAI/F,MAAJ;YAGV;gBACI,KAAKgS,MAAMpU,QACP;cAEN,OAAOU;gBACL;;YAZ8F,IAe5FV,SAAyBoU,MAAzBpU,QAAQ6K,SAAiBuJ,MAAjBvJ,QAORzC,UAxDV,SAAsBA,SAAkBpI,QAAgC6K,QAAxEuP;gBAAoJ,IAC5IsJ,eADmFrH,KAAyDjC,KAAzDiC,IAAI/D,OAAqD8B,KAArD9B;gBAG3F;oBACIoL,gBAAgBlD,mBAAmBxgB,QAAQ6K,QAAQzC,SAAS;wBAAEiU;wBAAI/D;;kBACpE,OAAO5X;oBACL;;gBAGJ,IAAKgjB,iBAIwB,mBAAlBA,iBAAgD,SAAlBA,kBAIzCA,gBAAgBA,cAAa,2BAEkB,mBAAlBA,iBAAgD,SAAlBA,iBAItDA,cAAc1J,QAAsC,mBAAvB0J,cAAc1J,QAI3CkJ,sBAAsBQ,cAAc1J,OAIzC,OAAO0J;aAyBSC,CAPevP,MAATqE,MAOazY,QAAQ6K,QAAQ;gBAAEwR;gBAAI/D;;YAEpDlQ,YAIL0Q,gBAAgB9Y,SAEZyjB,iBAAiBhW,IAAIrF,QAAQ+J,QAIjCsR,iBAAiBxW,IAAI7E,QAAQ+J,KAAI;YAE7BlK,eAAejI,YAAYoI,QAAQuT,kBAIO,MAA1CvT,QAAQyC,OAAOrI,QAAQwC,SAASE,UAChC2F,SAAa7F,SAASE,OAAhB;YAGVge,sBAAsB9a,QAAQ4R,MAAMha,QAAQ6K,QAAQzC,SAAS;gBAAEiU;gBAAI/D;;;QClFhE,SAAS+D,MAAGle,MAAe4U,SAA2C1R;YAEzE,KAAKlD,MACD,MAAM,IAAIiE,MAAM;YASpB,IANuB,qBAAZ2Q,YACP1R,UAAU0R,SAEVA,UAAU,MAGT1R,SACD,MAAM,IAAIe,MAAM;aAGpB2Q,UAAUA,WAAW,IACb5U,OAAOA,MACf4U,QAAQ1R,UAAUA,WAAW0R,QAAQ1R;YAErC,IAAMqE,MAAMqN,QAAQ1S,QACdgG,SAAS0M,QAAQ1M,QAYjBud,kBHkFH,SAASC,mBAATrL,OAA2IwK;gBAA0D,IAAvK7kB,OAAuKqa,MAAvKra,MAAMuH,MAAiK8S,MAAjK9S,KAAKW,SAA4JmS,MAA5JnS,QACtCoc,mBAAmB1K,YAAY;gBAErC,KAAK5Z,QAAwB,mBAATA,MAChB,MAAM,IAAIiE,MAAJ;gBAGV,IAAI0I,MAAMC,QAAQrF,MAAM;oBAAA,KACpB,IAAMoe,sBAAsB,IADRC,MAAA,GAAAC,QAGDte,KAHCqe,MAAAC,MAAAjkB,QAAAgkB,OAIhBD,oBAAoBrhB,KAAKohB,mBAAmB;wBAAE1lB;wBAAMkI;wBAAQX,KADjDse,MAAAD;uBAC8Df;oBAG7E,OAAO;wBACHve,QADG;4BACM,SAAAwf,OAAA,GAAAA,OACwBH,oBADxB/jB,QAAAkkB,QACwBH,oBAAJG,MACNxf;;;;gBAM/B,IAAIqG,MAAMC,QAAQ1E,SAAS;oBAAA,KACvB,IAAMyd,uBAAsB,IADLI,OAAA,GAAAC,WAGJ9d,QAHI6d,OAAAC,SAAApkB,QAAAmkB,QAInBJ,qBAAoBrhB,KAAKohB,mBAAmB;wBAAE1lB;wBAAMuH;wBAAKW,QAD9C8d,SAAAD;uBAC8DlB;oBAG7E,OAAO;wBACHve,QADG;4BACM,SAAA2f,OAAA,GAAAA,OACwBN,qBADxB/jB,QAAAqkB,QACwBN,qBAAJM,MACN3f;;;;gBAM/B,IAAM4f,mBAAmB7B,mBAAmB;oBAAErkB;oBAAMuH;oBAAKW;;gBAQzD,IANKX,OAAOA,QAAQN,uBAChBM,MAAMkS,gBAGVvR,SAASA,UAAUjB;gBAEfif,kBACA,MAAI3e,OAAOW,SACD,IAAIjE,MAAJ,yCAAkDjE,OAAlD,gBAAsEkI,OAAO7F,aAA7E,WAAiGkF,QAAQkS,gBAAgB,aAAa,eAAtI,aACClS,MACD,IAAItD,MAAJ,yCAAkDjE,OAAlD,WAAgEuH,QAAQkS,gBAAgB,aAAa,eAArG,aACCvR,SACD,IAAIjE,MAAJ,yCAAkDjE,OAAlD,gBAAsEkI,OAAO7F,cAE7E,IAAI4B,MAAJ,yCAAkDjE;gBAIhE,IAMImmB,gBACAC,eAPE3B,gBAAgBH,iBAAiB/U,SAAShI,KAAK;oBAAA,OAAO;oBAEtDmd,kBAAkBnV,cAASkV,eAAezkB,MAAM;oBAAA,OAAO;oBAEvDqmB,YAAYne,OAAO7F;gBAazB,OARIuE,aAAQsB,WACRie,iBAAiB5W,cAASmV,iBAAiBT,kBAAkB;oBAAA,OAAM;oBAEpD3f,KADf8hB,gBAAgB;oBAAEtB,OAAO5c;oBAAQ2c;qBAGjCH,gBAAgB2B,aAAaxB,UAG1B;oBACHve,QADG;+BAEQoe,gBAAgB2B,YAEnBD,kBACAD,eAAe5f,OAAO4f,eAAe9hB,QAAQ+hB,eAAe;wBAEvDD,eAAevkB,iBACT8iB,gBAAgBT,oBAI1B9jB,OAAO8F,KAAKye,iBAAiB9iB,iBAEvB6iB,cAAczkB;wBAIrBuH,QAAQpH,OAAO8F,KAAKwe,eAAe7iB,UACnC0iB,iBAAiB/K,IAAIhS;;;aGjLTme,CAAmB;gBAAE1lB;gBAAMuH;gBAAKW;eAVV;gBAC1ChF,SAAa0R,QAAQ1R;gBACrBmiB,aAAazQ,QAAQ0R,gBAAiB,SAAA/jB;oBAClC,MAAMA;;gBAEVL,QAAQqF;gBACRW,QAAQA,UAAUjB;gBAClBjH;;YAKJ,OAAO;gBACHsG,QADG;oBAECmf,gBAAgBnf;;;;QCIrB,ICnCIiY,YDmCEpE,YAAkB,SAAlBA,KAAmB5S,KAAKvH,MAAMsa,MAAM1F;YAI7C,IAAI1M,UADJ0M,UAAUA,WAAW,IACA1M,UAAUjB,oBACzBsf,kBAAkB3R,QAAQxP,YpC/CS,GoCgDnCohB,eAAe5R,QAAQxP,WpCpDG,KoCqD1BoY,gBAAgB5I,QAAQ4I,kBAAiB;YAG/C,OAAOva,qBAAakC,IAAI;gBAEpB,OA9CR,SAAyBnF,MAAeuH,KAA6BW;oBACjE,KAAKlI,MACD,MAAM,IAAIiE,MAAM;oBAGpB,IAAIiE,UACsB,mBAAXA,WAAwByE,MAAMC,QAAQ1E,YAAYtB,aAAQsB,SACjE,MAAM,IAAIzC,UAAJ;oBAId,IAAIqE,eAAevC,MACf,MAAM,IAAItD,MAAM;iBAiChBwiB,CAAgBzmB,MAAMuH,KAAKW,SA7BnC,SAAyBX,KAA6BW,QAAwBse,cAA9EvK;oBAAqL,IAA9E9B,OAA8E8B,KAA9E9B;oBACnG,OAAOlX,qBAAakC,IAAI;wBACpB,O3CmpBD,SAAoBwC,QAAgCe;4BAEvD,IAAIge,eAAepb,YAAY5C;4BAE/B,IAAIge,cACA,OAAIA,iBAAiB/e;4BAOzB,IAAIe,UAAUf,QACV,QAAO;4BAGX,IAAI2B,OAAOZ,WAAWA,OAClB,QAAO;4BAjBqF,SAAAie,OAAA,GAAAC,cAoB9E/d,UAAUlB,SApBoEgf,OAAAC,YAAAhlB,QAAA+kB,QAqB5F,IADUC,YAAAD,UACIje,OACV,QAAO;4BAIf,QAAO;yB2C7qBCme,CAAW3kB,QAAQqF,OACZmT,iBAAiBnT,KAAKif,gBACtB5f,aAAQsB,UAER+R,SAAS1S,KAAK;4BAAE4S;6BAEhB;4BAAEjS;;uBAGd5F,KAAK,SAAAkU;wBAGJ,OAHsCA,MAA/BtO;;iBAmBA4e,CAAgBvf,KAAKW,QAAQse,cAAc;oBAAErM;;eACrD7X,KAAK,SAAAykB;gBAEJ,KAAKva,YAAYtE,QAAQ6e,eACrB,MAAM,IAAI9iB,MAAJ,YAAqB+I,UAAU9E,UAA/B,qBAA2D8E,UAAU+Z;gBAG/E7e,SAAS6e;gBAET,IAAMC,UAAWhnB,SAASuY,aAAaC,UAAU8B,QAA6B,mBAAdA,KAAKta,OAAyBsa,KAAKta,OAAnF,OAA+FA,MAMzG6C,UAAU,IAAII,wBACd+C,OAAWhG,OAAP,MAAiB6P;gBAE3B,KAAK2N,eAAe;oBAChB,IAAMyJ,mBAA0C;wBAAEjnB;wBAAMuH;wBAAKW;wBAAQrF;;qBJ7C1E,SAA6BmD,MAAe6e;wBACrB3L,YAAY,qBACpBpK,IAAI9I,MAAM6e;qBI4CpBqC,CAAoBlhB,MAAMihB;oBAE1B,IAAME,cAAcvN,YAAY,mBAAmBrK,SAAShI,KAAK;wBAAA,OAAM;;oBACvE4f,YAAY7iB,KAAKzB,UAEjBA,QAAQkC,MAAM;yBJzBnB,SAAqCiB;4BACPkT,YAAY,4BACpBpK,IAAI9I,OAAM;yBIwBvBohB,CAA4BphB,OAC5Bme,uBAAuBne;;oBAG3B,IAAMqhB,kBhChFX,SAAuB9f;wBAE1B,OADqBqS,YAAY,gBACbtZ,IAAIiH,MAAK;qBgC8EG+f,CAAc/f,OpCrFjB,MADN,KoCuFTggB,kBAAkBhB,iBAEpBiB,aAAaH,iBACbI,aAAaF,iBAEX7U,WAAWjB,aAAa;wBAC1B,OAAI3H,eAAevC,OACR1E,QAAQiB,OAAO,IAAIG,MAAJ,uBAAgCjE,OAAhC,cAAiDinB,iBAAiB/B,MAAM,aAAa,WAG3G+B,iBAAiBS,YACV7kB,QAAQiB,OAAO,IAAIG,MAAJ,yCAAkDjE,UAG5EwnB,aAAahZ,KAAK8J,IAAIkP,apClGH,KoCkGqC;yBACpC,MAAhBC,eACAA,aAAajZ,KAAK8J,IAAImP,apCpGP,KoCoGyC,KAGvDR,iBAAiB/B,OAAsB,MAAfsC,aAGH,MAAfC,aACA5kB,QAAQiB,OAAO,IAAIG,MAAJ,iCAA0C+iB,UAA1C,SAA0D/e,oBAA1D,SAA8Esf,kBAA9E,cADnB,IAFI1kB,QAAQiB,OAAO,IAAIG,MAAJ,4BAAqC+iB,UAArC,SAAqD/e,oBAArD,SAAyEof,kBAAzE;uBpCxGP;oBoC+GvBxkB,QAAQoC,QAAQ;wBACZyN,SAASpM,UACT6gB,YAAY5gB,OAAO4gB,YAAY9iB,QAAQxB,SAAS;uBACjDkC,MAAMmM;;gBAWb,OARAmM,iBAAY9V,KAAKW,QAAQ;oBACrB2T,MnC3HG;oBmC4HH7V;oBACAhG;oBACAsa;oBACAkD;mBACD;oBAAEU;oBAAI/D;oBAEFqD,gBAAgB3a,QAAQC,YAAYD;;;QE1H5C,SAASmf,uBAAoBN,aAAmDxZ,QAAwB4F;YAC3G,OAAO6Z,iBAAyBjG,aAAaxZ,QAAQ4F,KAAK;gBAAEoQ;gBAAI/D;;;QAG7D,SAASkI,yBAA8BxgB,QAA8C6K,QAAiBzC;YACzG,OAAO2d,mBAA2B/lB,QAAQ6K,QAAQzC,SAAS;gBAAEiU;gBAAI/D;;;QAG9D,SAAS8G,oBAAc1Z;YAC1B,OAAO2Y,mBAAYe,cAAc1Z,KAAK;gBAAE4S;;;QCbrC,SAAS0N,cAActgB;YAA6B,KACvD,IADuDyL,MAAA,GAAA8U,wBAC/BlO,YAAY,mBACEtZ,IAAIiH,KAAK,KAFQyL,MAAA8U,sBAAAlmB,QAAAoR,OAErC8U,sBAAA9U,KACNlP,OAAO,IAAIG,MAAJ,sCAAgDc,MAAMmM;;QCNtE,SAAS8H,qBAAUzR;YAEtB,SAFsE,MAAhDA,cAA+BrF,UAEhDkG,aAAab,MACd,MAAM,IAAItD,MAAJ;YAOV,OAJKsD,IAAG,oBACJA,IAAG,kBAA4B,KAG5BA,IAAG;;QCNP,SAASwgB,eAAkBja;YAC9B,OAAO;gBACHxN,KADG;oBACqB,IAAA6C,QAAA9D;oBACpB,OAAO4D,qBAAakC,IAAI;wBACpB,IAAIhC,MAAKtB,UAAUsB,MAAKtB,WAAWK,QAC/B,MAAM,IAAI+B,MAAJ;wBAGV,OAAO6J;;;;;QJCnByQ,aAAS;YAAEP;YAAagK,YhB+FrB,SAAoB5a,KAAclF;gBACrC,IAAM+f,UAAU/O,YAAY,YACtBgP,eAAehP,YAAY;gBAIjC,OAFAhR,SAASA,UAAUiF,iBAAiBC,MAE7B6a,QAAQ1Y,SAASrH,QAAQ;oBAAA,OAAMjF,qBAAakC,IAAI;wBAEnD,IAAI8C,sBAAgBC,QAChB,MAAM,IAAIjE,MAAJ,+DAAwEiE;wBAGlF,IAAMlI,OAAQ6c,cAAc3U;wBAG5B,IAFc+C,eAAe/I,QAAQlC,OAGjC,MAAM,IAAIiE,MAAJ,qBAA8BjE,OAA9B;wBAGV,IAAM2U,SA/Cd,SAAyB3U,MAAeoN;4BAEpC,IAAMuH,SAAStC,SAAS0C,cAAT;4BAkBf,OAhBAJ,OAAOO,aAAP,QAA4BlV,OAC5B2U,OAAOO,aAAP,MAA4BlV,OAE5B2U,OAAOO,aAAP;4BACAP,OAAOO,aAAP,qBACAP,OAAOO,aAAP,gBACAP,OAAOO,aAAP;4BACAP,OAAOO,aAAP,8BAEAP,OAAOO,aAAP;4BACAP,OAAOO,aAAP,mBACAP,OAAOO,aAAP,cACAP,OAAOO,aAAP;4BAEAP,OAAOwT,MAAM/a,KAENuH;yBA2BYyT,CAAgBpoB,MAAMoN;wBAGrC,OAFA8a,aAAapZ,IAAI5G,QAAQyM,SAElBqI,kBAAkB1a,KAAK,SAAAgQ;4BAE1BA,KAAKkB,YAAYmB;4BACjB,IAAM4J,SAAS5J,OAAOrK;4BAEtB,OAAO,IAAIrH,qBAAa,SAACH,SAASgB;gCAE9B6Q,OAAOL,iBAAiB,QAAQxR,UAChC6R,OAAOL,iBAAiB,SAASxQ;+BAElCxB,KAAK;gCAEJ,OAAOoY,iBAAiB6D,QrBhJV,KqBgJS,YAAoCnR;+BAE5D9K,KAAK;gCAEJ,OAAOic;;;;;;YgBrIiBb;YAAY2K,ShB6L7C,SAAiB9gB,KAA6B6F;gBACjDsQ,WAAW;oBAAEnW;oBAAKW,QAAQiF,iBAAiBC;;;YgB9Lc2P;YAAUH;YAC/DH;YAAuB6L,WhByFxB,SAAmBlb,KAAclF;gBAEpC,OADgBgR,YAAY,WACb5J,IAAIpH,UAAUiF,iBAAiBC;;YgB3FRsP;YAAmBC;YAAsB4L,gBhBgN5E;gBAA0B,KAC7B,IAAMN,UAAU/O,YAAY,YACtBgP,eAAehP,YAAY,iBAFJqL,MAAA,GAAAiE,sBAIRN,aAAajiB,QAJLse,MAAAiE,oBAAA5mB,QAAA2iB,OAIa;oBAArC,IACKvb,QAAQkf,aAAa5nB,IADdkoB,oBAAAjE;oBAETvb,SAASA,MAAMuB,cACfvB,MAAMuB,WAAW6L,YAAYpN;;gBAGrCkf,aAAapX,SACbmX,QAAQnX;;;QqBzOL,IAAM2X,OAAI,QAEJC,wBACWD,OAAZ,aADCC,8BAEWD,OAAN,mBAGLE,YAAY;YACrBvN,QAAM;YACND,QAAM;YACNN,UAAQ;YACRS,SAAO;YACPD,QAAM;YACNH,OAAK;WAeI0N,qBAAqB;YAC9B7b,MAAS;YACT8b,QAAS;YACTC,QAAS;WAGAC,UAAU7hB,aAEVD,yBAAW,KAEX+hB,qBAAqB;YAC9BC,OAAQ;YACRC,QAAQ;WAGCC,QAAQ;YACjBC,QAAU;YACVC,UAAU;YACVC,SAAU;YACVxO,OAAU;YACVyO,OAAU;YACVC,OAAU;YACVC,QAAU;;QC7CP,SAASC,mBAAyBC,WAA0BrW,OAAwBtS,KAAcN,OAAWkpB;YAGhH,IAAMC,OAAoCF,UAAUG,kBAAkB9oB;YAEtE,OAAK6oB,QAI6B,qBAAvBA,KAAKE,gBACLF,KAAKE,cAALvoB,SAAA;gBAAqBd;eAAUkpB,YAJ/BlpB;;QCRf,SAASspB,qBAAqBvK;YAC1B,OAAO1O,cAAciZ,sBAAsB;gBACvC,KAAKvK,YACD,MAAM,IAAIxb,MAAJ;gBAFmC,IAAAgmB,oBAKAxK,WAAWpS,MAAM,OAApD6c,WALmCD,kBAAA,IAKzBjqB,OALyBiqB,kBAAA,IAKnBE,iBALmBF,kBAAA;gBAO7C,IAAIC,aAAazB,MACb,MAAM,IAAIxkB,MAAJ,uCAAgDimB;gBAG1D,KAAKlqB,MACD,MAAM,IAAIiE,MAAJ;gBAGV,KAAKkmB,gBACD,MAAM,IAAIlmB,MAAJ;gBAGV;oBACI,OAAO8I,KAAKyV,MhDVjB,SAAsB/S;wBACzB,IAAsB,sBAAXvN,UAAiD,qBAAhBA,OAAOkoB,MAC/C,OAAOloB,OAAOkoB,KAAK3a;wBAGvB,IAAsB,sBAAXE,QACP,OAAOA,OAAOC,KAAKH,KAAK,UAAUpN,SAAS;wBAG/C,MAAM,IAAI4B,MAAJ;qBgDCoBomB,CAAaF;kBACjC,OAAO5nB;oBACL,MAAM,IAAI0B,MAAJ,yCAAkDkmB,iBAAlD,OAAuE9Y,eAAe9O;;eAEjG,EAAEkd;;QAGF,SAAS6K;YACZ;gBACI,OAAON,qBAAqB9nB,OAAOlC;cACrC,OAAOuC;;QCsBN,IAAMgoB,uBAAb;YAWE,SAAAA,eAAYZ;gBAAyB,IAAAxmB,QAAA9D;gBAAAA,KAVrCsqB,iBAUqC,GAAAtqB,KATrCiU,aASqC,GAAAjU,KARrCmH,eAQqC,GAAAnH,KAPrCsI,cAOqC;gBAAAtI,KANrCmrB,oBAMqC,GAAAnrB,KALrCorB,6BAKqC,GAAAprB,KAHrCqrB,sBAGqC;gBAAArrB,KAFrCsrB,kBAEqC,GACnC1nB,qBAAakC,IAAI;oBACfhC,MAAKwmB,YAAYA,WACjBxmB,MAAKunB,iBAAiB;oBAEtB,IAAME,eAAeN;oBAErB,KAAKM,cACH,MAAM,IAAI3mB,MAAJ;oBAGqB4mB,aAAzBD,aAAaE,WAKfC,QAAQC,IAJC,oCACPJ,aAAaE,UADN;oBAXU,IAkBbnjB,SAA4CijB,aAA5CjjB,QAAQO,SAAoC0iB,aAApC1iB,QAAQlJ,UAA4B4rB,aAA5B5rB,SAAkBsU,QAAUsX,aAAVtX;oBAE1CnQ,MAAKqD,UAF+CokB,aAAnBpkB,SAGjCrD,MAAKsnB,wBAAwBtnB,MAAK8nB,yBAAyBtjB;oBAC3DxE,MAAKqnB,eAAetiB,QACpB/E,MAAKwE,SAAS0a,yBACZlf,MAAKsnB,uBACLviB,QACAlJ;oBAGFmE,MAAK+nB,kBAAkBhjB;oBAEvB,IAAMijB,eAAehoB,MAAKioB,cACxBjoB,MAAKsnB,uBACLviB,QACAoL;oBAOF,OALAnQ,MAAKkoB,SAASF,cAAcjjB,SAC5ByS,gBAAgBxX,MAAKsnB;oBAErBtnB,MAAKmoB,iBAEEnoB,MAAKwE,OAAO4jB,KAAKpoB,MAAKqoB;mBAE5BlpB,KAAK;oBACJ,OAAOa,MAAKsoB;mBAEb1mB,MAAM,SAAAxC;oBACLY,MAAK2B,QAAQvC;;;YA3DrB,IAAAwB,SAAAwmB,eAAAvmB;YAAA,OAAAD,OA+DE2nB,aAAA;gBAA8B,IAAAvnB,SAAA9E;gBAC5B,OAAO;oBACLugB,OAAO;wBAAA,OAAMzb,OAAKyb;;oBAClBF,OAAO;wBAAA,OAAMvb,OAAKub;;oBAClBiM,QAAQ,SAAA1P;wBAAA,OAAuB9X,OAAKwnB,OAAO;4BAAEjV,OAArCuF,KAAGvF;4BAAyCE,QAA5CqF,KAAUrF;;;oBAClB9R,SAAS,SAAAvC;wBAAG,OAAI4B,OAAKW,QAAQvC;;oBAC7BqpB,SAAS,SAAA1oB;wBAAO,OAAIiB,OAAKynB,QAAQ1oB;;oBACjCwE,WAAW;wBAAA,OAAMvD,OAAKsmB;;oBACtBoB,iBAAiB;wBAAA,OAAM1nB,OAAKqmB;;;eAvElCzmB,OA2EEmnB,oBAAA,SAAkBhjB;gBAChB,KAAKsE,YAAYnN,KAAKsqB,UAAUmC,sBAAsB5jB,SACpD,MAAM,IAAIjE,MAAJ,oCAA4CiE;eA7ExDnE,OAiFE6nB,UAAA,SAAQ1oB;gBACN7D,KAAKqrB,eAAepmB,KAAKpB;eAlF7Ba,OAqFEqnB,gBAAA,SACEX,uBACAviB,QAFFsO;gBAIgB,IACVlD,OAFFuI,OACYrF,MADZqF,MAAatL,MACDiG,MADCjG;gBAIf,IHnIK,UGmIDsL,MACFvI,QAJYkD,MADN9V,YAMD,IHpIF,UGoIMmb,MAA4B;oBACrC,KAAKzT,aAAaqiB,wBAChB,MAAM,IAAIxmB,MAAJ,iEAC2DgE,oBAD3D;oBAKR,IAAMyR,SAASV,qBAAUyR;oBACzBnX,QAAQpB,aAAa,SAASwH,UAAUA,OAAOpG,MAAM/C;;gBAGvD,KAAK+C,OACH,MAAM,IAAIrP,MAAJ;gBAGR,OAAOoe,yBAAmBoI,uBAAuBviB,QAAQoL;eA7G7DvP,OAgHEknB,2BAAA,SAAyBc;gBAAuC,IpD0lB9BxkB,KAA6BrG,GoDzlBrD2a,OAASkQ,IAATlQ;gBAER,IHrJM,aGqJFA,MACF,OAAO3J,aAAa,UAAUtK,UAAU1F;gBACnC,IHrJD,aGqJK2Z,MAGT,OAAO3J,aAAa,WpDklBU3K,MoDllBoBrF,apDklBkD,OAAzChB,IoDnlB1C6qB,IAAIjgB,cpDmlBsC5K,IAAa;gBAdvE,SAAsBqG,KAA6BrG;yBAAyC,MAAzCA,UAAa;oBAGnE,KAFA,IAAIyG,SAASJ,KAEJ9H,IAAI,GAAGA,IAAIyB,GAAGzB,KAAK;wBACxB,KAAKkI,QACD;wBAGJA,SAASD,UAAUC;;oBAGvB,OAAOA;iBAIAqkB,CAAazkB,KAAKsE,mBAAmBtE,OAAOrG;gBoDllB5C,IHxJD,aGwJK2a,MAAmC;oBAAA,IAEpCtL,MAAQwb,IAARxb,KACF0b,WAAW3gB,YAAYpJ;oBAE7B,KAAK+pB,UACH,MAAM,IAAIhoB,MAAJ;oBANoC,SAAA+O,MAAA,GAAAkZ,yBASxBxiB,qBAAqBuiB,WATGjZ,MAAAkZ,uBAAAtqB,QAAAoR,OASQ;wBAA/C,IAAMhK,QAAKkjB,uBAAAlZ;wBACd,IAAI5K,aAAaY,QAAQ;4BACvB,IAAM0Q,SAASV,qBAAUhQ;4BAEzB,IAAI0Q,UAAUA,OAAOyS,WAAWzS,OAAOyS,QAAQ5b,MAC7C,OAAOmJ,OAAOyS,QAAQ5b;;;;gBAM9B,MAAM,IAAItM,MAAJ,oBAA4B4X,OAA5B;eA7IV9X,OAgJEqoB,WAAA;gBAGE,OADA/sB,KAAKiU,QAAQjU,KAAKiU,SAAS,IACpBjU,KAAKiU;eAnJhBvP,OAsJEsnB,WAAA,SAAS/X,OAAqB5G,QAAgB2f;qBAA2B,MAA3BA,yBAAoB;gBAChE,IAAMzC,UAAUvqB,KAAKqsB,cACfY,gBAAgBjtB,KAAK+sB;gBAU3B5a,OAAO8a,eFpMJ,SAAgC7B,uBAA+Cd,WAA0BrW,OAAwB5G,QAAiBkd,SAA2ByC;yBAA6C,MAA7CA,yBAAqB;oBAAwB,KAE7N,IAAM1oB,SAAS,IAF8MqP,MAAA,GAAAqC,gBAK3MlV,OAAO8F,KAAKqN,QAL+LN,MAAAqC,cAAAzT,QAAAoR,OAKvL;wBAAjC,IAAMhS,MAAGqU,cAAArC,MACJ6W,OAAOF,UAAUG,kBAAkB9oB;wBAEzC,KAAI6oB,SAAQA,KAAK0C,cAAe7f,WAAWzE,gBAAU/F,WAAYkG,aAAaqiB,wBAA9E;4BAIA,IAAM/pB,QAAQgpB,mBAAmBC,WAAWrW,GAAOtS,KAAKsS,MAAMtS,MAAM4oB;4BAEpEjmB,OAAO3C,OAAON,OACVmpB,QAAQA,KAAK2C,UAAU7oB,OAAOkmB,KAAK2C,WACnC7oB,OAAOkmB,KAAK2C,SAAS9rB;;;oBAI7B,KAAK2rB,UAAU,SAAA9H,MAAA,GAAAkI,yBACO9C,UAAU+C,gBADjBnI,MAAAkI,uBAAA7qB,QAAA2iB,OACiC;wBAAvC,IAAMvjB,OAAGyrB,uBAAAlI;wBACLjR,MAAMjS,eAAeL,UACtB2C,OAAO3C,QAAO0oB,mBAAmBC,WAAWrW,GAAOtS,MAAKsS,MAAMtS,OAAM4oB;;oBAMhF,OAAOjmB;iBE8JiBgpB,CACtBttB,KAAKorB,uBACLprB,KAAKsqB,WACLrW,OACA5G,QACAkd,SACAyC;gBATqE,SAAA9H,MAAA,GAAAqI,wBAcjDvtB,KAAKqrB,gBAd4CnG,MAAAqI,sBAAAhrB,QAAA2iB,OAcrDqI,sBAAArI,KACR3kB,KAAKP,MAAMitB;eArKzBvoB,OAyKEunB,gBAAA;gBAAgB,IAAA5mB,SAAArF;gBACd6C,OAAOoS,iBAAiB,gBAAgB;oBACtC5P,OAAKiD,OAAOklB,WAAWrP;oBAGzBtb,OAAOoS,iBAAiB,UAAU;oBAChC5P,OAAKiD,OAAOklB,WAAWrP;oBAGzBhQ,cAAcnO,KAAKorB,uBAAuB;oBACxC/lB,OAAKooB;;eAnLX/oB,OAuLEgpB,gBAAA;gBAA4E,IAAA7S,QAExE7a,KAAKsrB,cAActrB,KAAKsqB,UAAUgB,cAAc,IAFwBqC,cAAA9S,MACpExD,OADoEuW,eAAA/S,MACrDtD,QADqDsW,gBAAAhT,MACrCvG,wBADqC,MAAAuZ,gBAC3B,SAD2BA;gBAI1E,OAAO;oBAAExW,YAJiE,MAAAsW;oBAI1DpW,aAJ0D,MAAAqW;oBAIlDtZ,SADxBA,UAAUI,eAAeJ;;eA1L7B5P,OA8LE0nB,iBAAA;gBAAsC,IAAAnmB,SAAAjG;gBACpC,OhDpMOoT,uBAAuBnQ,KAAK;oBAC/B,IAAI+P,SAASC,MACT,OAAOD,SAASC;oBAGpB,MAAM,IAAIrO,MAAM;mBgD+LS3B,KAAK;oBAAM,IAAA6qB,uBACH7nB,OAAKynB,iBAAhCrW,QAD8ByW,qBAC9BzW,OAAOE,SADuBuW,qBACvBvW,QAAQjD,UADewZ,qBACfxZ;oBAElBA,YAAa+C,SAAUE,WAAWtR,OAAKkB,YAAYuiB,QAAQ3hB,SAIhEkP,SACE3C,SACA,SAAA0G;wBACE/U,OAAKqmB,OAAO;4BACVjV,OAAOA,QAFiC2D,MAAzC3D,aAE2B1R;4BAC1B4R,QAAQA,SAHgCyD,MAAxBzD,cAGa5R;;uBAGjC;wBAAE0R;wBAAOE;;;eA9MjB7S,OAmNEynB,eAAA;gBACE,IAAMpsB,OAAOC;gBAEb,OAAO;oBACL+tB,aADK,SACO9Z;wBAAyC,IAAAwN,SAAAzhB;wBACnD,OAAO4D,qBAAakC,IAAI;4BAAA,OACtB/F,KAAKisB,SAAS/X,OAAOwN,OAAKkC,aAAY;;;oBAI1CtD,OAPK;wBAQH,OAAOzc,qBAAakC,IAAI;4BAAA,OAAM/F,KAAK0tB;;;;eA9N3C/oB,OAmOE4nB,SAAA,SAAAnR;gBAOE,OAAOnb,KAAKsI,OAAOgkB,OAAOnO,cAAc;oBAAE9G,OADrB8D,MALrB9D;oBAMiDE,QAD5B4D,MAJrB5D;;eArOJ7S,OA6OE2b,QAAA;gBACE,OAAOrgB,KAAKsI,OAAO+X;eA9OvB3b,OAiPE+oB,UAAA;gBACE,OAAO7pB,qBAAakC,IAAI;oBACtBjD,OAAOwd;;eAnPb3b,OAuPE6b,QAAA;gBACE,OAAO3c,qBAAakC,IAAI;oBACtBjD,OAAO0d;;eAzPb7b,OA6PEe,UAAA,SAAQvC;gBAAgC,IAAA8qB,SAAAhuB;gBACtC,OAAO4D,qBAAakC,IAAI;oBACtB,IAAIkoB,OAAK1lB,UAAU0lB,OAAK1lB,OAAO7C,SAC7B,OAAOuoB,OAAK1lB,OAAO7C,QAAQvC;oBAE3B,MAAMA;;eAlQdgoB;SAAA,ICtCa+C,iBAAoD;QCoFjE,SAASC,oBAAoB1D,MAAmC7oB,KAAcN;YAC1E,OAAOuC,qBAAakC,IAAI;gBACpB,OAA+B,qBAApB0kB,KAAK2D,aACL3D,KAAK2D,WAAW;oBAAE9sB;qBACS,mBAApBmpB,KAAK2D,aACZ3D,KAAK2D,aAELxsB;;;QAMnB,SAASysB,cAAoB5D,MAAmC7oB,KAAcN;YAC1E,OAAOuC,qBAAakC,IAAI;gBACpB,OAA+B,qBAApB0kB,KAAK6D,cAA6B/b,UAAUjR,SAC5CmpB,KAAK6D,WAAW;oBAAEhtB;qBAElBA;;;QDpGnB4sB,eAAevE,QAAQ5hB,UAAU;YAC7BwmB,cAAa;YAEbC,WAH6B;gBAIzB,OAAO7F,eAAepT,WAAO;oBACzBQ,YAAY3T,SAAA;wBACRqsB,OAAOxuB,KAAKsqB,UAAU3pB;uBACnBX,KAAKsqB,UAAUxU,WAAWR;;;YAKzCyJ,MAZ6B,SAYxB0P;gBAA0E,IAAA3qB,QAAA9D;gBAC3E,KAAKyuB,YACD,MAAM,IAAI7pB,MAAJ;gBAGV,OAAO6pB,WAAWxtB,MAAMgC,KAAK,SAAA0G;oBACzB,OAAOyL,iBAAiBzL,OAAO1G,KAAK,SAAAiF;wBAEhC,IjDyyBqBoM,SAAuBzQ,SAGpDwP,UiD5yBcqb,gBjDyyBepa,UiDzyBqB3K,OjD0yBtD9F,UAAUiO,KAD8CjO,UiDzyBK;4BAAA,OAAMC,MAAKuc;4BjD8yBpErJ,gBAAgB1C,WAChBzQ,YAEAwP,WAAWjB,aAAa;4BAChB4E,gBAAgB1C,aAChBjB,SAASpM,UACTpD;2BAEL,KAGA;4BACHoD,QADG;gCAEKoM,YACAA,SAASpM;;;wBiDvzBT,OAJAnD,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAMgc,aAAaznB;4BACvCnD,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAMoE,eAAenN;4BACzC7F,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAM8V,cAActgB;4BAEjC0Z,oBAAc1Z;;;;YAKjC0mB,oBA9B6B;gBA+BzB,OAAOlG,eAAepT,WAAO;oBACzBQ,YAAY3T,SAAA;wBACRxB,MAAI,6BAA+BX,KAAKsqB,UAAU3pB,OAA9C,MAAwD6P,aAAxD;wBACJge,OAAK,gBAAiBxuB,KAAKsqB,UAAU3pB;uBAClCX,KAAKsqB,UAAUxU,WAAWR;;;YAKzCuZ,eAxC6B,SAwCfC,UAAwBC;gBAAmF,IAAAjqB,SAAA9E;gBACrH,KAAK+uB,qBACD,MAAM,IAAInqB,MAAJ;gBAGV,OAAOmqB,oBAAoB9tB,MAAMgC,KAAK,SAAA+rB;oBAGlC,OAFAlqB,OAAK6pB,MAAMjc,SAAS;wBAAA,OAAMoE,eAAekY;wBAElC5Z,iBAAiB4Z,gBAAgB/rB,KAAK,SAAAgsB;wBACzC,OAAO9lB,iBAAiB8lB;uBACzBhsB,KAAK,SAAAiF;wBACJ,OAAO0Z,oBAAc1Z;;;;YAKjCgnB,UAAU,EACN,qBACA,mBACA,aACA,sBACA,aACA,QACA;WAKJjB,eAAevE,QAAQ3hB,SAAS;YAC5BumB,cAAa;YAEbvP,MAH4B;gBAGO,IAAA1Z,SAAArF;gBAC/B,OAAO4D,qBAAakC,IAAI;oBAAM,IAAAqpB,wBACF9pB,OAAKilB,UAAU8E,YAAjC/X,QADoB8X,sBACpB9X,OAAOE,SADa4X,sBACb5X,QAKPrP,MjD+Sf,SAAe6F,KAAcwH;wBAAiD,IAK3E8B,SAFN9B,UAAUA,WAAW,IAEf8B,OAAOE,SAAWhC,QAAXgC,QAETrN,MAAM,GACNmlB,OAAO;wBAEPhY,UACIxU,OAAOysB,aACPD,OAAOlgB,KAAKogB,OAAO1sB,OAAOysB,aAAajY,SAAS,KAAKxU,OAAO2sB,UACrD3sB,OAAO4sB,OAAOpY,UACrBgY,OAAOlgB,KAAKogB,OAAO1sB,OAAO4sB,OAAOpY,QAAQA,SAAS;wBAItDE,WACI1U,OAAO6sB,cACPxlB,MAAMiF,KAAKogB,OAAO1sB,OAAO6sB,cAAcnY,UAAU,KAAK1U,OAAO8sB,UACtD9sB,OAAO4sB,OAAOlY,WACrBrN,MAAMiF,KAAKogB,OAAO1sB,OAAO4sB,OAAOlY,SAASA,UAAU;wBAiB3D,IAAI5W,QAbJ4U,UAAUpT,SAAA;4BACN+H;4BACAmlB;4BACAhY;4BACAE;4BACAqY,QAAY;4BACZC,SAAY;4BACZC,SAAY;4BACZC,WAAY;4BACZC,YAAY;2BACTza,UAGY5U,QAAQ;+BACpB4U,QAAQ5U;wBAGf,IAOIuH,KASIhF,KAhBJwQ,SAAS5S,OAAO8F,KAAK2O,SAAS1O,IAAI,SAAAlF;4BAElC,IAAI4T,QAAQ5T,MACR,OAAWA,MAAX,MAAoBgM,UAAU4H,QAAQ5T;2BAE3CuS,OAAO1G,SAASU,KAAK;wBAIxB;4BACIhG,MAAMrF,OAAOkc,KiDpWa,IjDoWHpe,MAAM+S,SAAQ;0BACvC,OAAOxQ;4BACL,MAAM,IAAI6R,eAAJ,kCAAmD7R,IAAImB,SAASnB,IAAI0H;;wBAG9E,IAAIH,eAAevC,MAEf,MADU,IAAI6M,eAAJ;wBAMd,OAFAlS,OAAOoS,iBAAiB,UAAU;4BAAA,OAAM/M,IAAImY;4BAErCnY;qBiDhXiB+nB,CAAM,GAAD9tB,SAAA;wBACbkV,OAJJA,QAAQ0B,mBAAmB1B,OAAOxU,OAAOysB;wBAKrC/X,QAJJA,SAASwB,mBAAmBxB,QAAQ1U,OAAOysB;uBAKpCjqB,OAAKilB,UAAUxU,WAAWma;oBAQjC,OALA5qB,OAAKspB,MAAMjc,SAAS;wBAChBxK,IAAImY,SACJmI,cAActgB;wBAGX0Z,oBAAc1Z;;;YAI7B2mB,eAzB4B,SAyBdC;gBACV,OAAOlrB,qBAAakC,IAAI;oBACpB,OAAOgpB;;;YAIfI,UAAU,EACN,qBACA,mBACA;;QEhDL,IAAMgB,yBAAb;YAgBI,SAAAA,gBAAY5F,WAA0BrW;gBAA2B,IAAAnQ,QAAA9D;gBAAAA,KAdjEsqB,iBAciE,GAAAtqB,KAbjEmwB,cAaiE,GAAAnwB,KAZjE2uB,aAYiE,GAAA3uB,KAXjE4W,aAWiE;gBAAA5W,KATjEowB,mBASiE,GAAApwB,KARjEqwB,qBAQiE,GAAArwB,KANjEiU,aAMiE,GAAAjU,KALjEswB,aAKiE;gBAAAtwB,KAJjEqJ,aAIiE,GAAArJ,KAFjE8uB,gBAEiE,GAC7D9uB,KAAKowB,cAAc,IAAIxsB;gBACvB5D,KAAKqwB,gBAAgB,IAGrBrwB,KAAKiU,QAAQ,IAEbjU,KAAK2uB,QAAQpc,QAAQvS,OACrBA,KAAKswB,QAAQ;gBAEbtwB,KAAKsqB,YAAYA,WAEjBtqB,KAAKuwB,YAAYtc,MAAMxO,UACvBzF,KAAKgsB,SAAS/X;gBACdjU,KAAKsqB,UAAUkG,wBAAwBxwB,OACvCA,KAAK2uB,MAAMjc,SAAS;oBAAA,OAAM5O,MAAKwmB,UAAUmG,uBAAuB3sB;oBAChE9D,KAAK0wB;;YAhCb,IAAAhsB,SAAAwrB,gBAAAvrB;YAAA,OAAAD,OAmCI6rB,cAAA,SAAY9qB;gBAA4B,IpDwcpCkrB,WACAxsB,UoDzcoCW,SAAA9E;gBACpCA,KAAK4W,SpDucL+Z,YAAY,IACZxsB,WAAW,IAER;oBAEH0a,IAFG,SAEA+R,WAAoB/sB;wBACnB,IAAIgtB,cAAc1sB,SAASysB,aAAazsB,SAASysB,cAAc;wBAE/DC,YAAY5rB,KAAKpB;wBAEjB,IAAIwkB,aAAY;wBAEhB,OAAO;4BACHphB,QADG;gCAEMohB,cACDA,aAAY,GACZwI,YAAY3pB,OAAO2pB,YAAY7rB,QAAQnB,UAAU;;;;oBAOjEiO,MApBG,SAoBE8e,WAAoB/sB;wBAErB,IAAI2hB,WAAWxlB,KAAK6e,GAAG+R,WAAW;4BAC9BpL,SAASve,UACTpD;;wBAGJ,OAAO2hB;;oBAGXsL,SA9BG,SA8BKF;wBAA0E,SAAAG,QAAAzuB,UAAAC,QAAnD6E,OAAmD,IAAAkG,MAAAyjB,QAAA,IAAAA,QAAA,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAAnD5pB,KAAmD4pB,QAAA,KAAA1uB,UAAA0uB;wBAE9E,IAAIH,cAAc1sB,SAASysB,YACvBtqB,WAAW;wBAEf,IAAIuqB,aAAa,SAAAvrB,QAAA,SAAAqO;4BACR,IAAI9P,UAAWgtB,YAAJld;4BACZrN,SAASrB,KAAKrB,qBAAakC,IAAI;gCAAA,OAAMjC,QAAOpB,WAAP,GAAW2E;;2BAFvCuM,MAAA,GAAAA,MACOkd,YADPtuB,QAAAoR,OACoBrO,MAAAqO;wBAKrC,OAAO/P,qBAAayC,IAAIC,UAAUrD,KAAK4O;;oBAG3Cof,aA5CG,SA4CSL;wBAER,IAAID,UAAUC,YACV,OAAOhtB,qBAAaH;wBAGxBktB,UAAUC,cAAa;wBAN2D,SAAAM,QAAA5uB,UAAAC,QAAnD6E,OAAmD,IAAAkG,MAAA4jB,QAAA,IAAAA,QAAA,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAAnD/pB,KAAmD+pB,QAAA,KAAA7uB,UAAA6uB;wBAOlF,OAAOnxB,KAAK8wB,QAALruB,MAAAzC,MAAA,EAAa4wB,YAAbtmB,OAA2BlD;;oBoD3ftCpH,KAAK4W,MAAMiI,GAAGiL,MAAMC,QAAU;oBAAA,OAAMjlB,OAAKmP,MAAMmd;oBAC/CpxB,KAAK4W,MAAMiI,GAAGiL,MAAMG,SAAU;oBAAA,OAAMnlB,OAAKmP,MAAMod;oBAC/CrxB,KAAK4W,MAAMiI,GAAGiL,MAAME,UAAU;oBAAA,OAAMllB,OAAKmP,MAAMqd;oBAC/CtxB,KAAK4W,MAAMiI,GAAGiL,MAAMI,OAAU;oBAAA,OAAMplB,OAAKmP,MAAMsd;oBAC/CvxB,KAAK4W,MAAMiI,GAAGiL,MAAMK,OAAU,SAAClW;oBAAD,OAAWnP,OAAKmP,MAAMsY,QAAQtY;oBAE5DjU,KAAK4W,MAAMiI,GAAGiL,MAAMrO,OAAO,SAAAvY;oBACvB,OAAI4B,OAAKmP,SAASnP,OAAKmP,MAAMxO,UAClBX,OAAKmP,MAAMxO,QAAQvC,OACnBuC,UACAA,QAAQvC,OAER4B,OAAKsrB,YAAY3rB,OAAOvB,KAAKD,KAAK;wBACrC8B,WAAW;4BACP,MAAM7B;2BACP;;;eArDvBwB,OA2DI8sB,SAAA,SAAOnvB,QAAgC+R,WAAkCjN;gBAAwD,IAAA9B,SAAArF;gBAC7H,OAAO4D,qBAAakC,IAAI;oBACpBT,OAAKilB,UAAUqB,IAAf,WAEAtmB,OAAK8qB,SAASlC,eAAe9mB;oBAC7B,IAAM+J,MAAUkY,OAAP,MAAiB/jB,OAAKilB,UAAU9U,MAAhC,MAAyChF,YAC5C3H,SAASxD,OAAKuD,aACd6oB,gBAAgBpsB,OAAKqsB;oBAE3BrsB,OAAKilB,UAAUqH,iBAAiBtvB,QAAQwG,QAAQuL,YAE5C/R,WAAWQ,UACXwC,OAAK6pB,SAAS/nB,SAAS9E;oBAG3B,IAAMmQ,QAAQ;oBAkEd,OAhEAA,MAAM0Z,OAAO7mB,OAAK+qB,aAClB5d,MAAMof,WAAWvsB,OAAKusB,YACtBpf,MAAM4e,WAAW/rB,OAAKuR,MAAMka,QAAQhH,MAAMC;oBAE1CvX,MAAMqf,oBAAoBxsB,OAAKwsB,kBAAkBzd,YAEjD5B,MAAM+b,YAAYlpB,OAAKkpB;oBACvB/b,MAAMoc,qBAAqBvpB,OAAKupB,sBAEhCpc,MAAMsf,kBAAkBluB,qBAAayC,IAAI,EAAEmM,MAAMqf,mBAAmBrf,MAAM+b,WAAW/b,MAAMoc,sBAAsB3rB,KAAK,SAAA2Z;wBAClH,OAAOvX,OAAKysB,gBAD+JlV,KAAA,IAC/H;4BAAEzV;4BAAS+J;4BAAKud,YAD+G7R,KAAA;4BACnGmS,qBADmGnS,KAAA;;wBAI/KpK,MAAMuM,OAAO1Z,OAAK8qB,OAAO7B,cACnBjpB,OAAK0Z,SACLvM,MAAM+b,UAAUtrB,KAAK,SAAAwrB;wBAAU,OAAIppB,OAAK0Z,KAAK0P;wBAEnDjc,MAAMqc,gBAAgBjrB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAMoc,sBAAsB3rB,KAAK,SAAAkU;wBAClF,OAAO9R,OAAKwpB,cAD6G1X,MAAA,IAAAA,MAAA;wBAI7H3E,MAAMuf,WAAWnuB,qBAAayC,IAAI,EAC9BmM,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAEZ,OADAzpB,OAAKypB,WAAWA,UACTzpB,OAAK2sB,YAAYlD;2BAIhCtc,MAAMyf,YAAYruB,qBAAayC,IAAI,EAAEmM,MAAMqc,eAAerc,MAAMuf,YAAY9uB,KAAK,SAAA4X;wBAC7E,OAAOxV,OAAK4sB,UAD4FpX,MAAA,IAC/D;4BAAE1T;4BAAS+J;;wBAGxDsB,MAAM0f,UAAUtuB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAMof,UAAUpf,MAAM2f,eAAe3f,MAAMyf,aAAahvB,KAAK,SAAA+X;wBACxG,OAD+HA,MAAA,GAC/GyF,YAD+GzF,MAAA;wBAInIxI,MAAM4f,kBAAkB5f,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBACpC,OAAOzpB,OAAK+sB,gBAAgB;4BAAEtD;4BAAU2C;4BAAe5oB;4BAAQxG;4BAAQ8E;4BAAS+J;;wBAGpFsB,MAAM2f,gBAAiBvuB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAM4f,mBAAmBnvB,KAAK,SAAAkY;wBAChF,OAD8GA,MAAA,GAC9FwF,QAD8FxF,MAAA;wBAIlH3I,MAAMyZ,gBAAgBzZ,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAClCzpB,OAAK4mB,cAAc6C;wBAGvBtc,MAAM6e,YAAYztB,qBAAayC,IAAI,EAAEmM,MAAMsf,iBAAiBtf,MAAMyf,aAAahvB,KAAK;wBAChF,OAAOoC,OAAKuR,MAAMka,QAAQhH,MAAMG;wBAGpCzX,MAAMmW,aAAanW,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAC/B,OAAOzpB,OAAKsjB,WAAWmG,UAAU2C,eAAetqB;wBAGpDqL,MAAM6f,aAAa7f,MAAM0f,QAAQjvB,KAAK;wBAClC,OAAOoC,OAAKgtB;wBAGhB7f,MAAM4e,WAAW5e,MAAM0Z,KAAKjpB,KAAK;wBAC7B,OAAOoC,OAAKuR,MAAMka,QAAQhH,MAAME;wBAG7BpmB,qBAAa+C,KAAK6L;mBAE1B9M,MAAM,SAAAxC;oBACL,OAAOU,qBAAayC,IAAI,EACpBhB,OAAKI,QAAQvC,MACbmC,OAAKooB,QAAQvqB,QACdD,KAAK;wBACJ,MAAMC;;mBAEXD,KAAK4O;eArJhBnN,OAwJImtB,oBAAA,SAAkBzd;gBACd,OAAOxQ,qBAAakC,IAAI;oBACpB,OAAO+O,aAAaT;mBACrBnR,KAAK,SAAAqvB;oBACJ,OAAO5J,eAAe4J;;eA5JlC5tB,OAgKI0tB,kBAAA,SAAAhX;gBAAoP,IAC1OmQ,eAAevrB,KAAKuyB,kBAAkB;oBAAEzD,UADkM1T,MAAlO0T;oBAC0C2C,eADwLrW,MAAxNqW;oBAC+C5oB,QADyKuS,MAAzMvS;oBACwCxG,QADiK+Y,MAAjM/Y;oBACwC8E,SADyJiU,MAApLjU;oBACoC+J,KADgJkK,MAAzLlK;;gBAEvD,cAAakY,OAAb,OAAwBppB,KAAKsqB,UAAU3pB,OAAvC,OAAkDwP,aAAazC,KAAKC,UAAU4d,iBAA9E;eAlKR7mB,OAqKI8tB,cAAA,SAAY1D,UAAwB2C,eAAwB5oB,QAA0BqI;gBAClF,IAAM7P,QAAQshB,uBAAiBmM,UAAUjmB,QAAQ7I,KAAKyyB,iBAAiB5pB,UAEjE6pB,UAAWjB,kBAAkB7oB,oBAC7B;oBAAE4T,MNjOP;oBMiOgCtL;oBAC3B;oBAAEsL,MNnOP;oBMmOgCnb;;gBAEjC,INpOC,UMoOGqxB,QAAQlW,MAA4B;oBACpC,IAAMnC,SAASV,qBAAU9W;oBACzBwX,OAAOpG,QAAQoG,OAAOpG,SAAS,IAC/BoG,OAAOpG,MAAM/C,OAAO7P,OAEpBrB,KAAK2uB,MAAMjc,SAAS;+BACT2H,OAAOpG,MAAM/C;;;gBAI5B,OAAOwhB;eAtLfhuB,OAyLI6tB,oBAAA,SAAArb;gBAA0Q,IAAAyb,aAAA,MAAAzb,QAAnB,KAAmBA,OAAtP4X,WAAsP6D,MAAtP7D,UAAU2C,gBAA4OkB,MAA5OlB,eAAe5oB,SAA6N8pB,MAA7N9pB,QAA6N+pB,eAAAD,MAArNtwB,sBAAqN,MAAAuwB,eAA5M/vB,SAA4M+vB,cAApMzrB,UAAoMwrB,MAApMxrB,SAAS+J,MAA2LyhB,MAA3LzhB;gBAC3E,OAAO;oBACHA;oBACA/J;oBACAskB,SAASD;oBACT3iB,QAASD,gBAAU/F;oBACnB2S,KAASxV,KAAKsqB,UAAU9U;oBACxBlN,QAAStI,KAAK6yB,aAAaxwB,QAAQovB,eAAevgB,KAAK/J;oBACvD8M,OAASjU,KAAKwyB,YAAY1D,UAAU2C,eAAe5oB,QAAQqI;oBAC3DvR,SAASgjB,uBAAiBmM,UAAUjmB,QAAQ7I,KAAK8yB,mBAAmBhE;;eAlMhFpqB,OAsMIstB,cAAA,SAAYlD;gBAA6C,IAAA7oB,SAAAjG;gBACrD,OAAO4D,qBAAakC,IAAI;oBACpBG,OAAK6oB,WAAWA;;eAxM5BpqB,OA4MI2nB,aAAA;gBAAgC,IAAA5K,SAAAzhB;gBAC5B,OAAO;oBACHswB,OAAatwB,KAAKswB;oBAClB1Z,OAAa5W,KAAK4W;oBAClByJ,OAAa;wBAAA,OAAMoB,OAAKpB;;oBACxBE,OAAa;wBAAA,OAAMkB,OAAKlB;;oBACxB+L,QAAa,SAAAxI;wBAAA,OAAuBrC,OAAK6K,OAAO;4BAAEjV,OAArCyM,MAAGzM;4BAAyCE,QAA5CuM,MAAUvM;;;oBACvB9R,SAAa,SAACvC;wBAAD,OAASue,OAAKhc,QAAQvC;;oBACnC6qB,aAAa,SAAC9Z;wBAAD,OAAWwN,OAAKsM,YAAY9Z;;;eApNrDvP,OAwNIsnB,WAAA,SAAS/X,OAA2B+Y;qBAA4B,MAA5BA,yBAAqB,IACjDhtB,KAAKsqB,UAAUyI,YACf/yB,KAAKsqB,UAAUyI,SAAS;oBAAE9e;;gBAG9B,IAAMsW,UAAUvqB,KAAKqsB;iBD1RtB,SAAwB/B,WAA0BrW,OAAsB+e,YAAgCzI,SAA4ByC;yBAA4B,MAA5BA,yBAAqB,IAI5J7a,OAAO8B,OADP+e,aAAaA,cAAc;oBAHwI,KAMnK,IAAMC,YAAYjG,WAAW,KAAH,GAAA1iB,OAAaggB,UAAU+C,iBANkH1Z,MAAA,GAAAqC,gBASjJlV,OAAO8F,KAAKosB,aATqIrf,MAAAqC,cAAAzT,QAAAoR,OASxH;wBAAtC,IAAMhS,MAAGqU,cAAArC;yBACsB,MAA5Bsf,UAAUjuB,QAAQrD,QAClBsxB,UAAUhuB,KAAKtD;;oBAX4I,KAenK,IAAMuxB,UAAU,IAER5C,QAAiC/F,QAAjC+F,OAAOjQ,QAA0BkK,QAA1BlK,OAAOE,QAAmBgK,QAAnBhK,OAAO9a,UAAY8kB,QAAZ9kB,SAjBsIyf,MAAA,GAAAA,MAmBjJ+N,UAnBiJ1wB,QAAA2iB,OAmBtI;wBAAxB,IAAMvjB,OAAOsxB,UAAJ/N,MACJiO,UAAU7I,UAAUG,kBAAkB9oB,OAExCN,QAAQ2xB,WAAWrxB;wBAEvB,IAAKwxB,SAAL;4BAIA,IAAMhG,QAAQgG,QAAQhG;4BAgBtB,IAfIA,WACK7a,UAAUjR,UAAUiR,UAAU0gB,WAAW7F,YAC1C9rB,QAAQ2xB,WAAW7F;4BAEvB+F,QAAQjuB,KAAKkoB,SAGbgG,QAAQ9xB,UACRA,QAAQ8xB,QAAQ9xB,MAAM;gCAAE4S;gCAAOqc;gCAAOjQ;gCAAOE;gCAAO9a;kCAGnD6M,UAAUjR,UAAU8xB,QAAQC,YAC7B/xB,QAAQ8xB,QAAQC,QAAQ;gCAAEnf;gCAAOqc;gCAAOjQ;gCAAOE;gCAAO9a;iCAGtD6M,UAAUjR,WACW,YAAjB8xB,QAAQ3W,QAAoBlP,MAAMC,QAAQlM,gBAAiBA,UAAU8xB,QAAQ3W,OAC7E,MAAM,IAAIpW,UAAJ,yBAAsC+sB,QAAQ3W,OAA9C,OAAyD7a;4BAKvEsS,MAAMtS,QAAON;;;oBAnDkJ,SAAA0U,MAAA,GAAAA,MAsD/Imd,QAtD+I3wB,QAAAwT,cAwDxJ9B,MAFSif,QAAJnd;oBAtDmJ,SAAAwQ,MAAA,GAAA8M,gBA4DjJvyB,OAAO8F,KAAKqN,QA5DqIsS,MAAA8M,cAAA9wB,QAAAgkB,OA4D7H;wBAAjC,IAAM5kB,QAAG0xB,cAAA9M,MACJ4M,WAAU7I,UAAUG,kBAAkB9oB,QAEtCN,SAAQ4S,MAAMtS;wBAEfwxB,aAID7gB,UAAUjR,WAAU8xB,SAAQJ,YAE5BI,SAAQJ,SAAS;4BAAE1xB;4BAAO4S;4BAG1B3B,UAAUjR,WAAU8xB,SAAQG,aAE5Brf,MAAMtS,SAAOwxB,SAAQG,SAAS;4BAAEjyB;4BAAO4S;4BAAOqc;4BAAOjQ;4BAAOE;4BAAO9a;;;oBA5EwF,SAAAghB,OAAA,GAAA2G,yBAgFjJ9C,UAAU+C,gBAhFuI5G,OAAA2G,uBAAA7qB,QAAAkkB,QAgFvH;wBAAvC,IAAM9kB,QAAGyrB,uBAAA3G;wBAEV,KAAyB,MADT6D,UAAUG,kBAAkB9oB,OAChC4xB,aAAuBjhB,UAAU2B,MAAMtS,SAC/C,MAAM,IAAIiD,MAAJ,oBAA6BjD,QAA7B;;iBCwMV6xB,CAAYxzB,KAAKsqB,WAAWtqB,KAAKiU,OAAOA,OAAOsW,SAASyC;eA9NhEtoB,OAiOIktB,WAAA;gBAAkC,ID9KN6B,UAA0Cxf,OAEhEP,QC4K4Bsa,SAAAhuB;gBAC9B,QD/KwByzB,WC+KJtxB,SAAA,IAAKnC,KAAKsqB,UAAUrW,OAAUjU,KAAKsqB,UAAUoJ;gBD/KCzf,QC+KejU,KAAKiU,OD7KpFP,SAAS,IAGR9P,qBAAayC,IAAIvF,OAAO8F,KAAKqN,OAAOpN,IAAI,SAAAlF;oBAE3C,IAAM6oB,OAAOiJ,SAAS9xB;oBAEtB,IAAK6oB,MAIL,OAAO5mB,qBAAaH,UAAUR,KAAK;wBAE/B,IAAM5B,QAAQ4S,MAAMtS;wBAEpB,IAAKN,SAIAmpB,KAAK2D,YAIV,OAAO9sB;uBAER4B,KAAK,SAAA5B;wBAEJ,IAAIA,eAIJ,OAAOuC,qBAAayC,IAAI,EAEpB6nB,oBAAc1D,MAAM7oB,KAAKN,QAEzB+sB,cAAc5D,MAAM7oB,GAAKN,UAC1B4B,KAAK,SAAA2Z;4BAAgC,IAEhCtY,QAFG6pB,aAA6BvR,KAAA,IAAjByR,aAAiBzR,KAAA;4BAIpC,IAA0B,oBAAfyR,YACP/pB,SAAS+pB,WAAWrrB,iBACjB,IAA0B,mBAAfqrB,YACd/pB,SAAS+pB,WAAWrrB,iBACjB,IAA0B,mBAAfqrB,cAA0C,SAAfA;gCAEzC,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmB7b,MAC1CpJ,SAASoJ,KAAKC,UAAU0gB,kBACrB,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmBE,QACjDnlB,SAAS+L,KAAK3C,KAAKC,UAAU0gB,mBAC1B,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmBC,WAAWgB,KAAKmJ,eAAe;oCAChFrvB,SnDqUjB,SAASsvB,OAAOnlB,KAAcolB,QAAsBC;wCAEvD,KAAK,IAAInyB,YAF4F,MAApEkyB,oBAAkB,UAAkD,MAA9CC,oBAAkB;wCACzED,SAASA,SAAaA,SAAP,MAAoBA,QACnBplB,KACPA,IAAIzM,eAAeL,QAApB,QAA4B8M,IAAI9M,QAA+D,qBAAb8M,IAAI9M,SAE/E8M,IAAI9M,QAAQ2L,MAAMC,QAAQkB,IAAI9M,SAAS8M,IAAI9M,KAAKY,UAAUkM,IAAI9M,KAAKoyB,MAAM,SAAA9iB;4CAAG,OAAmB,mBAARA;6CAC9F6iB,OAAM,KAAKD,SAAWlyB,MAAhB,QAA4B8M,IAAI9M,KAAKuM,KAAK,OACzCO,IAAI9M,QAA4B,mBAAb8M,IAAI9M,OAC9BmyB,SAASF,OAAOnlB,IAAI9M,MAAL,KAAekyB,SAAWlyB,KAAQmyB,UAEjDA,OAAM,KAAKD,SAAWlyB,OAA6B8M,IAAI9M,KA3BlDqB;wCA8Bb,OAAO8wB;qCmDlVsBF,CAAOvF,YAAY1sB;oCADoD,SAAA+kB,OAAA,GAAAsN,gBAG3DlzB,OAAO8F,KAAKtC,SAH+CoiB,OAAAsN,cAAAzxB,QAAAmkB,QAGtC;wCAArC,IAAMuN,SAAMD,cAAAtN;wCACbhT,OAAOugB,UAAU3vB,OAAO2vB;;oCAG5B;;mCAGyB,mBAAf5F,eACd/pB,SAAS+pB,WAAWrrB;4BAGxB0Q,OAAOya,cAAc7pB;;;oBAI7BrB,KAAK;oBACL,OAAOyQ;oBCwGsFzQ,KAAK,SAAAixB;oBAC9F,OnD9KL,SAAmBnmB,KAAcwH;6BAA2F,MAA3FA,sBAA8E;wBAElH,IAGI4e,aAEAC,cALAF,QAAQ3e,QAAQ2e,SAAS,IACzBvtB,OAAO4O,QAAQ5O,QAAQ,IAHoG0tB,aAS/FtmB,IAAIC,MAAM;wBAA3BomB,eATgHC,WAAA;wBAAA,IAAAC,sBAS7HH,cAT6HE,WAAA,IAUlFrmB,MAAM;wBAAjDmmB,cAV6HG,mBAAA;wBAY/H,IAAI7gB,cAAcM,YAZ6GugB,mBAAA,IAYlFJ,QACzCK,aAAaxgB,YAAYqgB,cAAcztB;wBAU3C,OARI8M,gBACA0gB,cAAkBA,cAAP,MAAwB1gB,cAGnC8gB,eACAJ,cAAkBA,cAAP,MAAwBI;wBAGhCJ;qBmDuJQK,CAAU9lB,iBAAiBsf,OAAK1D,UAAUmK,OAAOzG,OAAK/Z,SAAS;wBAAEigB;;;eAnOpFxvB,OAuOIkE,YAAA;gBACI,OAAO5I,KAAKsqB,UAAU1hB,UAAU5I,KAAKiU;eAxO7CvP,OA2OIgtB,mBAAA;gBACI,OAAO1xB,KAAKsqB,UAAUoH,iBAAiB1xB,KAAKiU;eA5OpDvP,OA+OI+tB,mBAAA,SAAiB5pB;gBAA2C,KACxD,IAAMvE,SAAS,IADyCqP,MAAA,GAAAqC,gBAGtClV,OAAO8F,KAAK5G,KAAKiU,QAHqBN,MAAAqC,cAAAzT,QAAAoR,OAGb;oBAAtC,IAAMhS,MAAGqU,cAAArC,MACJ6W,OAAOxqB,KAAKsqB,UAAUG,kBAAkB9oB;oBAE1C6oB,SAA6B,MAArBA,KAAKkK,eAIblK,QAAQA,KAAK0C,eAAe/f,YAAYtE,QAAQD,gBAAU/F,aAK9DyB,OAAO3C,OAAO3B,KAAKiU,MAAMtS;;gBAI7B,OAAO2C;eAlQfI,OAqQIqpB,cAAA,SAAY9Z;gBAAgD,IAAA0gB,SAAA30B;gBAGxD,OAFAA,KAAKgsB,SAAS/X,QAAO,IAEdjU,KAAKowB,YAAYntB,KAAK;oBACzB,IAAI0xB,OAAKtrB,OACL,OAAOsrB,OAAKtrB,MAAM0kB,YAAY4G,OAAKlC,iBAAiBkC,OAAK/rB,cAAclD,MAAM,SAAAxC;wBACzE,IAAKyxB,OAAKtrB,SAAUsrB,OAAK7F,UAIzB,OAAO6F,OAAKnH,WAAWmH,OAAK7F,UAAU7rB,KAAK;4BACvC,IAAI0xB,OAAKtrB,OACL,MAAMnG;;;;eAjRlCwB,OAyRI6pB,YAAA;gBAA4D,IAAAqG,SAAA50B;gBACxD,OAAO4D,qBAAakC,IAAI;oBACpB,IAAI8uB,OAAKzE,OAAO5B,WACZ,OAAOqG,OAAKzE,OAAO5B,UAAUhuB,KAAKq0B;;eA5RlDlwB,OAiSIkqB,qBAAA;gBAAqE,IAAAiG,SAAA70B;gBACjE,OAAO4D,qBAAakC,IAAI;oBACpB,IAAI+uB,OAAK1E,OAAOvB,oBACZ,OAAOiG,OAAK1E,OAAOvB,mBAAmBruB,KAAKs0B;;eApS3DnwB,OAySIqa,OAAA,SAAK0P;gBAA0E,IAAAqG,UAAA90B;gBAC3E,OAAO4D,qBAAakC,IAAI;oBACpBgvB,QAAKxK,UAAUqB,IAAf;oBAEA,IAAMoJ,aAAaD,QAAK7gB,MAAMpR;oBAE9B,OAAIkyB,cACAD,QAAKnG,MAAMjc,SAAS;wBAAA,OAAMqiB,WAAW1U;wBAC9BuB,oBAAcmT,eAGlBD,QAAK3E,OAAOpR,KAAKxe,KAAKu0B,SAAMrG;mBAEpCxrB,KAAK,SAAA6rB;oBAEJ,OADAgG,QAAKhG,WAAWA,UACTA;;eAxTnBpqB,OA4TImqB,gBAAA,SAAcC,UAAwBC;gBAAmF,IAAAiG,UAAAh1B;gBACrH,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOkvB,QAAK7E,OAAOtB,cAActuB,KAAKy0B,SAAMlG,UAAUC;;eA9TlErqB,OAkUI6b,QAAA;gBAA6B,IAAA0U,UAAAj1B;gBACzB,OAAO4D,qBAAakC,IAAI;oBACpB,IAAImvB,QAAKnG,UACL,OAAOmG,QAAKnG,SAASvO,QAAQtd,KAAK4O;;eArUlDnN,OA0UIwqB,WAAA,SAAS/nB,SAAmC9E;gBAAgC,IAAA6yB,UAAAl1B;gBACxEA,KAAKsqB,UAAUqB,IAAf;gBADwE,KAGxE,IAAM1X,QAAQ,IAH0DiR,MAAA,GAAAiQ,yBAIjDn1B,KAAKsqB,UAAU+C,gBAJkCnI,MAAAiQ,uBAAA5yB,QAAA2iB,OAIlB;oBAAjD,IAAMkQ,WAAQD,uBAAAjQ;oBACXllB,KAAKsqB,UAAUG,kBAAkB2K,UAAUC,kBAC3CphB,MAAMmhB,YAAYp1B,KAAKiU,MAAMmhB;;gBANmC,KAUxE,IAAME,mBAAmBxa,UAAKzY,QAAYgnB,wBAAb,MAAwCrpB,KAAKsqB,UAAU3pB,MAAS;oBACzFwG;oBACA8M;oBACAshB,WAAW;wBACP3e,OAAS5W,KAAK4W;wBACdyJ,OAAS;4BAAA,OAAM6U,QAAK7U;;wBACpB5a,SAAS,SAACvC;4BAAD,OAASgyB,QAAKzvB,QAAQvC;;;mBAGpCD,KAAK,SAAAuyB;oBAAc,IAAXva,OAAWua,MAAXva;oBAEP,OADAia,QAAKvG,MAAMjc,SAASuI,KAAKwS,UAClBxS,KAAKsa;mBAEb7vB,MAAM,SAAAxC;oBACL,MAAM,IAAI0B,MAAJ,iGAA0GoN,eAAe9O;oBAxB3DoC,QAAA,SAAAyQ,KAAA0f;oBA2BnE,IAAM9zB,MAAG8zB,uBAAA1f;oBAEVmf,QAAKvzB,OAAO;wBAAoD,IAAA+zB,UAAA11B,MAAA0jB,aAAAphB;wBAC5D,OAAOgzB,iBAAiBryB,KAAK,SAAAsyB;4BACzB,OAAOA,UAAU5zB,KAAKc,MAAMizB,SAAMpzB;;;mBA/B0ByT,MAAA,GAAA0f,yBA2BtDz1B,KAAKmwB,OAAOjB,UA3B0CnZ,MAAA0f,uBAAAlzB,QAAAwT,OA2BhCzQ,MAAAyQ,KAAA0f;eArWhD/wB,OA+WImuB,eAAA,SAAaxwB,QAAgCwG,QAAiBqI,KAAc/J;gBAExE,IAAI0B,WAAWD,gBAAU/F,SAAS;oBAC9B,IAAMwX,SAASV,qBAAU9W;oBAOzB,OANAwX,OAAOyS,UAAUzS,OAAOyS,WAAW,IACnCzS,OAAOyS,QAAQ5b,OAAOrO,QACtB7C,KAAK2uB,MAAMjc,SAAS;+BACT2H,OAAOyS,QAAQ5b;wBAGnB;wBAAEsL,MN1aX;wBM0a2CtL;;;gBAG7C,OAAI/J,YAAYuiB,QAAQ3hB,QACb;oBAAEyU,MNjbX;oBMobK;oBAAEA,MNlbP;oBMkbuC/P,UAAUD,mBAAmB3J;;eAhY9E6B,OAmYIunB,gBAAA,SAAc6C;gBAA6C,IAAA6G,UAAA31B,MACnDqoB,aAAY;gBAMhB,OAJAroB,KAAK2uB,MAAMjc,SAAS;oBAChB2V,aAAY;oBAGTzkB,qBAAayD,MAAM,KAAMpE,KAAK;oBACjC,OAAO6rB,SAAStO;mBACjBvd,KAAK,SAAAud;oBACJ,OAAIA,YACAmV,QAAKrL,UAAUqB,IAAf,uBACOgK,QAAKtV,WACJgI,iBAAL,IACIsN,QAAK1J,cAAc6C;;eAjZ1CpqB,OAsZIgsB,iBAAA;gBAAiB,IAAAkF,UAAA51B,MACP61B,uBAAuB5gB,iBAAiBpS,QAAQ,UAAUiP,KAAK;oBACjE8jB,QAAKtL,UAAUqB,IAAf,kBACAiK,QAAKnI,QAAQ,IAAI7oB,MAAJ;;gBAGjB5E,KAAK2uB,MAAMjc,SAASmjB,qBAAqB5uB;eA5ZjDvC,OA+ZI2tB,aAAA;gBAAkC,IAAAyD,UAAA91B;gBAC9B,OAAO4D,qBAAakC,IAAI;oBACpB,IAAMC,UAAU+vB,QAAK7hB,MAAMlO;oBAE3B,IAAIA,SACA,OAAO+vB,QAAK1F,YAAYrqB,QAAQA,SAAS,IAAInB,MAAJ,uCAAgDmB,UAAhD;;eApazDrB,OAyaIqxB,YAAA,SAAU1sB;gBAAkD,IAAA2sB,UAAAh2B;gBACxD,OAAO4D,qBAAakC,IAAI;oBACpBkwB,QAAKrH,MAAMlf,IAAI,SAASpG,QACxB2sB,QAAK5F,YAAY3sB;;eA5a7BiB,OAgbIouB,qBAAA,SAAmB5qB;gBAA0C,IAAA+tB,UAAAj2B,MACnDyF,UAAa,SAACvC;oBAAD,OAAS+yB,QAAKxwB,QAAQvC;mBACnCgpB,OAAa,SAAC7iB;oBAAD,OAAW4sB,QAAKF,UAAU1sB;;gBAO7C,OAFA6iB,KAAKzmB,UAAUA,SAER;oBAAEymB;oBAAM7L,OANI;wBAAA,OAAM4V,QAAK5V;;oBAMRmN,YALH;wBAAA,OAAMyI,QAAKzI,WAAWtlB;;oBAKPokB,QAJf,SAAA4J;wBAAA,OAAuBD,QAAK3J,OAAO;4BAAEjV,OAArC6e,OAAG7e;4BAAyCE,QAA5C2e,OAAU3e;;;oBAIa9R;;eAzblDf,OA4bI4nB,SAAA,SAAA6J;gBAAyF,IAAAC,UAAAp2B,MAAhFqX,QAAgF8e,OAAhF9e,OAAOE,SAAyE4e,OAAzE5e;gBACZ,OAAO3T,qBAAakC,IAAI;oBACpBswB,QAAKxf,MAAMka,QAAQhH,MAAMM,QAAQ;wBAAE/S;wBAAOE;;;eA9btD7S,OAkcI8oB,aAAA,SAAWtlB;gBAAwC,IAAAmuB,UAAAr2B;gBAC/C,OAAOkI,IAAIsY,WAAWvd,KAAK,SAAA0H;oBACvB,OAAIA,SACO0rB,QAAKhW,UAGTzc,qBAAayD,MAAM,KACrBpE,KAAK;wBAAA,OAAMiF,IAAIsY;uBACfvd,KAAK,SAAAqzB;wBACF,IAAIA,cACA,OAAOD,QAAKhW;;;eA5cpC3b,OAkdI2b,QAAA;gBAA6B,IAAAkW,UAAAv2B;gBACzB,OAAO4D,qBAAakC,IAAI;oBAEpB,OADAywB,QAAKjM,UAAUqB,IAAf,UACO4K,QAAK3f,MAAMka,QAAQhH,MAAMI;mBAEjCjnB,KAAK;oBAKJ,OAJIszB,QAAKltB,SACLktB,QAAKltB,MAAMgX,MAAMlC,gBAAgBzY,MAAMmM;oBAGpC0kB,QAAK9I,QAAQ,IAAI7oB,MAAJ,mBAA4B;;eA5d5DF,OAgeIutB,YAAA,SAAUuE,mBAAVC;gBAAwI,IAAAC,UAAA12B,MAA3FmH,UAA2FsvB,OAA3FtvB,SAAS+J,MAAkFulB,OAAlFvlB;gBAClD,OAAOtN,qBAAakC,IAAI;oBACpB,IAAM6wB,oBAAoBD,QAAKpM,UAAUqM;oBAEzC,IAAKA,mBAAL;wBAIA,IAAIC,kBAAkBJ,kBAAkBlV;wBAExC,IAAKsV,mBAAoB7tB,aAAa6tB,oBvDrc3C,SAAuB1uB;4BAC1B;gCAEI,KAAKA,IAAIC,SAASuY,MACd,QAAO;gCAGX,IAA0B,kBAAtBxY,IAAIC,SAASuY,MACb,QAAO;8BAEb,OAAOxd;4BAIT,QAAO;yBuDub4D2zB,CAAcD,kBAAzE;4BAMA,IAAMzrB,OAFNyrB,kBAAkBztB,iBAAiBytB,kBAEP5jB,UACtB8B,KAAK4hB,QAAKI,eAAeH,mBAAmB;gCAAExvB;gCAAS+J;gCAAK/F;;4BAElE,IAAK2J,IAAL;gCAIA,IAAIA,GAAG1J,kBAAkBD,KACrB,MAAM,IAAIvG,MAAJ;iCnD9Ff,SAA8BsD,KAA4B4M;oCAE7D,IAAIU,MAAMV,GAAGiiB,QAAQjmB;oCAErB,IAAY,WAAR0E,KACA,MAAM,IAAI5Q,MAAJ,sCAA+C4Q;oCAKzD,KAFA,IAAInK,kBAAkBnD,IAAI8K,SAAS3H,iBAE5BA,gBAAgB2rB,YAAY3rB,gBAAgB2rB,SAASz0B,UACxD8I,gBAAgB0L,YAAY1L,gBAAgB2rB,SAAS;oCAGzD,MAAOliB,GAAGkiB,SAASz0B,UACf8I,gBAAgB8I,YAAYW,GAAGkiB,SAAS;iCmDkFpCC,CAAqBL,iBAAiB9hB;gCA1BZ,IAAAoiB,SA4BgCR,QAAKpM,UAAUgB,cAAc,IA5B7D6L,eAAAD,OA4BpB7f,oBA5BoB,MAAA8f,8BAAAC,gBAAAF,OA4BL3f,sBA5BK,MAAA6f,gCAAAC,iBAAAH,OA4BW5iB,wBA5BX,MAAA+iB,iBA4BqB,SA5BrBA;iCA6B1B/iB,UAAUI,eAAeJ,SAASnJ,UAElBkM,SAASE,WACrBN,SAAS3C,SAAS,SAAAgjB;oCACdZ,QAAKpK,OAAO;wCACRjV,OAAQA,QAF8CigB,OAAzCjgB,aAEc1R;wCAC3B4R,QAAQA,SAH8C+f,OAAxB/f,cAGD5R;;mCAElC;oCAAE0R;oCAAOE;oCAAQrP,KAAK0uB;;;;;;eAtgBzClyB,OA2gBIoyB,iBAAA,SAAeS,UAAfC;gBAA6S,IAAAC,UAAAz3B;gBAEzS,OAAOu3B,SAASh3B,KAAKP,MAAM;oBACvBoU,WAHqSojB,OAA3NpjB;oBAI1EjN,SAJqSqwB,OAAzOrwB;oBAK5D+J,KALqSsmB,OAAhOtmB;oBAMrE/F,KANqSqsB,OAAhNrsB;oBAOrFxB,OAPqS6tB,OAA3M7tB;oBAQ1FqlB,gBARqSwI,OAApMxI;oBASjGzO,OAAY;wBAAA,OAAMkX,QAAKlX;;oBACvBF,OAAY;wBAAA,OAAMoX,QAAKpX;;oBACvBiQ,OAAYtwB,KAAKswB;oBACjBrc,OAAYjU,KAAKiU;oBACjBuB,KAAYxV,KAAKsqB,UAAU9U;oBAC3B4Z,YAAYpvB,KAAKsqB,UAAU8E;oBAC3BxY,OAAY5W,KAAK4W;;eA1hB7BlS,OA8hBIotB,kBAAA,SAAgB4F,gBAAhBC;gBAAmT,IAAAC,UAAA53B,MAAtPyuB,aAAsPkJ,OAAtPlJ,YAAYM,sBAA0O4I,OAA1O5I,qBAAqB5nB,UAAqNwwB,OAArNxwB,SAAS+J,MAA4MymB,OAA5MzmB;gBACnG,OAAOtN,qBAAayC,IAAI,EACpBqxB,eAAez2B,MAAMgC,KAAK4R,eAE1B4Z,aAAaA,WAAWxtB,QAAQ,MAEhC8tB,sBAAsBA,oBAAoB9tB,QAAQ,QACnDgC,KAAK,SAAA40B;oBAA0C,IAAvCzjB,YAAuCyjB,OAAA,IACxCC,iBAAiBF,QAAKd,eAAec,QAAKtN,UAAUyN,mBAAmB;wBAAE5wB;wBAAS+J;wBAAKkD;wBAAWzK,OAD1DkuB,OAAA;wBACiE7I,gBADjE6I,OAAA;wBACiF1sB,KAAK6H;;oBACpI,IAAI8kB,gBAGA,OAFA3jB,YAAYC,WAAW0jB,iBACvBF,QAAKjJ,MAAMjc,SAAS;wBAAA,OAAMoE,eAAeghB;wBAClCpP,eAAeoP;;eA1iBtCpzB,OA+iBI+oB,UAAA,SAAQvqB,KAAc4tB;gBAAgD,IAAAkH,UAAAh4B;gBAClE,YADkE,MAAhD8wB,uBAAqB,IAChCltB,qBAAakC,IAAI;oBAMpB,OALK5C,QACD4tB,WAAU,GACV5tB,MAAM,IAAI0B,MAAM,yBAEpBozB,QAAK1N,UAAUqB,IAAf;oBACOqM,QAAKvyB,QAAQvC,KAAK4tB;mBAC1B7tB,KAAK;oBACJ,OAAO+0B,QAAKrJ,MAAMtoB;;eAxjB9B3B,OA4jBIe,UAAA,SAAQvC,KAAa4tB;gBAAgD,IAAAmH,UAAAj4B;gBACjE,YADiE,MAAhD8wB,uBAAqB,IAC/BltB,qBAAakC,IAAI;oBACpB,KAAyC,MAArCmyB,QAAK5H,cAAcrrB,QAAQ9B,MAO/B,OAHA+0B,QAAK5H,cAAcprB,KAAK/B;oBACxB+0B,QAAK7H,YAAYhrB,YAAYlC,MAEzB4tB,UACOmH,QAAKrhB,MAAMka,QAAQhH,MAAMrO,OAAOvY,YAD3C;;eArkBZwB,OA2kBIikB,aAAA,SAAWmG,UAAwBjmB,QAAiB1B;gBAA2E,IAAA+wB,UAAAl4B;gBAEvH,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOgpB,SAASvN;mBAEjBte,KAAK,SAAAiF;oBACJ,IAAKgX,cAAWA,WAAO3B,YAAY;wBAAErV;wBAAKW;2BAAaqW,WAAO+J,UAAUpgB,QAAQA,SAAhF;wBAIA,IAAMsvB,YAAYD,QAAK5N,UAAU8N;wBAEjC,KAAKD,WACD,MAAM,IAAIvzB,MAAJ,6BAAsCuC;wBAGhD,IAAMkxB,eAAevqB,iBAAiBqqB;wBAEtC,OADAjZ,WAAO8J,QAAQ9gB,KAAKW,SACbqW,WAAOyJ,WAAWja,iBAAiBypB,YAAYE;;;eA7lBtEnI;SAAA,IC9CaoI,6BAAb;YAiBI,SAAAA,kBAAYhO,WAA0B9nB,QAAgC+S;gBAA+B,IAAAzR,QAAA9D;gBAAAA,KAfrGsqB,iBAeqG,GAAAtqB,KAdrGwC,cAcqG,GAAAxC,KAbrGmH,eAaqG,GAAAnH,KAZrGmwB,cAYqG;gBAAAnwB,KAXrGiU,aAWqG,GAAAjU,KAVrG2uB,aAUqG,GAAA3uB,KARrGugB,aAQqG,GAAAvgB,KAPrGssB,cAOqG;gBAAAtsB,KANrG82B,sBAMqG,GAAA92B,KAJrGqgB,aAIqG,GAAArgB,KAHrGyF,eAGqG,GAAAzF,KAFrG4W,aAEqG;gBACjG5W,KAAKsqB,YAAYA,WACjBtqB,KAAKmH,UAAUoO,QAAQpO,SACvBnH,KAAKmwB,SAASlC,eAAe1Y,QAAQpO;gBACrCnH,KAAK2uB,QAAQpc,QAAQvS,OAErBA,KAAKugB,QAAQ2P,uBAAgBvrB,UAAU4b;gBACvCvgB,KAAKssB,SAAS4D,uBAAgBvrB,UAAU2nB,QACxCtsB,KAAK82B,iBAAiB5G,uBAAgBvrB,UAAUmyB;gBAGhD92B,KAAKiU,QAAQ;gBAXoF,SAAAN,MAAA,GAAAqC,gBAY1ElV,OAAO8F,KAAK2O,QAAQtB,QAZsDN,MAAAqC,cAAAzT,QAAAoR,OAY9C;oBAA9C,IAAMyhB,WAAQpf,cAAArC,MACTwf,UAAUnzB,KAAKsqB,UAAUG,kBAAkB2K;oBAC7CjC,WAAWA,QAAQkC,iBAAiB9f,QAAQtB,MAAMmhB,cAElDp1B,KAAKiU,MAAMmhB,YAAY7f,QAAQtB,MAAMmhB;;gBAI7Cp1B,KAAKqgB,QAAU9K,QAAQggB,UAAUlV,OACjCrgB,KAAKyF,UAAU8P,QAAQggB,UAAU9vB;gBACjCzF,KAAK4W,QAAUrB,QAAQggB,UAAU3e,OAEjC5W,KAAKsqB,UAAUkG,wBAAwBxwB;gBACvCA,KAAK2uB,MAAMjc,SAAS;oBAAA,OAAM5O,MAAKwmB,UAAUmG,uBAAuB3sB;oBAEhE9D,KAAKu4B,oBAAoB/1B;;YA5CjC,IAAAkC,SAAA4zB,kBAAA3zB;YAAA,OAAAD,OA+CI8zB,cAAA;gBAAmC,IAAA1zB,SAAA9E;gBAC/B,OAAO;oBACHu1B,WAAWv1B,KAAKy4B;oBAChBhL,SAAW;wBAAA,OAAM3oB,OAAK2oB;;;eAlDlC/oB,OAsDI6zB,sBAAA,SAAoB/1B;gBAAgC,IAAA6C,SAAArF,MAC1C04B,4BAA4BvqB,cAAc3L,QAAQ;oBAAA,OAAM6C,OAAKooB;mBAAW;gBAC9EztB,KAAK2uB,MAAMjc,SAASgmB,0BAA0BzxB;eAxDtDvC,OA2DI+zB,eAAA;gBAAsC,KAClC,IAAMlD,YAAY,IACZx1B,OAAOC,MAFqBsF,QAAA,SAAA4f,KAAAuQ;oBAI7B,IAAM9zB,MAAG8zB,uBAAAvQ;oBACVqQ,UAAU5zB,OAAO;wBAEb,OAAOuuB,uBAAgBvrB,UAAUhD,KAAKc,MAAM1C,MAAMuC;uBAEtDizB,UAAU5zB,KAAK+gB,WAAW/gB;mBATIujB,MAAA,GAAAuQ,yBAIhBz1B,KAAKmwB,OAAOjB,UAJIhK,MAAAuQ,uBAAAlzB,QAAA2iB,OAIM5f,MAAA4f,KAAAuQ;gBAQxC,OAAOF;eAvEf7wB,OA0EI+oB,UAAA;gBACI,OAAOztB,KAAK2uB,MAAMtoB;eA3E1BiyB;SAAA,ICxBMK,QAAQ;YACVC,SAAW;YACXC,WAAW;;QAGR,SAASC,yBAATlc;YAA8J,IAAvH1L,MAAuH0L,KAAvH1L,KAAKvH,QAAkHiT,KAAlHjT,OAAOqlB,iBAA2GpS,KAA3GoS,gBAAgB7jB,MAA2FyR,KAA3FzR,KAAK8I,QAAsF2I,KAAtF3I,OAAO2C,QAA+EgG,KAA/EhG,OAA+EmiB,kBAAAnc,KAAxEwS,YAAe/X,QAAyD0hB,gBAAzD1hB,OAAOE,SAAkDwhB,gBAAlDxhB;YAE3G,IAAK5N,SAAUqlB,gBAAf;gBAIA,IAAMgK,MAAM7tB,IAAIuK,cAAc;gBAC9BsjB,IAAInjB,aAAa,MAAM3E;gBACvB,IAAMuD,QAAQtJ,IAAIuK,cAAc;gBA6DhC,OA5DIzB,MAAMglB,YACNxkB,MAAMoB,aAAa,SAAS5B,MAAMglB,WAGtCxkB,MAAMN,YAAYhJ,IAAIgL,eAAJ,oBACVjF,MADU,6GAIAmG,QAJA,gCAKCE,SALD,sCAQVrG,MARU,mSAkBVA,MAlBU,eAkBQynB,MAAME,YAlBd,oEAsBV3nB,MAtBU,eAsBQynB,MAAMC,UAtBd;gBA2BlBI,IAAI7kB,YAAYxK,QAChBqvB,IAAI7kB,YAAY6a,iBAChBgK,IAAI7kB,YAAYM;gBAEhBua,eAAekK,UAAUC,IAAIR,MAAMC,UACnCjvB,MAAMuvB,UAAUC,IAAIR,MAAME;gBAE1BjiB,MAAMiI,GAAGiL,MAAME,UAAU;oBACrBgF,eAAekK,UAAUE,OAAOT,MAAMC,UACtC5J,eAAekK,UAAUC,IAAIR,MAAME;oBAEnClvB,MAAMuvB,UAAUE,OAAOT,MAAME,YAC7BlvB,MAAMuvB,UAAUC,IAAIR,MAAMC,UAE1B7zB,WAAW;wBACP+R,eAAekY;uBAChB;oBAGPpY,MAAMiI,GAAGiL,MAAMM,QAAQ,SAAAjT;oBAA4C,IAAlCY,WAAkCZ,MAAzCE,OAAyBW,YAAgBb,MAAxBI;oBACf,mBAAbQ,aACPihB,IAAIvkB,MAAM4C,QAAQyB,MAAMf,YAGH,mBAAdC,cACPghB,IAAIvkB,MAAM8C,SAASuB,MAAMd;oBAI1BghB;;;QC7ER,SAASK,yBAATzc;YAA2F,IAApDzR,MAAoDyR,KAApDzR,KAAK8I,QAA+C2I,KAA/C3I,OAErCmC,OAAOjL,IAAIuK,cAAc,SACzBzC,OAAO9H,IAAIuK,cAAc,SACzBjB,QAAQtJ,IAAIuK,cAAc,UAC1B4jB,UAAUnuB,IAAIuK,cAAc;YAyClC,OAxCA4jB,QAAQJ,UAAUC,IAAI,YAElBllB,MAAMglB,YACNxkB,MAAMoB,aAAa,SAAS5B,MAAMglB;YAGtC7iB,KAAKjC,YAAYlB,OACjBA,KAAKkB,YAAYmlB,UACjBrmB,KAAKkB,YAAYM,QACjBA,MAAMN,YAAYhJ,IAAIgL,eAAJ;YA+BXC;;QCiDf,IAAMmjB,oBAAc;YAAA,OAAM1nB;WACpB2nB,qBAAe,SAAA5c;YAAA,OAAe9K,KAAf8K,KAAGvb;WChBXo4B,sBAAb;YAqCI,SAAAA,UAAYlkB;gBAAmCvV,KAnC/CwV,WAmC+C,GAAAxV,KAlC/CW,YAkC+C,GAAAX,KAhC/C+N,WAgC+C,GAAA/N,KA/B/C6I,cA+B+C;gBAAA7I,KA9B/Cm4B,iBA8B+C,GAAAn4B,KA5B/CiU,aA4B+C,GAAAjU,KA3B/C0zB,oBA2B+C,GAAA1zB,KAzB/CovB,kBAyB+C;gBAAApvB,KAxB/CsrB,kBAwB+C,GAAAtrB,KAtB/CysB,4BAsB+C,GAAAzsB,KApB/C05B,sBAoB+C;gBAAA15B,KAlB/C8V,kBAkB+C,GAAA9V,KAb/C+3B,yBAa+C,GAAA/3B,KAZ/C22B,yBAY+C;gBAAA32B,KAV/C+yB,gBAU+C,GAAA/yB,KAR/C25B,mBAQ+C,GAAA35B,KAN/C45B,cAM+C,GAAA55B,KAJ/C65B,cAI+C;gBAAA75B,KAF/CizB,iBAE+C,GC5E5C,SAAqB1d;oBAExB,KAAKA,SACD,MAAM,IAAI3Q,MAAJ;oBAIV,KAAK2Q,QAAQC,QAAQD,QAAQC,IAAI/H,MAAM,6BACnC,MAAM,IAAI7I,MAAJ,0BAAmC2Q,QAAQC;oBAKrD,IAnDJ,SAAoCD;wBAEhC,IAAIA,QAAQtB,SAAoC,mBAAlBsB,QAAQtB,OAClC,MAAM,IAAIrP,MAAJ;wBAGV,IAAMk1B,iB1DoWH,SAAmBrrB;4BACtB,IAAInK,SAAS;4BACb,KAAK,IAAI3C,OAAO8M,KACRA,IAAIzM,eAAeL,QACnB2C,OAAOW,KAAKwJ,IAAI9M;4BAGxB,OAAO2C;yB0D3WgB4K,CAAOoa;wBAE9B,IAAI/T,QAAQtB,OAAO,SAAAN,MAAA,GAAAqC,gBACGlV,OAAO8F,KAAK2O,QAAQtB,QADvBN,MAAAqC,cAAAzT,QAAAoR,OAC+B;4BAAzC,IAAMhS,MAAGqU,cAAArC,MAGJ6W,OAAOjV,QAAQtB,MAAMtS;4BAE3B,KAAK6oB,QAA0B,mBAATA,MAClB,MAAM,IAAI5lB,MAAJ,4BAAqCjD,MAArC;4BAGV,KAAK6oB,KAAKhO,MACN,MAAM,IAAI5X,MAAJ;4BAGV,KAA2C,MAAvCk1B,eAAe90B,QAAQwlB,KAAKhO,OAC5B,MAAM,IAAI5X,MAAJ,qCAA8Ck1B,eAAe5rB,KAAK;4BAG5E,IAAIsc,KAAK+I,YAAY/I,KAAK4I,SACtB,MAAM,IAAIxuB,MAAJ;4BAGV,IAAI4lB,KAAKhO,SAAS8M,UAAU9N,YAAYgP,KAAK2D,eAAe3D,KAAK6D,YAC7D,MAAM,IAAIzpB,MAAJ;;qBAkBlBm1B,CAAwBxkB,UAEpBA,QAAQ6Z,YAAY;wBACpB,IAAI7Z,QAAQ6Z,eAAe1W,KAAKnD,QAAQ6Z,WAAW/X,WAAWmB,OAAOjD,QAAQ6Z,WAAW/X,QACpF,MAAM,IAAIzS,MAAJ;wBAGV,IAAI2Q,QAAQ6Z,eAAe1W,KAAKnD,QAAQ6Z,WAAW7X,YAAYiB,OAAOjD,QAAQ6Z,WAAW7X,SACrF,MAAM,IAAI3S,MAAJ;;oBAId,IAAI2Q,QAAQmkB,kBACJnkB,QAAQmkB,mBAAmBhQ,QAAQ5hB,UAAUyN,QAAQmkB,mBAAmBhQ,QAAQ3hB,OAChF,MAAM,IAAInD,MAAJ,gCAAwC2Q,QAAQmkB,kBAAkB;oBAIhF,KAAKnkB,QAAQxH,KACT,MAAM,IAAInJ,MAAJ;oBAGV,IAA2B,mBAAhB2Q,QAAQxH,OAA2C,qBAAhBwH,QAAQxH,KAClD,MAAM,IAAI3H,UAAJ;oBAGV,IAAImP,QAAQohB,qBAA0D,qBAA9BphB,QAAQohB,mBAC5C,MAAM,IAAI/xB,MAAJ;oBAGV,IAAK2Q,QAAQwiB,qBAA8F,qBAA9BxiB,QAAQwiB,mBACjF,MAAM,IAAInzB,MAAJ;iBDmCNmuB,CAASxd,UAKTvV,KAAKwV,MAAMD,QAAQC,KACnBxV,KAAKW,OAAOX,KAAKwV,IAAI9E,QAAQ,MAAM,MAEnC1Q,KAAKysB,uBAAuBlX,QAAQkX,wBAAwB7kB;gBAE5D,IAAMyS,SAASV;gBAGf,IAFAU,OAAO2f,aAAa3f,OAAO2f,cAAc,IAErC3f,OAAO2f,WAAWh6B,KAAKwV,MACvB,MAAM,IAAI5Q,MAAJ,6DAAsE5E,KAAKwV;gBAMrFxV,KAAK0zB,eDvCF;oBACH7wB,QAAQ;wBACJ2Z,MAAe;wBACfkY,cAAe;wBACfnB,WAAe;wBACf8B,gBAAe;wBACftC,UALI,SAAA5b;4BAKkE,IAA3D9V,QAA2D8V,MAA3D9V;4BACP,KAAKmN,SAASnN,WAAWwf,mBAAYG,cAAc3f,QAC/C,MAAM,IAAIuD,MAAJ;;wBAGd0uB,UAVI,SAAAzY;4BAWA,OAAO+G,oBADyE/G,MAAzExZ;;;oBAKf0E,SAAS;wBACLyW,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;;oBAGjBrU,OAAO;wBACH7D,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA1P;4BAAA,OAAAA,MAAGqF;;;oBAGtBE,OAAO;wBACH/D,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAvP;4BAAA,OAAAA,MAAGoF;;;oBAGtB+L,QAAQ;wBACJ9P,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAtP;4BAAA,OAAAA,MAAGkR;;;oBAGtB2M,UAAU;wBACNzc,MAAU;wBACV+W,WAAU;;oBAGdlrB,WAAW;wBACPmU,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAiI;4BAAA,OAAAA,MAAGtqB;;;oBAGtBmkB,iBAAiB;wBACbhQ,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA5G;4BAAA,OAAAA,MAAG0I;;;oBAGtB6E,WAAW;wBACP7U,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfW,gBAAe;wBACfjC,SAAemG;wBACfjG,UAAekG;;oBAGnBlI,YAAY;wBACR9U,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;wBACbtB,SAAamG;wBACbjG,UAAakG;;oBAGjBpI,UAAU;wBACN5U,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;wBACbtB,SAAamG;wBACbjG,UAAakG;;oBAGjBjI,SAAS;wBACL/U,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfW,gBAAe;wBACfjC,SAAemG;wBACfjG,UAAekG;;oBAGnB/zB,SAAS;wBACL+W,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA8K;4BAAA,OAAAA,MAAG/vB;;;oBAGtB8mB,SAAS;wBACL/P,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACftB,SAAemG;wBACf7O,eAAe,SAAAwL;4BAAA,OAAAA,OAAG3J;;;mBCpEtBvsB,KAAKiU,QAAQsB,QAAQtB,SAAS;gBAtBa,IAAA2I,OA0BsCrH,QAAQ6Z,cAAc,IA1B5D6K,aAAArd,KA0BnCvF,OA1BmC6iB,cAAAtd,KA0BDrF;gBAC1CvX,KAAKovB,aAAa;oBAAE/X,YA3BuB,MAAA4iB,aA0B3BtQ,mBAAmBC,QA1BQqQ;oBA2BhB1iB,aA3BgB,MAAA2iB,cA0BQvQ,mBAAmBE,SA1B3BqQ;mBA6B3Cl6B,KAAK+N,MAAMwH,QAAQxH,KACnB/N,KAAK6I,SAAS0M,QAAQ1M,QACtB7I,KAAKm4B,YAAY5iB,QAAQ4iB;gBAEzBn4B,KAAK8V,aAAaP,QAAQO,cAAc,IACxC9V,KAAK8V,WAAWR,SAAStV,KAAK8V,WAAWR,UAAU;gBACnDtV,KAAK8V,WAAWma,QAAQjwB,KAAK8V,WAAWma,SAAS,IAEjDjwB,KAAK05B,iBAAiBnkB,QAAQmkB,kBAAkBhQ,QAAQ5hB;gBAExD9H,KAAKsrB,aAAa/V,QAAQ+V,YAGtBtrB,KAAK+3B,oBADLxiB,QAAQwiB,oBACiBxiB,QAAQwiB,oBAERe;gBAIzB94B,KAAK22B,oBADLphB,QAAQohB,oBACiBphB,QAAQohB,oBAER0C;gBAG7Br5B,KAAK+yB,WAAWxd,QAAQwd,UAExB/yB,KAAK65B,SAAStkB,QAAQskB,UAAU;oBAC5BM,OAAOtoB;oBACPuoB,MAAOvoB;oBACPwoB,MAAOxoB;oBACP3N,OAAO2N;mBAGX7R,KAAKs6B,iBACLt6B,KAAKu6B,kBAELlgB,OAAO2f,WAAWh6B,KAAKwV,OAAOxV;;YAtGtC,IAAA0E,SAAA+0B,UAAA90B;YAAA,OAAAD,OAyGI2oB,eAAA;gBACI,IAAIrtB,KAAKizB,WACL,OAAOjzB,KAAKizB;gBAFoB,KAKpC,IAAMA,YAAYnyB,OAAO8F,KAAK5G,KAAKiU,QALCN,MAAA,GAAAqC,gBAMlBlV,OAAO8F,KAAK5G,KAAK0zB,eANC/f,MAAAqC,cAAAzT,QAAAoR,OAMc;oBAA7C,IAAMhS,MAAGqU,cAAArC;qBACsB,MAA5Bsf,UAAUjuB,QAAQrD,QAClBsxB,UAAUhuB,KAAKtD;;gBAKvB,OADA3B,KAAKizB,YAAYA,WACVA;eAtHfvuB,OA0HI+lB,oBAAA,SAAkB9pB;gBAEd,OAAOX,KAAKiU,MAAMtT,SAASX,KAAK0zB,aAAa/yB;eA5HrD+D,OA+HIyrB,SAAA,SAAOxvB,MAAe65B;gBAgBd,MAAM,IAAI51B,MAAJ;eA/IlBF,OAmJI41B,gBAAA;gBACI,IAAIt6B,KAAKy6B,WAAW;oBAChB,IAAI53B,OAAO+2B,QACP,MAAM,IAAIh1B,MAAJ,sBAA+B5E,KAAKW,OAApC;oBAGV,IAAM0I,QAAQ,IAAI6hB,qBAAelrB;oBACjC6C,OAAO+2B,SAAS55B,KAAK45B,SAASvwB,MAAM0jB;;eA1JhDroB,OA8JI61B,iBAAA;gBAAiB,IAAAz2B,QAAA9D;gBACb6e,MAAOwK,8BAAL,MAAsCrpB,KAAKW,MAAS;oBAClD,QAAO;oBAGXke,MAAOwK,wBAAL,MAAgCrpB,KAAKW,MAAS,SAAAwW;oBAAqD,IAAAujB,aAAAvjB,MAA1C8D;oBAEvD,OADiB,IAAIqd,2BAAkBx0B,OAD0DqT,MAAlD3U,QACM;wBAAE2E,SAD0CuzB,WAAlCvzB;wBACC8M,OADiCymB,WAAzBzmB;wBACDshB,WAD0BmF,WAAlBnF;uBAE/DiD;;eArK5B9zB,OAyKIi2B,cAAA,SAAYzyB;gBACR,OAAO4S,UAAK5S,KAASmhB,8BAAV,MAA2CrpB,KAAKW,MAASsC,KAAK,SAAA4X;oBACrE,OADmFA,MAAXI;mBAEzEvV,MAAM;oBACL,QAAO;;eA7KnBhB,OAiLI+vB,SAAA,SAAOxgB;gBACH,OAAwB,qBAAbjU,KAAK+N,MACL/N,KAAK+N,IAAI;oBAAEkG;qBAGfjU,KAAK+N;eAtLpBrJ,OAyLIgtB,mBAAA,SAAiBzd;gBACb,OAAIjU,KAAK6I,UAAiC,mBAAhB7I,KAAK6I,SACpB7I,KAAK6I,SAGTiF,iBAAiB9N,KAAKy0B,OAAOxgB;eA9L5CvP,OAiMIkE,YAAA,SAAUqL;gBACN,OAAI1M,aAAQvH,KAAK6I,UAEN7I,KAAK6I,SAGT7I,KAAK0xB,iBAAiBzd;eAvMrCvP,OA0MI0zB,eAAA;gBACI,IAAIp4B,KAAKm4B,WACL,OAAOn4B,KAAKm4B;eA5MxBzzB,OAgNI+1B,UAAA;gBACI,IAAMG,UAAU3P;gBAChB,OAAOzd,QAAQotB,WAAWA,QAAQplB,QAAQxV,KAAKwV;eAlNvD9Q,OAqNIm2B,sBAAA,SAAgD1zB,SAAmCiN;gBAC/E,IAAIA,WAAW;oBACX,IAAyB,mBAAdA,cAA2BC,UAAUD,YAC5C,MAAM,IAAIhO,UAAJ;oBAGV,OAAOgO;;gBAGX,IAAIjN,YAAYuiB,QAAQ3hB,OAEpB,OAAO;gBAGX,MAAM,IAAInD,MAAJ;eAnOdF,OAsOIo2B,oBAAA,SAAkB3zB,SAAoC8M;gBAClD,IAAIA,MAAMpR,QACN,OAAO+e,oBAAc3N,MAAMpR,QAAQse;gBAGvC,IAAIha,SAAS;oBACT,IAAIA,YAAYuiB,QAAQ5hB,UAAUX,YAAYuiB,QAAQ3hB,OAClD,MAAM,IAAInD,MAAJ,2BAAoCuC;oBAG9C,OAAOA;;gBAGX,OAAOnH,KAAK05B;eAnPpBh1B,OAsPIwnB,OAAA,SAAKjY;gBAAsD,IAAAnP,SAAA9E,MAKjDsI,SAAS,IAAI4nB,uBAAgBlwB,MAFnCiU,QAAQA,SAAS,KAIXud,UAAS,SAACnvB,QAAQ+R,WAAWjN;oBAApB,OAAgCvD,qBAAakC,IAAI;wBAC5D,KAAK0I,SAASnM,SACV,MAAM,IAAIuC,MAAJ;wBAKV,OAFAuC,UAAUrC,OAAKg2B,kBAAkB3zB,SAAS8M,QAC1CG,YAAYtP,OAAK+1B,oBAAoB1zB,SAASiN;wBACvC9L,OAAOkpB,OAAOnvB,QAAQ+R,WAAWjN;;;gBAG5C,OAAAhF,SAAA,IACOmG,OAAO+jB,cADd;oBAEImF,QAAU,SAACpd,WAAWjN;wBAAZ,OAAwBqqB,QAAO3uB,QAAQuR,WAAWjN;;oBAC5D4zB,UAAU,SAAC14B,QAAQ+R,WAAWjN;wBAApB,OAAgCqqB,QAAOnvB,QAAQ+R,WAAWjN;;;eA1QhFzC,OA8QIitB,mBAAA,SAAiBtvB,QAAgCwG,QAA0BuL;gBACvE,IAAI/R,WAAWQ,QAAf;oBAIA,KAAK6J,gBAAgB7J,QAAQR,SACzB,MAAM,IAAIuC,MAAJ;oBAGV,IAAMyI,SAASzE;oBAEf,KAAKuE,YAAYtE,QAAQwE,YAAYtE,aAAa1G,SAC9C,MAAM,IAAIuC,MAAJ,gCAAyCiE,OAAO7F,aAAhD,2BAAqFqK;oBAG/F,IAAI+G,aAAkC,mBAAdA,WACpB,MAAM,IAAIxP,MAAJ,wEAAiFwP,YAAjF;;eA9RlB1P,OAkSIinB,MAAA,SAAI/U,OAAgBgkB;gBAChB56B,KAAK65B,OAAOO,KAASp6B,KAAKW,OAA1B,MAAoCiW,OAAUgkB;eAnStDl2B,OAsSI8rB,0BAAA,SAA2BwK;gBACvB,IAAM3gB,SAASV;gBACfU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IACrD5gB,OAAO4gB,iBAAiBh2B,KAAK+1B;eAzSrCt2B,OA4SI+rB,yBAAA,SAA0BuK;gBACtB,IAAM3gB,SAASV;gBACfU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IACrD5gB,OAAO4gB,iBAAiB/zB,OAAOmT,OAAO4gB,iBAAiBj2B,QAAQg2B,WAAW;eA/SlFvB;SAAA;QAuTO,SAAS/3B,OAAU6T;YfrXnB,IJsEAsF,OAAqCgE,IAAI/D,MACtCT;YItEDV,mBAAYuhB,gBACbvhB,mBAAYuhB,eAAc,GJoEUrc,MAArChE,QIlE2B;gBAAEgE;gBAAI/D;eJkEI+D,IAAI/D,OAA2CD,MAA3CC,OACtCT,SAASV,oBACRmF,iBAAiBzE,OAAOyE,kBAAmB,SAAAlU;gBAAO,OAAIkU,uBAAelU,SAAS;oBAAEiU;oBAAI/D;;eA4CxF,SAAAK;gBAA6F,IAAhE0D,KAAgE1D,MAAhE0D,IAAI/D,OAA4DK,MAA5DL;gBAC7BjB,cAAc3J,SAAS,uBAAuB;oBAEjD,OAAO+E,iBAAiBpS,QAAQ,WAAW,SAAA+T;yBApC5C,SAAyBA,OAAzBoE;4BAAiG,IAA/C6D,KAA+C7D,MAA/C6D,IAAI/D,OAA2CE,MAA3CF,MAQnDtY,SAASoU,MAAMpU,UAAUoU,MAAMukB,eACjC9tB,SAASuJ,MAAMvJ,UAAWuJ,MAAMwkB,iBAAiBxkB,MAAMwkB,cAAc/tB,QACnE4N,OAAOrE,MAAMqE;4BAMnB,IAJe,WAAX5N,WACAA,SAAa7F,SAASE,OAAhB,OAGLlF,QAAL;gCAIA,KAAK6K,QACD,MAAM,IAAIzI,MAAJ;gCASVka,uBAAe;oCAAEtc;oCAAQ6K;oCAAQ4N;mCAAQ;oCAAE4D;oCAAI/D;;;yBAQvCugB,CAAgBzkB,OAAO;4BAAEiI;4BAAI/D;;;;aIpHjCwgB,CAAkB;gBAAEzc;gBAAI/D;gBAGpB6D,YAAY;gBAAEE;gBAAI/D;gBAAMgE;gBnCS7B,SAAA6T;gBAAqF,IAAhE9T,KAAgE8T,MAAhE9T,IAAI/D,OAA4D6X,MAA5D7X;gBACrBjB,YAAY,oBAAoB3J,SAAS,iBAAiB;oBAC7D,IAAMsV,WAA4B3G,GAtB5B3F,aAAaE,OAAO;wBAAEvQ,QAAQjB;uBAAY,SAAAuP;wBAAwB,IAArB3U,SAAqB2U,MAArB3U,QAAQ6K,SAAa8J,MAAb9J;wBAE3D,OADAsN,gBAAgBnY,QAAQiB,QAAQ;4BAAEyE,KAAK1F;4BAAQqG,QAAQwE;4BAChD;4BAAE0N,YAAYL;;wBAsBfpS,SAAS2D;oBAKf,OAJI3D,UACAsS,SAAStS,QAAQ;wBAAEwS;uBAAQpV,MAAMmM,gBAG9B2T;;amCfP+V,CAAU;gBAAE1c;gBAAI/D;;Ye6WpB,IAAMwP,YAA2B,IAAImP,oBAAUlkB,UAEzC2W,OAAO,SAACjY;gBAAD,OAAWqW,UAAU4B,KAAKjY;;YAOvC,OANAiY,KAAKiE,SAAS,SAACxvB,MAAM65B;gBAAP,OAAelQ,UAAU6F,OAAOxvB,MAAM65B;eACpDtO,KAAKuO,UAAU;gBAAA,OAAMnQ,UAAUmQ;eAC/BvO,KAAKyO,cAAc,SAACzyB;gBAAD,OAASoiB,UAAUqQ,YAAYzyB;eAClDgkB,KAAK0N,SAAStP,UAAUsP,QAGjB1N;;QAGJ,SAASsP;YACRtc,cACAA,WAAOgK;YAGX,IAAM1iB,UAAU,IAEV6T,SAASV;YAEf,KADAU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IAC9C5gB,OAAO4gB,iBAAiB14B,UAC3BiE,QAAQvB,KAAKoV,OAAO4gB,iBAAiB,GAAGxN,QAAQ,IAAI7oB,MAAJ,uBAAgC;YAGpF,OAAOhB,qBAAayC,IAAIG,SAASvD,KAAK4O;;QAGnC,IAAM4pB,oBAAoBD;QAE1B,SAAS/N;YfvYT,IJgHGjI;YmBwRNgW,qBb5ZO34B,OAAM,iBRgCV;gBAAmC,KACtC,IAAM64B,oBAAoB7hB,YAAY,sBADAlG,MAAA,GAAAgoB,yBAEnBD,kBAAkB90B,QAFC+M,MAAAgoB,uBAAAp5B,QAAAoR,OAEO;oBAAxC,IAAMhN,OAAIg1B,uBAAAhoB,MACL6R,WAAWkW,kBAAkBz6B,IAAI0F;oBACnC6e,aACAA,SAAS6C,aAAY,IAEzBqT,kBAAkBxhB,IAAIvT;;aMlB1Bi1B,KJ+GMpW,WAAW3L,cAAc5Y,IAAI,2BAE/BukB,SAASve;mBhCzINpE,OAAM;;QqDbjB3C,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAA9mB;YAAA7U,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAn6B;YAAAxB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAC;YAAA57B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAJ;YAAAv7B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAL;YAAAt7B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAE;YAAA77B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAvS;YAAAppB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAtS;YAAArpB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAnS;YAAAxpB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAA/R","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.min.js b/dist/zoid.min.js index a0ff7266..61c4014f 100644 --- a/dist/zoid.min.js +++ b/dist/zoid.min.js @@ -1,2 +1,2 @@ -!function(n,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("zoid",[],r):"object"==typeof exports?exports.zoid=r():n.zoid=r()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function t(e){if(r[e])return r[e].exports;var i=r[e]={i:e,l:!1,exports:{}};return n[e].call(i.exports,i,i.exports,t),i.l=!0,i.exports}return t.m=n,t.c=r,t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{enumerable:!0,get:e})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,r){if(1&r&&(n=t(n)),8&r)return n;if(4&r&&"object"==typeof n&&n&&n.__esModule)return n;var e=Object.create(null);if(t.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:n}),2&r&&"string"!=typeof n)for(var i in n)t.d(e,i,function(r){return n[r]}.bind(null,i));return e},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,r){return{}.hasOwnProperty.call(n,r)},t.p="",t(t.s=0)}([function(n,r,t){"use strict";t.r(r);var e={};function i(){return(i=Object.assign||function(n){for(var r=1;r>>0)+"__"+V,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var n=new WeakMap,r={};return Object.freeze(r),n.set(r,"__testvalue__"),"__testvalue__"===n.get(r)}catch(n){return!1}}())try{this.weakmap=new WeakMap}catch(n){}this.keys=[],this.values=[]}var r=n.prototype;return r._cleanupClosedWindows=function(){for(var n=this.weakmap,r=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!n)return"";if("string"==typeof n)return n;if(n instanceof Error){var t=n&&n.stack,e=n&&n.message;if(t&&e)return-1!==t.indexOf(e)?t:e+"\n"+t;if(t)return t;if(e)return e}return"function"==typeof n.toString?n.toString():{}.toString.call(n)}catch(n){return"Error while stringifying error: "+fn(n,r+1)}}function cn(n){return"string"==typeof n?n:n&&"function"==typeof n.toString?n.toString():{}.toString.call(n)}function an(n,r){if(!r)return n;if(Object.assign)return Object.assign(n,r);for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t]);return n}function sn(n,r){var t;return function e(){t=setTimeout(function(){n(),e()},r)}(),{cancel:function(){clearTimeout(t)}}}function dn(n){return null!=n}function wn(n){return"[object RegExp]"==={}.toString.call(n)}function hn(n,r,t){if(n.hasOwnProperty(r))return n[r];var e=t();return n[r]=e,e}function vn(n){var r=[],t=!1;return{set:function(r,e){return t||(n[r]=e,this.register(function(){delete n[r]})),e},register:function(n){t?n():r.push(un(n))},all:function(){var n=[];for(t=!0;r.length;){var e=r.pop();n.push(e())}return h.all(n).then(on)}}}function ln(n,r){if(null==r)throw new Error("Expected "+n+" to be present");return r}function pn(){return Boolean(document.body)&&"complete"===document.readyState}function mn(n){return n.replace(/\?/g,"%3F").replace(/&/g,"%26").replace(/#/g,"%23").replace(/\+/g,"%2B")}function yn(){return en(yn,function(){return new h(function(n){if(pn())return n();var r=setInterval(function(){if(pn())return clearInterval(r),n()},10)})})}function gn(n){return en(gn,function(){var r={};if(!n)return r;if(-1===n.indexOf("="))return r;for(var t=0,e=n.split("&");t1?r-1:0),i=1;i1?t-1:0),i=1;i iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+r+" > iframe."+lt.nn+" {\n opacity: 0;\n }\n\n #"+r+" > iframe."+lt.K+" {\n opacity: 1;\n }\n ")),s.appendChild(t),s.appendChild(e),s.appendChild(d),e.classList.add(lt.K),t.classList.add(lt.nn),u.on(ot.H,function(){e.classList.remove(lt.K),e.classList.add(lt.nn),t.classList.remove(lt.nn),t.classList.add(lt.K),setTimeout(function(){Rn(e)},1)}),u.on(ot.V,function(n){var r=n.width,t=n.height;"number"==typeof r&&(s.style.width=Sn(r)),"number"==typeof t&&(s.style.height=Sn(t))}),s}}function mt(n){var r=n.doc,t=n.props,e=r.createElement("html"),i=r.createElement("body"),o=r.createElement("style"),u=r.createElement("div");return u.classList.add("spinner"),t.cspNonce&&o.setAttribute("nonce",t.cspNonce),e.appendChild(i),i.appendChild(u),i.appendChild(o),o.appendChild(r.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),e}var yt=function(){return on},gt=function(n){return un(n.value)},Et=function(){function n(n){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(n){if(!n)throw new Error("Expected options to be passed");if(!n.tag||!n.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+n.tag);if(function(n){if(n.props&&"object"!=typeof n.props)throw new Error("Expected options.props to be an object");var r=function(n){var r=[];for(var t in n)n.hasOwnProperty(t)&&r.push(n[t]);return r}(nt);if(n.props)for(var t=0,e=Object.keys(n.props);t>>0)+"__"+$,function(){if("undefined"==typeof WeakMap)return!1;if(void 0===Object.freeze)return!1;try{var e=new WeakMap,n={};return Object.freeze(n),e.set(n,"__testvalue__"),"__testvalue__"===e.get(n)}catch(e){return!1}}())try{this.weakmap=new WeakMap}catch(e){}this.keys=[],this.values=[]}var n=e.prototype;return n._cleanupClosedWindows=function(){for(var e=this.weakmap,n=this.keys,t=0;t=3)return"stringifyError stack overflow";try{if(!e)return"";if("string"==typeof e)return e;if(e instanceof Error){var t=e&&e.stack,r=e&&e.message;if(t&&r)return-1!==t.indexOf(r)?t:r+"\n"+t;if(t)return t;if(r)return r}return"function"==typeof e.toString?e.toString():{}.toString.call(e)}catch(e){return"Error while stringifying error: "+ae(e,n+1)}}function se(e){return"string"==typeof e?e:e&&"function"==typeof e.toString?e.toString():{}.toString.call(e)}function ue(e,n){if(!n)return e;if(Object.assign)return Object.assign(e,n);for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}function ce(e,n){var t;return function r(){t=setTimeout(function(){e(),r()},n)}(),{cancel:function(){clearTimeout(t)}}}function de(e){return null!=e}function fe(e){return"[object RegExp]"==={}.toString.call(e)}function he(e,n,t){if(e.hasOwnProperty(n))return e[n];var r=t();return e[n]=r,r}function le(e){var n=[],t=!1;return{set:function(n,r){return t||(e[n]=r,this.register(function(){delete e[n]})),r},register:function(e){t?e():n.push(ie(e))},all:function(){var e=[];for(t=!0;n.length;){var r=n.pop();e.push(r())}return l.all(e).then(oe)}}}function pe(e,n){if(null==n)throw new Error("Expected "+e+" to be present");return n}function we(){return Boolean(document.body)&&"complete"===document.readyState}function ve(e){return e.replace(/\?/g,"%3F").replace(/&/g,"%26").replace(/#/g,"%23").replace(/\+/g,"%2B")}function me(){return re(me,function(){return new l(function(e){if(we())return e();var n=setInterval(function(){if(we())return clearInterval(n),e()},10)})})}function ge(e){return re(ge,function(){var n={};if(!e)return n;if(-1===e.indexOf("="))return n;for(var t=0,r=e.split("&");t1?n-1:0),o=1;o1?t-1:0),o=1;o iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #"+n+" > iframe."+wt.INVISIBLE+" {\n opacity: 0;\n }\n\n #"+n+" > iframe."+wt.VISIBLE+" {\n opacity: 1;\n }\n ")),d.appendChild(t),d.appendChild(r),d.appendChild(f),r.classList.add(wt.VISIBLE),t.classList.add(wt.INVISIBLE),a.on(it.RENDERED,function(){r.classList.remove(wt.VISIBLE),r.classList.add(wt.INVISIBLE),t.classList.remove(wt.INVISIBLE),t.classList.add(wt.VISIBLE),setTimeout(function(){Se(r)},1)}),a.on(it.RESIZE,function(e){var n=e.width,t=e.height;"number"==typeof n&&(d.style.width=je(n)),"number"==typeof t&&(d.style.height=je(t))}),d}}function mt(e){var n=e.doc,t=e.props,r=n.createElement("html"),o=n.createElement("body"),i=n.createElement("style"),a=n.createElement("div");return a.classList.add("spinner"),t.cspNonce&&i.setAttribute("nonce",t.cspNonce),r.appendChild(o),o.appendChild(a),o.appendChild(i),i.appendChild(n.createTextNode("\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n ")),r}var gt=function(){return oe},yt=function(e){return ie(e.value)},Et=function(){function e(e){this.tag=void 0,this.name=void 0,this.url=void 0,this.domain=void 0,this.bridgeUrl=void 0,this.props=void 0,this.builtinProps=void 0,this.dimensions=void 0,this.autoResize=void 0,this.allowedParentDomains=void 0,this.defaultContext=void 0,this.attributes=void 0,this.containerTemplate=void 0,this.prerenderTemplate=void 0,this.validate=void 0,this.driverCache=void 0,this.xprops=void 0,this.logger=void 0,this.propNames=void 0,function(e){if(!e)throw new Error("Expected options to be passed");if(!e.tag||!e.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/))throw new Error("Invalid options.tag: "+e.tag);if(function(e){if(e.props&&"object"!=typeof e.props)throw new Error("Expected options.props to be an object");var n=function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(e[t]);return n}(et);if(e.props)for(var t=0,r=Object.keys(e.props);t(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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 8d3b7e81..dfc1a989 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "karma": "cross-env NODE_ENV=test babel-node --plugins=transform-es2015-modules-commonjs ./node_modules/.bin/karma start", "babel": "babel src/ --out-dir dist/module", "webpack": "babel-node --plugins=transform-es2015-modules-commonjs ./node_modules/.bin/webpack --progress", - "test": "npm run lint && npm run flow-typed && npm run flow && npm run karma", + "test": "npm run flow-typed && npm run flow && npm run karma", "build": "npm run test && npm run babel && npm run webpack -- $@", "release": "./publish.sh", "release:patch": "./publish.sh patch", diff --git a/src/child/index.js b/src/child/index.js index 575f3357..d4812cd7 100644 --- a/src/child/index.js +++ b/src/child/index.js @@ -1,12 +1,26 @@ /* @flow */ /* eslint max-lines: 0 */ -import { isSameDomain, matchDomain, getDomain, getOpener, - getNthParentFromTop, getAncestor, getAllFramesInWindow, - type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src'; +import { + isSameDomain, + matchDomain, + getDomain, + getOpener, + getNthParentFromTop, + getAncestor, + getAllFramesInWindow, + type CrossDomainWindowType, + onCloseWindow, +} from 'cross-domain-utils/src'; import { markWindowKnown, deserializeMessage } from 'post-robot/src'; import { ZalgoPromise } from 'zalgo-promise/src'; -import { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src'; +import { + extend, + waitForDocumentBody, + onResize, + getElementSafe, + assertExists, +} from 'belter/src'; import { getGlobal } from '../lib'; import { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants'; @@ -20,18 +34,18 @@ import { getChildPayload } from './window'; export * from './window'; export type ChildExportsType

= {| - updateProps : (props : (PropsType

)) => ZalgoPromise, - close : () => ZalgoPromise + updateProps: (props: PropsType

) => ZalgoPromise, + close: () => ZalgoPromise, |}; export type ChildHelpers

= {| - close : () => ZalgoPromise, - focus : () => ZalgoPromise, - resize : ({ width : ?number, height : ?number }) => ZalgoPromise, - onError : (mixed) => ZalgoPromise, - onProps : ((PropsType

) => void) => void, - getParent : () => CrossDomainWindowType, - getParentDomain : () => string + close: () => ZalgoPromise, + focus: () => ZalgoPromise, + resize: ({ width: ?number, height: ?number }) => ZalgoPromise, + onError: mixed => ZalgoPromise, + onProps: ((PropsType

) => void) => void, + getParent: () => CrossDomainWindowType, + getParentDomain: () => string, |}; /* Child Component @@ -45,232 +59,265 @@ export type ChildHelpers

= {| */ export class ChildComponent

{ - - component : Component

- props : PropsType

- context : string - parent : ParentExportsType

- parentDomain : string - parentComponentWindow : CrossDomainWindowType - - onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array - autoResize : { width : boolean, height : boolean, element? : string } - - constructor(component : Component

) { - ZalgoPromise.try(() => { - this.component = component; - this.onPropHandlers = []; - - const childPayload = getChildPayload(); - - if (!childPayload) { - throw new Error(`No child payload found`); - } - - if (childPayload.version !== __ZOID__.__VERSION__) { - throw new Error(`Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`); - } - - const { parent, domain, exports, context, props } = childPayload; - - this.context = context; - this.parentComponentWindow = this.getParentComponentWindow(parent); - this.parentDomain = domain; - this.parent = deserializeMessage(this.parentComponentWindow, domain, exports); - - this.checkParentDomain(domain); - - const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props); - this.setProps(initialProps, domain); - markWindowKnown(this.parentComponentWindow); - - this.watchForClose(); - - return this.parent.init(this.buildExports()); - - }).then(() => { - return this.watchForResize(); - - }).catch(err => { - this.onError(err); - }); - } - - getHelpers() : ChildHelpers

{ - return { - focus: () => this.focus(), - close: () => this.close(), - resize: ({ width, height }) => this.resize({ width, height }), - onError: (err) => this.onError(err), - onProps: (handler) => this.onProps(handler), - getParent: () => this.parentComponentWindow, - getParentDomain: () => this.parentDomain - }; - } - - checkParentDomain(domain : string) { - if (!matchDomain(this.component.allowedParentDomains, domain)) { - throw new Error(`Can not be rendered by domain: ${ domain }`); - } - } - - onProps(handler : Function) { - this.onPropHandlers.push(handler); - } - - getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) { - let props; - - if (type === INITIAL_PROPS.RAW) { - props = value; - } else if (type === INITIAL_PROPS.UID) { - if (!isSameDomain(parentComponentWindow)) { - throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`); - } - - const global = getGlobal(parentComponentWindow); - props = assertExists('props', global && global.props[uid]); - } - - if (!props) { - throw new Error(`Could not find props`); - } - - return deserializeMessage(parentComponentWindow, domain, props); + component: Component

; + props: PropsType

; + context: string; + parent: ParentExportsType

; + parentDomain: string; + parentComponentWindow: CrossDomainWindowType; + + onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array + autoResize: { width: boolean, height: boolean, element?: string }; + + constructor(component: Component

) { + ZalgoPromise.try(() => { + this.component = component; + this.onPropHandlers = []; + + const childPayload = getChildPayload(); + + if (!childPayload) { + throw new Error(`No child payload found`); + } + + if (childPayload.version !== __ZOID__.__VERSION__) { + const msg = `Parent window has zoid version ${ + childPayload.version + }, child window has version ${__ZOID__.__VERSION__}`; + // throw new Error(msg); + console.log(msg); + } + + const { parent, domain, exports, context, props } = childPayload; + + this.context = context; + this.parentComponentWindow = this.getParentComponentWindow(parent); + this.parentDomain = domain; + this.parent = deserializeMessage( + this.parentComponentWindow, + domain, + exports + ); + + this.checkParentDomain(domain); + + const initialProps = this.getPropsByRef( + this.parentComponentWindow, + domain, + props + ); + this.setProps(initialProps, domain); + markWindowKnown(this.parentComponentWindow); + + this.watchForClose(); + + return this.parent.init(this.buildExports()); + }) + .then(() => { + return this.watchForResize(); + }) + .catch(err => { + this.onError(err); + }); + } + + getHelpers(): ChildHelpers

{ + return { + focus: () => this.focus(), + close: () => this.close(), + resize: ({ width, height }) => this.resize({ width, height }), + onError: err => this.onError(err), + onProps: handler => this.onProps(handler), + getParent: () => this.parentComponentWindow, + getParentDomain: () => this.parentDomain, + }; + } + + checkParentDomain(domain: string) { + if (!matchDomain(this.component.allowedParentDomains, domain)) { + throw new Error(`Can not be rendered by domain: ${domain}`); } - - getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType { - const { type } = ref; - - if (type === WINDOW_REFERENCES.OPENER) { - return assertExists('opener', getOpener(window)); - - } else if (type === WINDOW_REFERENCES.PARENT) { - // $FlowFixMe - const distance = ref.distance; - return assertExists('parent', getNthParentFromTop(window, distance)); - - } else if (type === WINDOW_REFERENCES.GLOBAL) { - // $FlowFixMe - const { uid } = ref; - const ancestor = getAncestor(window); - - if (!ancestor) { - throw new Error(`Can not find ancestor window`); - } - - for (const frame of getAllFramesInWindow(ancestor)) { - if (isSameDomain(frame)) { - const global = getGlobal(frame); - - if (global && global.windows && global.windows[uid]) { - return global.windows[uid]; - } - } - } - } - - throw new Error(`Unable to find ${ type } parent component window`); + } + + onProps(handler: Function) { + this.onPropHandlers.push(handler); + } + + getPropsByRef( + parentComponentWindow: CrossDomainWindowType, + domain: string, + { type, value, uid }: PropRef + ): PropsType

{ + let props; + + if (type === INITIAL_PROPS.RAW) { + props = value; + } else if (type === INITIAL_PROPS.UID) { + if (!isSameDomain(parentComponentWindow)) { + throw new Error( + `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props` + ); + } + + const global = getGlobal(parentComponentWindow); + props = assertExists('props', global && global.props[uid]); } - getProps() : PropsType

{ - // $FlowFixMe - this.props = this.props || {}; - return this.props; + if (!props) { + throw new Error(`Could not find props`); } - - setProps(props : PropsType

, origin : string, isUpdate : boolean = false) { - const helpers = this.getHelpers(); - const existingProps = this.getProps(); - const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate); - - extend(existingProps, normalizedProps); - - for (const handler of this.onPropHandlers) { - handler.call(this, existingProps); + return deserializeMessage(parentComponentWindow, domain, props); + } + + getParentComponentWindow(ref: WindowRef): CrossDomainWindowType { + const { type } = ref; + + if (type === WINDOW_REFERENCES.OPENER) { + return assertExists('opener', getOpener(window)); + } else if (type === WINDOW_REFERENCES.PARENT) { + // $FlowFixMe + const distance = ref.distance; + return assertExists('parent', getNthParentFromTop(window, distance)); + } else if (type === WINDOW_REFERENCES.GLOBAL) { + // $FlowFixMe + const { uid } = ref; + const ancestor = getAncestor(window); + + if (!ancestor) { + throw new Error(`Can not find ancestor window`); + } + + for (const frame of getAllFramesInWindow(ancestor)) { + if (isSameDomain(frame)) { + const global = getGlobal(frame); + + if (global && global.windows && global.windows[uid]) { + return global.windows[uid]; + } } + } } - watchForClose() { - window.addEventListener('beforeunload', () => { - this.parent.checkClose.fireAndForget(); - }); - - window.addEventListener('unload', () => { - this.parent.checkClose.fireAndForget(); - }); - - onCloseWindow(this.parentComponentWindow, () => { - this.destroy(); - }); - } - - getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } { - let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {}; - element = getElementSafe(element); - return { width, height, element }; - } - - watchForResize() : ?ZalgoPromise { - return waitForDocumentBody().then(() => { - const { width, height, element } = this.getAutoResize(); - - if (!element || (!width && !height) || this.context === CONTEXT.POPUP) { - return; - } - - onResize(element, ({ width: newWidth, height: newHeight }) => { - this.resize({ - width: width ? newWidth : undefined, - height: height ? newHeight : undefined - }); - }, { width, height }); - }); - } - - buildExports() : ChildExportsType

{ - - const self = this; - - return { - updateProps(props : (PropsType

)) : ZalgoPromise { - return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true)); - }, - - close() : ZalgoPromise { - return ZalgoPromise.try(() => self.destroy()); - } - }; - } - - resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise { - return this.parent.resize.fireAndForget({ width, height }); - } - - close() : ZalgoPromise { - return this.parent.close(); - } - - destroy() : ZalgoPromise { - return ZalgoPromise.try(() => { - window.close(); - }); - } - - focus() : ZalgoPromise { - return ZalgoPromise.try(() => { - window.focus(); - }); - } - - onError(err : mixed) : ZalgoPromise { - return ZalgoPromise.try(() => { - if (this.parent && this.parent.onError) { - return this.parent.onError(err); - } else { - throw err; - } - }); + throw new Error(`Unable to find ${type} parent component window`); + } + + getProps(): PropsType

{ + // $FlowFixMe + this.props = this.props || {}; + return this.props; + } + + setProps(props: PropsType

, origin: string, isUpdate: boolean = false) { + const helpers = this.getHelpers(); + const existingProps = this.getProps(); + const normalizedProps = normalizeChildProps( + this.parentComponentWindow, + this.component, + props, + origin, + helpers, + isUpdate + ); + + extend(existingProps, normalizedProps); + + for (const handler of this.onPropHandlers) { + handler.call(this, existingProps); } + } + + watchForClose() { + window.addEventListener('beforeunload', () => { + this.parent.checkClose.fireAndForget(); + }); + + window.addEventListener('unload', () => { + this.parent.checkClose.fireAndForget(); + }); + + onCloseWindow(this.parentComponentWindow, () => { + this.destroy(); + }); + } + + getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } { + let { width = false, height = false, element = 'body' } = + this.autoResize || this.component.autoResize || {}; + element = getElementSafe(element); + return { width, height, element }; + } + + watchForResize(): ?ZalgoPromise { + return waitForDocumentBody().then(() => { + const { width, height, element } = this.getAutoResize(); + + if (!element || (!width && !height) || this.context === CONTEXT.POPUP) { + return; + } + + onResize( + element, + ({ width: newWidth, height: newHeight }) => { + this.resize({ + width: width ? newWidth : undefined, + height: height ? newHeight : undefined, + }); + }, + { width, height } + ); + }); + } + + buildExports(): ChildExportsType

{ + const self = this; + + return { + updateProps(props: PropsType

): ZalgoPromise { + return ZalgoPromise.try(() => + self.setProps(props, this.__origin__, true) + ); + }, + + close(): ZalgoPromise { + return ZalgoPromise.try(() => self.destroy()); + }, + }; + } + + resize({ + width, + height, + }: { + width: ?number, + height: ?number, + }): ZalgoPromise { + return this.parent.resize.fireAndForget({ width, height }); + } + + close(): ZalgoPromise { + return this.parent.close(); + } + + destroy(): ZalgoPromise { + return ZalgoPromise.try(() => { + window.close(); + }); + } + + focus(): ZalgoPromise { + return ZalgoPromise.try(() => { + window.focus(); + }); + } + + onError(err: mixed): ZalgoPromise { + return ZalgoPromise.try(() => { + if (this.parent && this.parent.onError) { + return this.parent.onError(err); + } else { + throw err; + } + }); + } } diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..4985b559 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,10941 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@^7": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.3.tgz#353048551306ff42e5855b788b6ccd9477289774" + integrity sha512-cbC5H9iTDV9H7sMxK5rUm18UbdVPNTPqgdzmQAkOUP3YLysgDWLZaysVAfylK49rgTlzL01a6tXyq9rCb3yLhQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" + integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef" + integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" + integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.0" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" + integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" + integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" + integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/node@^7.0.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.2.2.tgz#1557dd23545b38d7b1d030a9c0e8fb225dbf70ab" + integrity sha512-jPqgTycE26uFsuWpLika9Ohz9dmLQHWjOnMNxBOjYb1HXO+eLKxEr5FfKSXH/tBvFwwaw+pzke3gagnurGOfCA== + dependencies: + "@babel/polyfill" "^7.0.0" + "@babel/register" "^7.0.0" + commander "^2.8.1" + lodash "^4.17.10" + v8flags "^3.1.1" + +"@babel/parser@^7.0.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.1.2": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" + integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" + integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" + integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" + integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz#adc7a1137ab4287a555d429cc56ecde8f40c062c" + integrity sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz#1a95f5ca2bf2f91ef0648d5de38a8d472da4350f" + integrity sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" + integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz#f3c59eecff68c99b9c96eaafe4fe9d1fa8947138" + integrity sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz#c36ff40d893f2b8352202a2558824f70cd75e9fe" + integrity sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz#130c27ec7fb4f0cba30e958989449e5ec8d22bbd" + integrity sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" + integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== + dependencies: + "@babel/helper-module-transforms" "^7.4.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" + integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" + integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz#e5ff62929fdf4cf93e58badb5e2430303003800d" + integrity sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA== + dependencies: + "@babel/helper-call-delegate" "^7.4.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7", "@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz#2a697af96887e2bbf5d303ab0221d139de5e739c" + integrity sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-runtime@^7.1.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz#4d6691690ecdc9f5cb8c3ab170a1576c1f556371" + integrity sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz#3868703fc0e8f443dda65654b298df576f7b863b" + integrity sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" + +"@babel/polyfill@^7", "@babel/polyfill@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.3.tgz#332dc6f57b718017c3a8b37b4eea8aa6eeac1187" + integrity sha512-rkv8WIvJshA5Ev8iNMGgz5WZkRtgtiPexiT7w5qevGTuT7ZBfM3de9ox1y9JR5/OXb/sWGBbWlHNa7vQKqku3Q== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/preset-env@^7": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" + integrity sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.3" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.3" + "@babel/plugin-transform-dotall-regex" "^7.4.3" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.3" + "@babel/plugin-transform-function-name" "^7.4.3" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.3" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.3" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.3" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.3" + "@babel/types" "^7.4.0" + browserslist "^4.5.2" + core-js-compat "^3.0.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0.tgz#afd764835d9535ec63d8c7d4caf1c06457263da2" + integrity sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + +"@babel/preset-react@^7": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/register@^7.0.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.4.0.tgz#d9d0a621db268fb14200f2685a4f8924c822404c" + integrity sha512-ekziebXBnS/7V6xk8sBfLSSD6YZuy6P29igBtR6OL/tswKdxOV+Yqq0nzICMguVYtGRZYUCGpfGV8J9Za2iBdw== + dependencies: + core-js "^3.0.0" + find-cache-dir "^2.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc" + integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@octokit/rest@^15.2.6": + version "15.18.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" + integrity sha512-g2tecjp2TEtYV8bKAFvfQtu+W29HM7ektmWmw8zrMy9/XCKDEYRErR2YvvhN9+IxkLC4O3lDqYP4b6WgsL6Utw== + dependencies: + before-after-hook "^1.1.0" + btoa-lite "^1.0.0" + debug "^3.1.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.0" + lodash "^4.17.4" + node-fetch "^2.1.1" + universal-user-agent "^2.0.0" + url-template "^2.0.8" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" + integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.0.0", "@sinonjs/formatio@^3.1.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" + integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.3.tgz#62cf2a9b624edc795134135fe37fc2ae8ea36be3" + integrity sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw== + +"@sinonjs/samsam@^3.1.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" + integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== + dependencies: + "@sinonjs/commons" "^1.0.2" + array-from "^2.1.1" + lodash "^4.17.11" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@zeit/schemas@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" + integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== + +JSV@^4.0.x: + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + integrity sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c= + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x, abbrev@~1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + +acorn-walk@^6.0.1, acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +agent-base@4, agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + +ajv@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^5.0.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@*, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +aproba@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + integrity sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA= + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" + integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-index@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" + integrity sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k= + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@^2.0.0, asap@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@1.x, async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.0, async@^2.1.4: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.2.1, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" + integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-generator@^6.18.0, babel-generator@^6.21.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + +babel-loader@^8.0.2: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-add-module-exports@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz#72b5424d941a336c6a35357f373d8b8366263031" + integrity sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw== + optionalDependencies: + chokidar "^2.0.4" + +babel-plugin-flow-runtime@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-flow-runtime/-/babel-plugin-flow-runtime-0.17.0.tgz#51d7b2e6a526edc48fad8d8eed45bf7cc32ffc08" + integrity sha512-6u9abuyr26AFzJJ7tENieAHvK37RvO5atKbZ/oIdXHABE2dHkurgdgYTDQRznmNUx+ppx2ORkwy5GBKXTake3g== + dependencies: + babel-generator "^6.21.0" + babel-traverse "^6.20.0" + babel-types "^6.16.0" + babylon "^6.16.1" + camelcase "^3.0.0" + flow-config-parser "^0.3.0" + +babel-plugin-istanbul@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-istanbul@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893" + integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ== + dependencies: + find-up "^3.0.0" + istanbul-lib-instrument "^3.0.0" + test-exclude "^5.0.0" + +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= + +babel-plugin-syntax-async-functions@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= + +babel-plugin-syntax-object-rest-spread@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.26.0: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es3-member-expression-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb" + integrity sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es3-property-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758" + integrity sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.0.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.16.1, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +before-after-hook@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== + +belter@^1.0.41, belter@^1.0.87: + version "1.0.93" + resolved "https://registry.yarnpkg.com/belter/-/belter-1.0.93.tgz#234a82b4a838b579e414d8079bedeafbfe5f9e06" + integrity sha512-aQmo2XAxryQIlGDy0gp1Ef+2GjS9OgLGtmghamI64evViILDul1I6SQIVPCpKtq7vlNVFHTc1PH2qrW8y26yLw== + dependencies: + cross-domain-safe-weakmap "^1.0.20" + cross-domain-utils "^2.0.10" + zalgo-promise "^1.0.28" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +bfj@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" + integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== + dependencies: + bluebird "^3.5.1" + check-types "^7.3.0" + hoopy "^0.1.2" + tryer "^1.0.0" + +big-integer@^1.6.17: + version "1.6.43" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.43.tgz#8ac15bf13e93e509500859061233e19d8d0d99d1" + integrity sha512-9dULc9jsKmXl0Aeunug8wbF+58n+hQoFjqClN7WeZwGLh0XJUWyJJ9Ee+Ep+Ql/J9fRsTVaeThp8MhiCCrY0Jg== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + integrity sha1-/cqHGplxOqANGeO7ukHER4emU5g= + dependencies: + readable-stream "~2.0.5" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.3.0, bluebird@^3.4.3, bluebird@^3.5.1, bluebird@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" + integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.18.3, body-parser@^1.16.1: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= + dependencies: + hoek "2.x.x" + +boxen@1.3.0, boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.4.1, browserslist@^4.5.2, browserslist@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.4.tgz#166c4ecef3b51737a42436ea8002aeea466ea2c7" + integrity sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag== + dependencies: + caniuse-lite "^1.0.30000955" + electron-to-chromium "^1.3.122" + node-releases "^1.1.13" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof-polyfill@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" + integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07" + integrity sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ== + dependencies: + loader-utils "^1.1.0" + mkdirp "^0.5.1" + neo-async "^2.6.0" + normalize-path "^3.0.0" + schema-utils "^1.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-db@^1.0.30000935: + version "1.0.30000957" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000957.tgz#311e86e6c7d192fd7d79fa80cd69879e41d01852" + integrity sha512-13rVZZO/75kPKJhJsi86lPUme7zlvfGDnnvSYx3TA+kYQxLtGywth5+81pyVZDjUfYyzatwA/yjv6DNsh66gmQ== + +caniuse-lite@^1.0.30000955: + version "1.0.30000957" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz#fb1026bf184d7d62c685205358c3b24b9e29f7b3" + integrity sha512-8wxNrjAzyiHcLXN/iunskqQnJquQQ6VX8JHfW5kLgAPRSiSuKZiNfmIkP5j7jgyXqAQBSoXyJxfnbCFS0ThSiQ== + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + integrity sha1-cVuW6phBWTzDMGeSP17GDr2k99c= + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chai@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +check-types@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" + integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== + +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chownr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cint@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/cint/-/cint-8.2.1.tgz#70386b1b48e2773d0d63166a55aff94ef4456a12" + integrity sha1-cDhrG0jidz0NYxZqVa/5TvRFahI= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef" + integrity sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA== + +circular-json@^0.5.5: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +clipboardy@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coalescy@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/coalescy/-/coalescy-1.0.0.tgz#4b065846b836361ada6c4b4a4abf4bc1cac31bf1" + integrity sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.1.0, colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= + dependencies: + lodash "^4.5.0" + +combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== + +commander@^2.18.0, commander@^2.19.0, commander@^2.8.1, commander@^2.9.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1, component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compressible@~2.0.14, compressible@~2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" + integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== + dependencies: + mime-db ">= 1.38.0 < 2" + +compression@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +compression@^1.5.2: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@~1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-history-api-fallback@^1.3.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.6.0: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" + integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== + dependencies: + browserslist "^4.5.4" + core-js "3.0.1" + core-js-pure "3.0.1" + semver "^6.0.0" + +core-js-pure@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" + integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== + +core-js@3.0.1, core-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" + integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== + +core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-domain-safe-weakmap@^1.0.1, cross-domain-safe-weakmap@^1.0.20: + version "1.0.23" + resolved "https://registry.yarnpkg.com/cross-domain-safe-weakmap/-/cross-domain-safe-weakmap-1.0.23.tgz#48e662e7ed2dcb71b1652e75a8c3fac7840189c1" + integrity sha512-yGsAJzibnlDcWESitCcO6mAbywWL+jV2woftEPgyfuPcA6sFdT1TGI99DZPZfyYxkFPKpP7tCgQcH2V5CJVUaQ== + dependencies: + cross-domain-utils "^2.0.0" + +cross-domain-utils@^2.0.0, cross-domain-utils@^2.0.10, cross-domain-utils@^2.0.3: + version "2.0.24" + resolved "https://registry.yarnpkg.com/cross-domain-utils/-/cross-domain-utils-2.0.24.tgz#bde407670b2c7a67e0f04be23196d49dcf30b631" + integrity sha512-pt6i27qG5xuPKBnZtgAYeML4tgWpGLwf2hwKsfZVZtBBHgTC1K44WECU1HeHgHUVLiBjQcojW3OeGa2DRywumQ== + dependencies: + zalgo-promise "^1.0.11" + +cross-env@^5.0.5: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= + dependencies: + boom "2.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + dependencies: + cssom "0.3.x" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-format@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" + integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dateformat@^1.0.6: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debuglog@*, debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + dependencies: + strip-bom "^2.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + integrity sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== + +diff@^3.2.0, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editor@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-to-chromium@^1.3.122: + version "1.3.124" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz#861fc0148748a11b3e5ccebdf8b795ff513fa11f" + integrity sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w== + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.11.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.49" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.49.tgz#059a239de862c94494fec28f8150c977028c6c5e" + integrity sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.6" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.0.2, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-ast-utils@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-find-rules@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/eslint-find-rules/-/eslint-find-rules-3.3.1.tgz#46a86c2fc9e9be2b33235234e1820e1f045793a9" + integrity sha512-07lurNxr53r0EgiuPR0JuybU3p1eIOnmA4FBmVGCvi0OtMIUod7CIjOmwKmU5VYkSMDyC/nPT/iWVNU7V4uTlg== + dependencies: + cliui "^3.2.0" + eslint-rule-documentation "^1.0.0" + path-is-absolute "^1.0.1" + which "^1.2.8" + window-size "0.3.0" + yargs "^8.0.1" + +eslint-friendly-formatter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz#27d504dc837f7caddbf201b2e84a4ee730ba3efa" + integrity sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo= + dependencies: + chalk "^2.0.1" + coalescy "1.0.0" + extend "^3.0.0" + minimist "^1.2.0" + strip-ansi "^4.0.0" + text-table "^0.2.0" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" + integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-compat@^2.0.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-2.7.0.tgz#85043d41a84be4daa3aa6efbda90e5997fc7c3ff" + integrity sha512-3J4Ic1WS+SgF1smUOc62fdf7Cnrdsg0GNwKmGVPziPtWdrc2vV5Oq2ut4kG6SM5DJcxOoz/sWJIN7rkcsWh60Q== + dependencies: + "@babel/runtime" "^7.3.1" + browserslist "^4.4.1" + caniuse-db "^1.0.30000935" + mdn-browser-compat-data "^0.0.65" + +eslint-plugin-const-immutable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-const-immutable/-/eslint-plugin-const-immutable-2.0.0.tgz#c80265ff9486bb4711a21cdc3f61440ceff77f9c" + integrity sha1-yAJl/5SGu0cRohzcP2FEDO/3f5w= + dependencies: + requireindex "~1.1.0" + +eslint-plugin-eslint-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.1.tgz#32ff0afba8a48e17073817e6d03fbc5622f735b7" + integrity sha512-GZDKhOFqJLKlaABX+kdoLskcTINMrVOWxGca54KcFb1QCPd0CLmqgAMRxkkUfGSmN+5NJUMGh7NGccIMcWPSfQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-flowtype@^2.30.0: + version "2.50.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" + integrity sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ== + dependencies: + lodash "^4.17.10" + +eslint-plugin-import@^2.7.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" + integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== + dependencies: + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.3.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" + read-pkg-up "^2.0.0" + resolve "^1.9.0" + +eslint-plugin-promise@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db" + integrity sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ== + +eslint-plugin-react@^7.4.0: + version "7.12.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c" + integrity sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + object.fromentries "^2.0.0" + prop-types "^15.6.2" + resolve "^1.9.0" + +eslint-plugin-security@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" + integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== + dependencies: + safe-regex "^1.1.0" + +eslint-plugin-unicorn@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-6.0.1.tgz#4a97f0bc9449e20b82848dad12094ee2ba72347e" + integrity sha512-hjy9LhTdtL7pz8WTrzS0CGXRkWK3VAPLDjihofj8JC+uxQLfXm0WwZPPPB7xKmcjRyoH+jruPHOCrHNEINpG/Q== + dependencies: + clean-regexp "^1.0.0" + eslint-ast-utils "^1.0.0" + import-modules "^1.1.0" + lodash.camelcase "^4.1.1" + lodash.kebabcase "^4.0.1" + lodash.snakecase "^4.0.1" + lodash.upperfirst "^4.2.0" + safe-regex "^1.1.0" + +eslint-rule-documentation@^1.0.0: + version "1.0.22" + resolved "https://registry.yarnpkg.com/eslint-rule-documentation/-/eslint-rule-documentation-1.0.22.tgz#2d306a1e5d18a5ab422e8d68f889f9ef4b533eb2" + integrity sha512-HVc7wTszrCcZli7BCnOnRH7vS8x9bBcenu74JTYVLjsMABvx65A/+wraWa4budF94j08/G6a9c/tbhgPyi3EYQ== + +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0, eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^5: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + +express@^4.16.2, express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@3.0.2, extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-diff@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@1.1.2, find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + +flow-bin@^0.81, flow-bin@^0.81.0: + version "0.81.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.81.0.tgz#7f0a733dce1dad3cb1447c692639292dc3d60bf5" + integrity sha512-5e8oL3/5rm3G0Eet3yDCne2R/TLo5Fkn+Z5MtHd4wtz+1miLC35Sgo8XvnbTmiZ9epdTZ1q6GLmJWYh7tUlfGg== + +flow-config-parser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/flow-config-parser/-/flow-config-parser-0.3.0.tgz#704916efba88cd2518ab4d8f933079571276138f" + integrity sha1-cEkW77qIzSUYq02PkzB5VxJ2E48= + +flow-runtime@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/flow-runtime/-/flow-runtime-0.17.0.tgz#ff57dd22bd7b0682c7beff20c3590f6a4a8286e3" + integrity sha512-x621HugMPrtU68ddiRX0TkNRif9PS6ml3oeP6oo0k+Kv2issqCmifC4ZX59XnLUh9dfmBcj4GoZJXu4oe8L28Q== + +flow-typed@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.5.1.tgz#0ff565cc94d2af8c557744ba364b6f14726a6b9f" + integrity sha1-D/VlzJTSr4xVd0S6NktvFHJqa58= + dependencies: + "@octokit/rest" "^15.2.6" + babel-polyfill "^6.26.0" + colors "^1.1.2" + fs-extra "^5.0.0" + glob "^7.1.2" + got "^7.1.0" + md5 "^2.1.0" + mkdirp "^0.5.1" + rimraf "^2.6.2" + semver "^5.5.0" + table "^4.0.2" + through "^2.3.8" + unzipper "^0.8.11" + which "^1.3.0" + yargs "^4.2.0" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + dependencies: + debug "^3.2.6" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + integrity sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= + dependencies: + null-check "^1.0.0" + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs-vacuum@~1.2.9: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY= + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.3, fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream-ignore@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream-npm@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" + integrity sha512-iBHpm/LmD1qw0TlHMAqVd9rwdU6M+EHRUnPkXpRi5G/Hf0FIFH+oZFryodAU2MFNfGRh/CzhUFlMKV3pdeOTDw== + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + integrity sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gauge@~2.7.1, gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.0: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0, globals@^11.7.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.9: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +growl@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +grumbler-scripts@^3: + version "3.0.41" + resolved "https://registry.yarnpkg.com/grumbler-scripts/-/grumbler-scripts-3.0.41.tgz#2f50c19c14d7978004a2498722139c3456a9c99a" + integrity sha512-Df1rXLy3KpTEaekoVhsaI81p5Vl2QDR2tSPbli1Z6ESfYX0MwWnqE/FOmtVqTNclq/3EF2f22zmJCW+gwDLIJQ== + dependencies: + "@babel/cli" "^7" + "@babel/core" "^7" + "@babel/node" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-decorators" "^7.1.2" + "@babel/plugin-syntax-dynamic-import" "^7" + "@babel/plugin-syntax-object-rest-spread" "^7" + "@babel/plugin-transform-react-jsx" "^7" + "@babel/plugin-transform-runtime" "^7.1.0" + "@babel/polyfill" "^7" + "@babel/preset-env" "^7" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-react" "^7" + "@babel/register" "^7.0.0" + "@babel/runtime" "^7.1.2" + babel-eslint "9.0.0" + babel-jest "^23.6.0" + babel-loader "^8.0.2" + babel-plugin-add-module-exports "^1.0.0" + babel-plugin-flow-runtime "^0.17.0" + babel-plugin-istanbul "^5.0.1" + babel-plugin-syntax-async-functions "^6.13.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-modules-commonjs "^6.26.0" + babel-plugin-transform-es3-member-expression-literals "^6.22.0" + babel-plugin-transform-es3-property-literals "^6.22.0" + babel-plugin-transform-flow-strip-types "^6.22.0" + cache-loader "^2.0.1" + chai "^4.0.1" + circular-dependency-plugin "^5.0.2" + cross-env "^5.0.5" + eslint "^5" + eslint-find-rules "^3.3.1" + eslint-friendly-formatter "^4.0.1" + eslint-plugin-compat "^2.0.1" + eslint-plugin-const-immutable "^2.0.0" + eslint-plugin-eslint-comments "^3.0.1" + eslint-plugin-flowtype "^2.30.0" + eslint-plugin-import "^2.7.0" + eslint-plugin-promise "^4.0.1" + eslint-plugin-react "^7.4.0" + eslint-plugin-security "^1.4.0" + eslint-plugin-unicorn "^6.0.1" + flow-bin "^0.81.0" + flow-runtime "^0.17.0" + flow-typed "^2.2.0" + hard-source-webpack-plugin "^0.12.0" + imports "^1.0.0" + in-publish "^2.0.0" + istanbul-instrumenter-loader "^3.0.0" + jest "^23.6.0" + karma "^3.0.0" + karma-chrome-launcher "^2.1.1" + karma-commonjs "^1.0.0" + karma-coverage "^1.0.0" + karma-firefox-launcher "^1.0.0" + karma-ie-launcher "^1.0.0" + karma-mocha "^1.0.1" + karma-safari-launcher "^1.0.0" + karma-sinon-chai "^2.0.2" + karma-sourcemap-loader "^0.3.7" + karma-spec-reporter "0.0.32" + karma-webpack "4.0.0-rc.3" + lolex "^2.1.2" + mocha "^4" + npm-check-updates "^2.14.1" + querystring "^0.2.0" + raw-loader "^0.5.1" + rimraf "^2.6.2" + semver "^5.6.0" + sinon "^6.3.3" + sinon-chai "^3.2.0" + terser-webpack-plugin "^1.2.1" + text-loader "0.0.1" + webpack "^4.20.2" + webpack-bundle-analyzer "^3.0.3" + webpack-cli "^3.1.2" + webpack-dev-server "^3.1.14" + yargs "^12.0.2" + +gzip-size@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" + integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA== + dependencies: + duplexer "^0.1.1" + pify "^3.0.0" + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +handlebars@^4.0.1, handlebars@^4.0.3: + version "4.1.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" + integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + integrity sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0= + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +hard-source-webpack-plugin@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.12.0.tgz#ea21f0407538fcb62f6995371541baab0a5f679e" + integrity sha512-xELLABhB3WtdVxDZ4iku8W5Xi0Tq5w+1fOXrSWjeML90uWikykkiQmTV6Lk0MKC5uFEKUZcSuTY5BZS+8ZXr8A== + dependencies: + chalk "^2.4.1" + find-cache-dir "^2.0.0" + jsonlint "^1.6.3" + lodash "^4.15.0" + mkdirp "^0.5.1" + node-object-hash "^1.2.0" + pkg-dir "^3.0.0" + rimraf "^2.6.2" + tapable "^1.0.0-beta.5" + webpack-sources "^1.0.1" + write-json-file "^2.3.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-color@^0.1.7, has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0, has-unicode@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hoopy@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hosted-git-info@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + integrity sha1-C6gdkNouJas0ozLm7HeTbhWYEYs= + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" + integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +http-proxy-middleware@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.13.0, http-proxy@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5, iferr@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.5: + version "5.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.6.tgz#562dacc7ec27d672dde433aa683c543b24c17694" + integrity sha512-/+hp3kUf/Csa32ktIaj0OlRqQxrgs30n62M90UBpNd9k+ENEch5S+hmbW3DtcJGz3sYFTh4F3A6fQ0q7KWsp4w== + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-modules@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc" + integrity sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw= + +imports@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/imports/-/imports-1.0.0.tgz#ae61446408b99ce333687ed7eef169ca44f57218" + integrity sha1-rmFEZAi5nOMzaH7X7vFpykT1chg= + +imurmurhash@*, imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4, inflight@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@^1.3.4, ini@~1.3.0, ini@~1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +init-package-json@~1.9.4: + version "1.9.6" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.6.tgz#789fc2b74466a4952b9ea77c0575bc78ebd60a61" + integrity sha1-eJ/Ct0RmpJUrnqd8BXW8eOvWCmE= + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + +internal-ip@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +ipaddr.js@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ== + +is-my-json-valid@^2.12.4: + version "2.19.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175" + integrity sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q== + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-property@^1.0.0, is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-api@^1.3.1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" + integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-instrumenter-loader@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" + integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== + dependencies: + convert-source-map "^1.5.0" + istanbul-lib-instrument "^1.7.3" + loader-utils "^1.1.0" + schema-utils "^0.3.0" + +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-instrument@^1.7.3: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-instrument@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.3" + semver "^5.5.0" + +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== + dependencies: + handlebars "^4.0.3" + +istanbul@^0.4.0: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== + dependencies: + throat "^4.0.0" + +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" + micromatch "^2.3.11" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^11.0.0" + +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== + dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c= + dependencies: + detect-newline "^2.1.0" + +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" + +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +jest-get-type@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== + +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== + dependencies: + babel-traverse "^6.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= + +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== + dependencies: + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" + +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== + dependencies: + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.1.6" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" + integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= + +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== + dependencies: + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" + semver "^5.5.0" + +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" + integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk= + dependencies: + merge-stream "^1.0.1" + +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== + dependencies: + import-local "^1.0.0" + jest-cli "^23.6.0" + +jju@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.7.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-helpfulerror@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" + integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= + dependencies: + jju "^1.1.0" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonlint@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.3.tgz#cb5e31efc0b78291d0d862fbef05900adf212988" + integrity sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A== + dependencies: + JSV "^4.0.x" + nomnom "^1.5.x" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= + dependencies: + array-includes "^3.0.3" + +jsx-pragmatic@^1.0.13: + version "1.0.14" + resolved "https://registry.yarnpkg.com/jsx-pragmatic/-/jsx-pragmatic-1.0.14.tgz#f7a44a685384a96f6ec923b81bd2bb480812fbd9" + integrity sha512-YFyd1coNboBOmUYAsCj6JSLEtlM/+NDIaLuZURjGvTV/OsqNDe3+3cy0FMrqn8vo0PT2ygJCxuSIuEWGr+CeCA== + +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + +karma-chrome-launcher@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== + dependencies: + fs-access "^1.0.0" + which "^1.2.1" + +karma-commonjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/karma-commonjs/-/karma-commonjs-1.0.0.tgz#8681d5d7d606628c5f00a36e6aef3cf943c6b0a9" + integrity sha1-hoHV19YGYoxfAKNuau88+UPGsKk= + +karma-coverage@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.2.tgz#cc09dceb589a83101aca5fe70c287645ef387689" + integrity sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw== + dependencies: + dateformat "^1.0.6" + istanbul "^0.4.0" + lodash "^4.17.0" + minimatch "^3.0.0" + source-map "^0.5.1" + +karma-firefox-launcher@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339" + integrity sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA== + +karma-ie-launcher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/karma-ie-launcher/-/karma-ie-launcher-1.0.0.tgz#497986842c490190346cd89f5494ca9830c6d59c" + integrity sha1-SXmGhCxJAZA0bNifVJTKmDDG1Zw= + dependencies: + lodash "^4.6.1" + +karma-mocha@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" + integrity sha1-7qrH/8DiAetjxGdEDStpx883eL8= + dependencies: + minimist "1.2.0" + +karma-safari-launcher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce" + integrity sha1-lpgqLMR9BmquccVTursoMZEVos4= + +karma-sinon-chai@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/karma-sinon-chai/-/karma-sinon-chai-2.0.2.tgz#e28c109b989973abafc28a7c9f09ef24a05e07c2" + integrity sha512-SDgh6V0CUd+7ruL1d3yG6lFzmJNGRNQuEuCYXLaorruNP9nwQfA7hpsp4clx4CbOo5Gsajh3qUOT7CrVStUKMw== + +karma-sourcemap-loader@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + integrity sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg= + dependencies: + graceful-fs "^4.1.2" + +karma-spec-reporter@0.0.32: + version "0.0.32" + resolved "https://registry.yarnpkg.com/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz#2e9c7207ea726771260259f82becb543209e440a" + integrity sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo= + dependencies: + colors "^1.1.2" + +karma-webpack@4.0.0-rc.3: + version "4.0.0-rc.3" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-4.0.0-rc.3.tgz#f7b43f43064ddf3db6e2f13749b3e98220794ba3" + integrity sha512-vpoET6ehBGMub74KnHPMZvMgvCZMzt24usF96oQ9QgGnmmurdbnlXQFatltox2LQS9LtZsrUa4pLRFB80VjTAw== + dependencies: + async "^2.0.0" + loader-utils "^1.1.0" + lodash "^4.17.10" + source-map "^0.5.6" + webpack-dev-middleware "^3.2.0" + +karma@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.4.tgz#3890ca9722b10d1d14b726e1335931455788499e" + integrity sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw== + dependencies: + bluebird "^3.3.0" + body-parser "^1.16.1" + chokidar "^2.0.3" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.6.0" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + flatted "^2.0.0" + glob "^7.1.1" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^4.17.5" + log4js "^3.0.0" + mime "^2.3.1" + minimatch "^3.0.2" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.6.0" + safe-buffer "^5.0.1" + socket.io "2.1.1" + source-map "^0.6.1" + tmp "0.0.33" + useragent "2.3.0" + +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" + integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lockfile@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg= + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= + +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= + +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.camelcase@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.kebabcase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.snakecase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash.uniq@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.upperfirst@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.5.0, lodash@^4.6.1: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log4js@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" + integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== + dependencies: + circular-json "^0.5.5" + date-format "^1.2.0" + debug "^3.1.0" + rfdc "^1.1.2" + streamroller "0.7.0" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= + +lolex@^2.1.2, lolex@^2.3.2, lolex@^2.7.5: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== + +loose-envify@^1.0.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@4.1.x, lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +macos-release@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.2.0.tgz#ab58d55dd4714f0a05ad4b0e90f4370fef5cdea8" + integrity sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-browser-compat-data@^0.0.65: + version "0.0.65" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-0.0.65.tgz#e8076bac0e72f8b0062a0774043481612f238407" + integrity sha512-OC27wWCLD2mw2aW6+8zZTwCv0+9WMTOFxuvTBfWoCx8f9gVFNUXHxGYA16mhKyso7hEa4tw1hY+ruCB/kg3EzQ== + dependencies: + extend "3.0.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.38.0 < 2": + version "1.39.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.39.0.tgz#f95a20275742f7d2ad0429acfe40f4233543780e" + integrity sha512-DTsrw/iWVvwHH+9Otxccdyy0Tgiil6TWK/xhfARJZF/QFhwOgZgOIvA2/VIGpM8U7Q8z5nDmdDWC6tuVMJNibw== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.7: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + dependencies: + mime-db "~1.38.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^2.3.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" + integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha@^4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" + integrity sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA== + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.9.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0, neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + +next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.4.5: + version "1.4.10" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" + integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== + dependencies: + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^2.3.2" + path-to-regexp "^1.7.0" + +node-alias@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/node-alias/-/node-alias-1.0.4.tgz#1f1b916b56b9ea241c0135f97ced6940f556f292" + integrity sha1-HxuRa1a56iQcATX5fO1pQPVW8pI= + dependencies: + chalk "^1.1.1" + lodash "^4.2.0" + +node-fetch@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== + +node-gyp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" + integrity sha1-3aVYOTs+y74kyea4cDxxGUxj+jY= + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "0.0.4" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-object-hash@^1.2.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94" + integrity sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ== + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.13.tgz#8c03296b5ae60c08e2ff4f8f22ae45bd2f210083" + integrity sha512-fKZGviSXR6YvVPyc011NHuJDSD8gFQvLPmc2d2V3BS4gr52ycyQ1Xzs7a8B+Ax3Ni/W+5h1h4SqmzeoA8WZRmA== + dependencies: + semver "^5.3.0" + +node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= + +nomnom@^1.5.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + integrity sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc= + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +"nopt@2 || 3", nopt@3.x, nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-git-url@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + integrity sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q= + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@~2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + integrity sha1-2Bntoqne29H/pWPqQHHZNngilbs= + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= + +npm-check-updates@^2.14.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-2.15.0.tgz#7c0f540c048fc801bfd11add8708479a6b82c32e" + integrity sha512-0ZUokfgS+4uPVSVWP3CMie7kQwngiQag2e70CdcnUfBM7/tOUmxb0DDMfxqshw4MvgqlPsxSYprzKaBGlvXqnA== + dependencies: + bluebird "^3.4.3" + chalk "^1.1.3" + cint "^8.2.1" + cli-table "^0.3.1" + commander "^2.9.0" + fast-diff "^1.0.1" + find-up "1.1.2" + get-stdin "^5.0.1" + json-parse-helpfulerror "^1.0.3" + lodash "^4.15.0" + node-alias "^1.0.4" + npm "^3.10.6" + npmi "^2.0.1" + rc-config-loader "^2.0.1" + semver "^5.3.0" + semver-utils "^1.1.1" + spawn-please "^0.3.0" + update-notifier "^2.2.0" + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc= + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +"npm-package-arg@^3.0.0 || ^4.0.0", npm-package-arg@^4.1.1, npm-package-arg@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" + integrity sha1-WTMD/eqF98Qid18X+et2cPaA4+w= + dependencies: + hosted-git-info "^2.1.5" + semver "^5.1.0" + +"npm-package-arg@^4.0.0 || ^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" + integrity sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA== + dependencies: + hosted-git-info "^2.4.2" + osenv "^0.1.4" + semver "^5.1.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-registry-client@~7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" + integrity sha1-x5ImawiMwxP4Ul5+NSSGJscj23U= + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + optionalDependencies: + npmlog "~2.0.0 || ~3.1.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-user-validate@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" + integrity sha1-UkZdUMLSApSlcSW5lrrtv1bFAEs= + +npm@^3, npm@^3.10.6: + version "3.10.10" + resolved "https://registry.yarnpkg.com/npm/-/npm-3.10.10.tgz#5b1d577e4c8869d6c8603bc89e9cd1637303e46e" + integrity sha1-Wx1XfkyIadbIYDvInpzRY3MD5G4= + dependencies: + abbrev "~1.0.9" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "~1.0.4" + archy "~1.0.0" + asap "~2.0.5" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.11" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.9" + fs-write-stream-atomic "~1.0.8" + fstream "~1.0.10" + fstream-npm "~1.2.0" + glob "~7.1.0" + graceful-fs "~4.1.9" + has-unicode "~2.0.1" + hosted-git-info "~2.1.5" + iferr "~0.1.5" + inflight "~1.0.5" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.9.4" + lockfile "~1.0.2" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + mkdirp "~0.5.1" + node-gyp "~3.4.0" + nopt "~3.0.6" + normalize-git-url "~3.0.2" + normalize-package-data "~2.3.5" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-package-arg "~4.2.0" + npm-registry-client "~7.2.1" + npm-user-validate "~0.1.5" + npmlog "~4.0.0" + once "~1.4.0" + opener "~1.4.2" + osenv "~0.1.3" + path-is-inside "~1.0.2" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "~2.0.4" + read-package-tree "~5.1.5" + readable-stream "~2.1.5" + realize-package-specifier "~3.0.3" + request "~2.75.0" + retry "~0.10.0" + rimraf "~2.5.4" + semver "~5.3.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + strip-ansi "~3.0.1" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "~1.1.0" + unpipe "~1.0.0" + validate-npm-package-name "~2.2.2" + which "~1.2.11" + wrappy "~1.0.2" + write-file-atomic "~1.2.0" + +npmi@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/npmi/-/npmi-2.0.1.tgz#32607657e1bd47ca857ab4e9d98f0a0cff96bcea" + integrity sha1-MmB2V+G9R8qFerTp2Y8KDP+WvOo= + dependencies: + npm "^3" + semver "^4.1.0" + +"npmlog@0 || 1 || 2 || 3", "npmlog@~2.0.0 || ~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + integrity sha1-LUb6h0M3r5SYovErtD2NC+SjaHM= + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + integrity sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518= + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7: + version "2.1.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" + integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.fromentries@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opener@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= + +opn@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-name@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4, osenv@~0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" + integrity sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE= + dependencies: + array-index "^1.0.0" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2, path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5, path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +portfinder@^1.0.9: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +post-robot@^10: + version "10.0.14" + resolved "https://registry.yarnpkg.com/post-robot/-/post-robot-10.0.14.tgz#4bdfa263dcd9424a5a6f2586be4b1872edca01d2" + integrity sha512-Q0ZCH16u4UbEr4vxRFx562pFx4ktyTeyZienQyZIyERgb9H8pZCIRZRy5lBTQRoNV9MoutaEP6GsVxRObJ6g9Q== + dependencies: + belter "^1.0.41" + cross-domain-safe-weakmap "^1.0.1" + cross-domain-utils "^2.0.0" + universal-serialize "^1.0.4" + zalgo-promise "^1.0.3" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w== + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qjobs@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0, querystring@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@1.2.0, range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +raw-loader@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= + +rc-config-loader@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-2.0.2.tgz#46eb2f98fb5b2aa7b1119d66c0554de5133f1bc1" + integrity sha512-Nx9SNM47eNRqe0TdntOY600qWb8NDh+xU9sv5WnTscEtzfTB0ukihlqwuCLPteyJksvZ0sEVPoySNE01TKrmTQ== + dependencies: + debug "^3.1.0" + js-yaml "^3.12.0" + json5 "^1.0.1" + object-assign "^4.1.0" + object-keys "^1.0.12" + path-exists "^3.0.0" + require-from-string "^2.0.2" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.8.1: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc= + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@~5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.6.tgz#4f03e83d0486856fb60d97c94882841c2a7b1b7a" + integrity sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" + integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + integrity sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA= + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +realize-package-specifier@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" + integrity sha1-0N74gpUrjeP2frpekRmWYScfQfQ= + dependencies: + dezalgo "^1.0.1" + npm-package-arg "^4.1.1" + +realpath-native@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== + dependencies: + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" + integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +registry-auth-token@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@3.1.0, registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@2, request@^2.74.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +request@~2.75.0: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + integrity sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM= + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.0.0" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requireindex@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7, resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0, retry@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + +rfdc@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" + integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== + +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + integrity sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ= + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= + dependencies: + ajv "^5.0.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.9.1: + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + dependencies: + node-forge "0.7.5" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver-utils@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.4.tgz#cf0405e669a57488913909fc1c3f29bf2a4871e2" + integrity sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA== + +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= + +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== + +serve-handler@5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-5.0.8.tgz#790dbe340dabf1d61bdbaa02ea37dcab372377a8" + integrity sha512-pqk0SChbBLLHfMIxQ55czjdiW7tj2cFy53svvP8e5VqEN/uB/QpfiTJ8k1uIYeFTDVoi+FGi5aqXScuu88bymg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +serve@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/serve/-/serve-10.1.2.tgz#805917f2692ed5d8720bbd1981ac3974d38b7d8d" + integrity sha512-TVH35uwndRlCqSeX3grR3Ntrjx2aBTeu6sx+zTD2CzN2N/rHuEDTvxiBwWbrellJNyWiQFz2xZmoW+UxV+Zahg== + dependencies: + "@zeit/schemas" "2.6.0" + ajv "6.5.3" + arg "2.0.0" + boxen "1.3.0" + chalk "2.4.1" + clipboardy "1.2.3" + compression "1.7.3" + serve-handler "5.0.8" + update-check "1.5.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4= + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon-chai@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" + integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== + +sinon@^6.3.3: + version "6.3.5" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.3.5.tgz#0f6d6a5b4ebaad1f6e8e019395542d1d02c144a0" + integrity sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ== + dependencies: + "@sinonjs/commons" "^1.0.2" + "@sinonjs/formatio" "^3.0.0" + "@sinonjs/samsam" "^2.1.2" + diff "^3.5.0" + lodash.get "^4.4.2" + lolex "^2.7.5" + nise "^1.4.5" + supports-color "^5.5.0" + type-detect "^4.0.8" + +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= + dependencies: + hoek "2.x.x" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +sockjs-client@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" + integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw= + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.10: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + +spawn-please@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-0.3.0.tgz#db338ec4cff63abc69f1d0e08cee9eb8bebd9d11" + integrity sha1-2zOOxM/2Orxp8dDgjO6euL69nRE= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +streamroller@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" + integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== + dependencies: + date-format "^1.2.0" + debug "^3.1.0" + mkdirp "^0.5.1" + readable-stream "^2.3.0" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== + +strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== + dependencies: + has-flag "^2.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.1.0, supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + +table@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== + +tar@^2.0.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" + integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.16.1: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +test-exclude@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +test-exclude@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" + integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== + dependencies: + arrify "^1.0.1" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^1.0.1" + +text-loader@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/text-loader/-/text-loader-0.0.1.tgz#8bf75d749b7c0579c939920051c69ea572ebddc1" + integrity sha1-i/dddJt8BXnJOZIAUcaepXLr3cE= + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" + integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + +tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== + dependencies: + punycode "^1.4.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tryer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uglify-js@^3.1.4: + version "3.5.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.3.tgz#d490bb5347f23025f0c1bc0dee901d98e4d6b063" + integrity sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.1, unique-filename@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universal-serialize@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/universal-serialize/-/universal-serialize-1.0.7.tgz#5e64607c3c941c88f76e77f2b095fafc2f37abed" + integrity sha512-rHWw4zdhPqKqbBu3GbNzdicHRc+0byzAFFcImDMo8x+S9yYfyqYQQcr749NV8jO/0YisMzd+LjeivdbHUzA67A== + +universal-user-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.3.tgz#9f6f09f9cc33de867bb720d84c08069b14937c6c" + integrity sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g== + dependencies: + os-name "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +unzipper@^0.8.11: + version "0.8.14" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b" + integrity sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "~1.0.10" + listenercount "~1.0.1" + readable-stream "~2.1.5" + setimmediate "~1.0.4" + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +update-check@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" + integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== + dependencies: + registry-auth-token "3.3.2" + registry-url "3.1.0" + +update-notifier@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" + integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +useragent@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" + integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== + dependencies: + lru-cache "4.1.x" + tmp "0.0.x" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== + +v8flags@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.2.tgz#fc5cd0c227428181e6c29b2992e4f8f1da5e0c9f" + integrity sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw== + dependencies: + homedir-polyfill "^1.0.1" + +validate-npm-package-license@*, validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +validate-npm-package-name@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" + integrity sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU= + dependencies: + builtins "0.0.7" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.2.0.tgz#0630d298e88511d036d7c823705d7b852593d5c4" + integrity sha512-F6bwrg5TBb9HsHZCltH1L5F091ELQ+/i67MEH7jWkYRvVp53eONNneGaIXSdOQUiXUyd3RnkITWRfWvSVQGnZQ== + dependencies: + acorn "^6.0.7" + acorn-walk "^6.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.1.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.0.tgz#55c8a74cae1e88117f9dda3a801c7272e93ca318" + integrity sha512-t1M7G4z5FhHKJ92WRKwZ1rtvi7rHc0NZoZRbSkol0YKl4HvcC8+DsmGDmK7MmZxHSAetHagiOsjOB6MmzC2TUw== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.5" + +webpack-dev-middleware@^3.2.0, webpack-dev-middleware@^3.5.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942" + integrity sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg== + dependencies: + memory-fs "^0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.14: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz#1b45ce3ecfc55b6ebe5e36dab2777c02bc508c4e" + integrity sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^4.1.1" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "^0.19.1" + import-local "^2.0.0" + internal-ip "^4.2.0" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + semver "^5.6.0" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.3.0" + spdy "^4.0.0" + strip-ansi "^3.0.0" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.5.1" + webpack-log "^2.0.0" + yargs "12.0.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.20.2: + version "4.29.6" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" + integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@~1.2.11: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.3.0.tgz#b8f0b66e325d22160751e496337e44b45b727546" + integrity sha1-uPC2bjJdIhYHUeSWM35EtFtydUY= + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + +windows-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1, wrappy@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + integrity sha1-FMZtTkyzygVlwozzt6bz5NWTj6s= + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-json-file@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + +yargs@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^12.0.2, yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^4.2.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +yargs@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +zalgo-promise@^1.0.11, zalgo-promise@^1.0.22, zalgo-promise@^1.0.28, zalgo-promise@^1.0.3: + version "1.0.38" + resolved "https://registry.yarnpkg.com/zalgo-promise/-/zalgo-promise-1.0.38.tgz#6acdb8990954eabab505c0c3bde47523fd927d33" + integrity sha512-+dj0kZU9poywiJ3nIFns3o10XXbbptugvO51TxwD8/V0SIEi+Jw/of0MeJZ8CO7gH9jqzD0MQ/Q1PXAx8GlOQw== From ccb945020be1e22f53ad98e3d2f255bd558e8215 Mon Sep 17 00:00:00 2001 From: Justin Nguyen Date: Mon, 8 Apr 2019 19:39:02 +0700 Subject: [PATCH 2/2] rebuild --- dist/module/child/index.js | 1 + dist/zoid.frame.js.map | 2 +- dist/zoid.frame.min.js.map | 2 +- dist/zoid.frameworks.js.map | 2 +- dist/zoid.frameworks.min.js.map | 2 +- dist/zoid.js.map | 2 +- dist/zoid.min.js.map | 2 +- package.json | 2 +- src/child/index.js | 514 +++++++++++++++----------------- 9 files changed, 243 insertions(+), 286 deletions(-) diff --git a/dist/module/child/index.js b/dist/module/child/index.js index 04092c45..179eb3f7 100644 --- a/dist/module/child/index.js +++ b/dist/module/child/index.js @@ -62,6 +62,7 @@ class ChildComponent { if (childPayload.version !== __ZOID__.__VERSION__) { const msg = `Parent window has zoid version ${childPayload.version}, child window has version ${__ZOID__.__VERSION__}`; // throw new Error(msg); + // eslint-disable-next-line no-console console.log(msg); } diff --git a/dist/zoid.frame.js.map b/dist/zoid.frame.js.map index a691982a..e8d2b08f 100644 --- a/dist/zoid.frame.js.map +++ b/dist/zoid.frame.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frame.min.js.map b/dist/zoid.frame.min.js.map index 46d3ef38..87df0e24 100644 --- a/dist/zoid.frame.min.js.map +++ b/dist/zoid.frame.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frame.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frameworks.js.map b/dist/zoid.frameworks.js.map index 8551a194..1f635bfb 100644 --- a/dist/zoid.frameworks.js.map +++ b/dist/zoid.frameworks.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.frameworks.min.js.map b/dist/zoid.frameworks.min.js.map index e94583d7..1d705fad 100644 --- a/dist/zoid.frameworks.min.js.map +++ b/dist/zoid.frameworks.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,IACA,mBAAAG,eAAAC,IACAD,OAAA,UAAAH,GACA,iBAAAC,QACAA,QAAA,KAAAD,IAEAD,EAAA,KAAAC,IARA,CASC,oBAAAK,UAAAC,KAAA,WACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAR,QAGA,IAAAC,EAAAK,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAV,QAAA,IAUA,OANAW,EAAAH,GAAAI,KAAAX,EAAAD,QAAAC,IAAAD,QAAAO,GAGAN,EAAAS,GAAA,EAGAT,EAAAD,QA0DA,OArDAO,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAf,EAAAgB,EAAAC,GACAV,EAAAW,EAAAlB,EAAAgB,IACAG,OAAAC,eAAApB,EAAAgB,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAAvB,GACA,oBAAAwB,eAAAC,aACAN,OAAAC,eAAApB,EAAAwB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAApB,EAAA,cAAiD0B,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAAjC,GACA,IAAAgB,EAAAhB,KAAA4B,WACA,WAA2B,OAAA5B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAM,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,MAAAjB,GAAAkB,eAAAzB,KAAAuB,EAAAC,IAGtD7B,EAAA+B,EAAA,GAIA/B,IAAAgC,EAAA,kDClFe,SAASC,IAetB,OAdAA,EAAWrB,OAAOsB,QAAU,SAAUC,GACpC,IAAK,IAAIjC,EAAI,EAAGA,EAAIkC,UAAUC,OAAQnC,IAAK,CACzC,IAAIoC,EAASF,UAAUlC,GAEvB,IAAK,IAAIuB,KAAOa,GACV1B,IAAiBkB,eAAezB,KAAKiC,EAAQb,KAC/CU,EAAOV,GAAOa,EAAOb,IAK3B,OAAOU,IAGOI,MAAMzC,KAAMsC,WCbvB,SAASI,EAAUC,GACtB,IACI,IAAKA,EACD,OAAO,EAGX,GAAuB,oBAAZC,SAA2BD,aAAgBC,QAClD,OAAO,EAGX,GAAsB,oBAAXC,QAA0BA,OAAOC,QAAUH,aAAgBE,OAAOC,OACzE,OAAO,EAGX,GAAsB,oBAAXD,QAA0BA,OAAOE,aAAeJ,aAAgBE,OAAOE,YAC9E,OAAO,EAGX,IAAIC,EAAY,GAAIA,SAEpB,GAAIA,EAAU,CACV,IAAIrC,EAAOqC,EAASzC,KAAKoC,GAEzB,GAAa,oBAAThC,GAAuC,oBAATA,GAAuC,uBAATA,EAC5D,OAAO,EAIf,GAAyB,mBAAdgC,EAAKM,KACZ,OAAO,EAEb,MAAOC,GACL,OAAO,EAGX,OAAO,+CCjCX,ICCIC,EDDEC,EAAmB,GACnBC,EAAmC,GCDrCC,EAAc,EAGlB,SAASC,IACL,IAAKD,GAAeH,EAAc,CAC9B,IAAMK,EAAUL,EAChBA,EAAe,KACfK,EAAQC,WAIT,SAASC,IACZJ,GAAe,EAGZ,SAASK,IACZL,GAAe,EACfC,ICfG,IAAMK,EAAb,WAeI,SAAAA,EAAYC,GAAuF,IAAAC,EAAA9D,KAQ/F,GAR+FA,KAbnG+D,cAamG,EAAA/D,KAZnGgE,cAYmG,EAAAhE,KAXnGiE,kBAWmG,EAAAjE,KAVnGqB,WAUmG,EAAArB,KATnGkE,WASmG,EAAAlE,KARnGmE,cAQmG,EAAAnE,KAHnGoE,iBAGmG,EAAApE,KAFnGqE,WAEmG,EAE/FrE,KAAK+D,UAAW,EAChB/D,KAAKgE,UAAW,EAChBhE,KAAKiE,cAAe,EAEpBjE,KAAKmE,SAAW,GAEZN,EAAS,CAET,IAAIS,EACAJ,EACAH,GAAW,EACXC,GAAW,EACXO,GAAU,EAEdb,IAEA,IACIG,EAAQ,SAAAW,GACAD,EACAT,EAAKL,QAAQe,IAEbT,GAAW,EACXO,EAASE,IAGd,SAAAtB,GACKqB,EACAT,EAAKW,OAAOvB,IAEZc,GAAW,EACXE,EAAQhB,KAIlB,MAAOA,GAGL,OAFAS,SACA3D,KAAKyE,OAAOvB,GAIhBS,IAEAY,GAAU,EAENR,EAEA/D,KAAKyD,QAAQa,GACNN,GACPhE,KAAKyE,OAAOP,IAjE5B,IAAAQ,EAAAd,EAAAe,UAAA,OAAAD,EA8EIjB,QAAA,SAAQa,GACJ,GAAItE,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,GAAI0C,EAAU4B,GACV,MAAM,IAAIM,MAAM,gDAOpB,OAJA5E,KAAK+D,UAAW,EAChB/D,KAAKqB,MAAQiD,EACbtE,KAAK6E,WAEE7E,MA3Ff0E,EA8FID,OAAA,SAAOP,GAAiC,IAAAY,EAAA9E,KACpC,GAAIA,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,GAAI0C,EAAUwB,GACV,MAAM,IAAIU,MAAM,+CAGpB,IAAKV,EAAO,CACR,IAAIhB,EAAOgB,GAAmC,mBAAnBA,EAAMlB,SAA0BkB,EAAMlB,WAAalC,GAAiBkC,SAASzC,KAAK2D,GAC7GA,EAAQ,IAAIU,MAAJ,gDAA2D1B,GAgBvE,OAbAlD,KAAKgE,UAAW,EAChBhE,KAAKkE,MAAQA,EAERlE,KAAKiE,cACNc,WAAW,WACFD,EAAKb,cFhHnB,SAA2Cf,EAAaM,GAE3D,IAAuC,IAAnCJ,EAAiB4B,QAAQ9B,GAA7B,CAIAE,EAAiB6B,KAAK/B,GAEtB6B,WAAW,WAMP,MAAM7B,GACP,GAEH,IAAK,IAAIgC,EAAI,EAAGA,EAAI7B,EAAiCd,OAAQ2C,IAEzD7B,EAAiC6B,GAAGhC,EAAKM,IE8F7B2B,CAA+BjB,EAAOY,IAE3C,GAGP9E,KAAK6E,WAEE7E,MAzHf0E,EA4HIU,YAAA,SAAYlB,GAGR,OAFAlE,KAAKiE,cAAe,EACpBjE,KAAKyE,OAAOP,GACLlE,MA/Hf0E,EAkIIG,SAAA,WAAW,IAAAQ,EAAArF,KAEY+D,EAAiC/D,KAAjC+D,SAAUC,EAAuBhE,KAAvBgE,SAAUG,EAAanE,KAAbmE,SAEvC,IAFoDnE,KAA9CoE,cAMDL,GAAaC,GAAlB,CAIAhE,KAAKoE,aAAc,EACnBV,IAEA,IAfO,IAAA4B,EAAA,SAeElF,GAfF,IAAAmF,EAiBmCpB,EAAS/D,GAAzCoF,EAjBHD,EAiBGC,UAAWC,EAjBdF,EAiBcE,QAASjC,EAjBvB+B,EAiBuB/B,QAEtBc,OAAM,EAEV,GAAIP,EAEA,IACIO,EAASkB,EAAYA,EAAUH,EAAKhE,OAASgE,EAAKhE,MACpD,MAAO6B,GAEL,OADAM,EAAQiB,OAAOvB,GACf,gBAGD,GAAIc,EAAU,CAEjB,IAAKyB,EAED,OADAjC,EAAQiB,OAAOY,EAAKnB,OACpB,WAGJ,IACII,EAASmB,EAAQJ,EAAKnB,OACxB,MAAOhB,GAEL,OADAM,EAAQiB,OAAOvB,GACf,YAIJoB,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,WAEzDM,EAAOP,SACPP,EAAQC,QAAQa,EAAOjD,OAEvBmC,EAAQiB,OAAOH,EAAOJ,OAG1BI,EAAOL,cAAe,GAEfvB,EAAU4B,GAEbA,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,UACzDM,EAAOP,SACPP,EAAQC,QAAQa,EAAOjD,OAEvBmC,EAAQiB,OAAOH,EAAOJ,OAK1BI,EAAOrB,KAAK,SAAAuB,GACRhB,EAAQC,QAAQe,IACjB,SAAAtB,GACCM,EAAQiB,OAAOvB,KAMvBM,EAAQC,QAAQa,IA5DflE,EAAI,EAAGA,EAAI+D,EAAS5B,OAAQnC,IAAKkF,EAAjClF,GAgET+D,EAAS5B,OAAS,EAClBvC,KAAKoE,aAAc,EACnBT,MAnNRe,EAsNIzB,KAAA,SAA2BuC,EAA0DC,GAEjF,GAAID,GAAkC,mBAAdA,IAA6BA,EAAUjF,KAC3D,MAAM,IAAIqE,MAAM,wDAGpB,GAAIa,GAA8B,mBAAZA,IAA2BA,EAAQlF,KACrD,MAAM,IAAIqE,MAAM,sDAGpB,IAAIpB,EAAgC,IAAII,EAYxC,OAVA5D,KAAKmE,SAASc,KAAK,CACfzB,UACAgC,YACAC,YAGJzF,KAAKiE,cAAe,EAEpBjE,KAAK6E,WAEErB,GA5OfkB,EA+OIgB,MAAA,SAA4BD,GACxB,OAAOzF,KAAKiD,UAAK0C,EAAWF,IAhPpCf,EAmPIkB,QAAA,SAAQC,GAEJ,GAAIA,GAAkC,mBAAdA,IAA6BA,EAAUtF,KAC3D,MAAM,IAAIqE,MAAM,uCAGpB,OAAO5E,KAAKiD,KAAK,SAACqB,GACd,OAAOV,EAAakC,IAAID,GACnB5C,KAAK,WACF,OAAOqB,KAEhB,SAACpB,GACA,OAAOU,EAAakC,IAAID,GACnB5C,KAAK,WACF,MAAMC,OAjQ1BwB,EAsQIqB,QAAA,SAAQC,EAAe9C,GAAgC,IAAA+C,EAAAjG,KAEnD,GAAIA,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,IAAI+F,EAAUhB,WAAW,WAEjBkB,EAAKlC,UAAYkC,EAAKjC,UAI1BiC,EAAKxB,OAAOvB,GAAO,IAAI0B,MAAJ,2BAAsCoB,EAAtC,QAEpBA,GAEH,OAAOhG,KAAKiD,KAAK,SAAAqB,GAEb,OADA4B,aAAaH,GACNzB,KAxRnBI,EA6RIyB,UAAA,WAEI,GAAuB,oBAAZvD,QACP,MAAM,IAAIwD,UAAJ,0BAGV,OAAOxD,QAAQa,QAAQzD,OAnS/B4D,EAsSWH,QAAP,SAA0BpC,GAEtB,OAAIA,aAAiBuC,EACVvC,EAGPqB,EAAUrB,GAEH,IAAIuC,EAAa,SAACH,EAASgB,GAAV,OAAqBpD,EAAM4B,KAAKQ,EAASgB,MAG9D,IAAIb,GAAeH,QAAQpC,IAjT1CuC,EAoTWa,OAAP,SAAcP,GACV,OAAO,IAAIN,GAAea,OAAOP,IArTzCN,EAwTWwB,YAAP,SAAmBlB,GACf,OAAO,IAAIN,GAAewB,YAAYlB,IAzT9CN,EA4TWyC,IAAP,SAA+LC,GAE3L,IAAI9C,EAAU,IAAII,EACd2C,EAAQD,EAAS/D,OACjBiE,EAAU,GAEd,IAAKD,EAED,OADA/C,EAAQC,QAAQ+C,GACThD,EAGX,IAXqQ,IAAAiD,EAAA,SAW5PrG,GACL,IAAIsG,EAAOJ,EAASlG,GAEpB,GAAIsG,aAAgB9C,GAChB,GAAI8C,EAAK3C,SAGL,OAFAyC,EAAQpG,GAAKsG,EAAKrF,MAClBkF,GAAS,EACT,gBAED,IAAK7D,EAAUgE,GAGlB,OAFAF,EAAQpG,GAAKsG,EACbH,GAAS,EACT,WAGJ3C,EAAaH,QAAQiD,GAAMzD,KAAK,SAAAqB,GAC5BkC,EAAQpG,GAAKkE,EAEC,IADdiC,GAAS,IAEL/C,EAAQC,QAAQ+C,IAErB,SAAAtD,GACCM,EAAQiB,OAAOvB,MAtBd9C,EAAI,EAAGA,EAAIkG,EAAS/D,OAAQnC,IAAKqG,EAAjCrG,GA8BT,OAJc,IAAVmG,GACA/C,EAAQC,QAAQ+C,GAGbhD,GArWfI,EAwWW+C,KAAP,SAAkCL,GAC9B,IAAIhC,EAAS,GAEb,OAAOV,EAAayC,IAAIvF,OAAO8F,KAAKN,GAAUO,IAAI,SAAAlF,GAC9C,OAAOiC,EAAaH,QAAQ6C,EAAS3E,IAAMsB,KAAK,SAAA5B,GAC5CiD,EAAO3C,GAAON,OAElB4B,KAAK,WACL,OAAOqB,KAhXnBV,EAoXWiD,IAAP,SAAiBC,EAAkBC,GAE/B,OAAOnD,EAAayC,IAAIS,EAAMD,IAAIE,KAtX1CnD,EAyXWoD,6BAAP,SAAoCnD,GAChC,OFlWD,SAAsCA,GAGzC,OAFAR,EAAiC4B,KAAKpB,GAE/B,CACHoD,OADG,WAEC5D,EAAiC6D,OAAO7D,EAAiC2B,QAAQnB,GAAU,KE6VxFmD,CAA6BnD,IA1X5CD,EA6XWkC,IAAP,SAA8DiB,EAAiDI,EAAcC,GAEzH,GAAIL,GAA4B,mBAAXA,IAA0BA,EAAOxG,KAClD,MAAM,IAAIqE,MAAM,mCAGpB,IAAIN,EAEJZ,IAEA,IAEIY,EAASyC,EAAOtE,MAAM0E,EAASC,GAAQ,IACzC,MAAOlE,GAEL,OADAS,IACOC,EAAaa,OAAOvB,GAK/B,OAFAS,IAEOC,EAAaH,QAAQa,IAjZpCV,EAoZWyD,MAAP,SAAaA,GACT,OAAO,IAAIzD,EAAa,SAAAH,GACpBsB,WAAWtB,EAAS4D,MAtZhCzD,EA0ZWlB,UAAP,SAAiBrB,GAEb,SAAIA,GAASA,aAAiBuC,IAIvBlB,EAAUrB,IAhazBuC,EAmaW0D,MAAP,WACI,ODjZA9D,EAAUL,EAAeA,GAAgB,ICiZtBS,EDhZvBL,IACOC,EAHJ,IACCA,GCnBRI,EAAA,GCJO,SAAS2D,EAAQ5E,GACpB,MAAgD,oBAAzC7B,GAAiBkC,SAASzC,KAAKoC,GCDnC,IAAM6E,EAAW,CACpBC,KAAQ,QACRC,KAAQ,QACRC,MAAQ,UAGCC,EAAW,IAEXC,EAAc,CACvBC,OAAS,SACTC,MAAS,SCLTC,EAAsB,mCAMnB,SAASC,EAAgBC,GAC5B,YAD2E,IAA/CA,MAA6BrF,QAClDqF,EAAIC,SAASC,WAAaZ,EAASG,MAGvC,SAASU,EAAUH,GAEtB,GAAKA,EAIL,IACI,GAAIA,EAAII,QAAUJ,EAAII,SAAWJ,EAC7B,OAAOA,EAAII,OAEjB,MAAOpF,KAKN,SAASqF,EAAUL,GAEtB,GAAKA,IAKDG,EAAUH,GAId,IACI,OAAOA,EAAIM,OACb,MAAOtF,KAKN,SAASuF,EAAkBP,GAC9B,IAGI,OAAO,EACT,MAAOhF,IAIT,OAAO,EAGJ,SAASwF,EAAgBR,GAI5B,IAAIC,GAFJD,EAAMA,GAAOrF,QAEMsF,SAEnB,IAAKA,EACD,MAAM,IAAIvD,MAAJ,gCAGV,IAAIwD,EAAWD,EAASC,SAExB,IAAKA,EACD,MAAM,IAAIxD,MAAJ,gCAGV,GAAIwD,IAAaZ,EAASE,KACtB,OAAWF,EAASE,KAApB,KAGJ,GAAIU,IAAaZ,EAASG,MAAO,CAE7B,IAAIW,EAASD,EAAUH,GACvB,OAAII,GAAUG,IAEHC,EAAgBJ,GAGhBd,EAASG,MAApB,KAGJ,IAAIgB,EAAOR,EAASQ,KAEpB,IAAKA,EACD,MAAM,IAAI/D,MAAJ,4BAGV,OAAWwD,EAAX,KAA0BO,EAGvB,SAASC,EAAUV,GAItB,IAAIW,EAASH,EAFbR,EAAMA,GAAOrF,QAIb,OAAIgG,GAAUX,EAAIY,YAAwD,IAA1CZ,EAAIY,WAAW9D,QAAQwC,EAASC,MACrDS,EAAIY,WAGRD,EAgEJ,SAASE,EAAab,GAEzB,IA9CG,SAA8BA,GAEjC,IACI,GAAIA,IAAQrF,OACR,OAAO,EAGb,MAAOK,IAIT,IACI,IAAI8F,EAAOlI,OAAOmI,yBAAyBf,EAAK,YAEhD,GAAIc,IAA4B,IAApBA,EAAKhI,WACb,OAAO,EAGb,MAAOkC,IAIT,IAEI,GAAI+E,EAAgBC,IAAQO,IACxB,OAAO,EAEb,MAAOvF,IAIT,IAEI,GAAIwF,EAAgBR,KAASQ,EAAgB7F,QACzC,OAAO,EAGb,MAAOK,IAIT,OAAO,EAKFgG,CAAqBhB,GACtB,OAAO,EAGX,IAEI,GAAIA,IAAQrF,OACR,OAAO,EAIX,GAAIoF,EAAgBC,IAAQO,IACxB,OAAO,EAIX,GAAIG,EAAU/F,UAAY+F,EAAUV,GAChC,OAAO,EAGb,MAAOhF,IAIT,OAAO,EAIJ,SAASiG,EAAiBjB,GAC7B,IAAKa,EAAab,GACd,MAAM,IAAItD,MAAJ,qCAIV,OAAOsD,EAqBJ,SAASkB,EAAiBd,EAAgCe,GAE7D,IAAKf,IAAWe,EACZ,OAAO,EAGX,IAAIC,EAAcjB,EAAUgB,GAE5B,OAAIC,EACOA,IAAgBhB,GAGgB,IA9BxC,SAAoBJ,GAEvB,IAAI5D,EAAS,GAEb,IAEI,KAAO4D,EAAII,SAAWJ,GAClB5D,EAAOW,KAAKiD,EAAII,QAChBJ,EAAMA,EAAII,OAGhB,MAAOpF,IAIT,OAAOoB,EAeHiF,CAAWF,GAAOrE,QAAQsD,GAO3B,SAASkB,EAAUtB,GAEtB,IAEIuB,EAQAC,EAVApF,EAAS,GAIb,IACImF,EAASvB,EAAIuB,OACf,MAAOvG,GACLuG,EAASvB,EAKb,IACIwB,EAAMD,EAAOlH,OACf,MAAOW,IAIT,GAAY,IAARwG,EACA,OAAOpF,EAGX,GAAIoF,EAAK,CACL,IAAK,IAAItJ,EAAI,EAAGA,EAAIsJ,EAAKtJ,IAAK,CAE1B,IAAIuJ,OAAK,EAET,IACIA,EAAQF,EAAOrJ,GACjB,MAAO8C,GACL,SAGJoB,EAAOW,KAAK0E,GAGhB,OAAOrF,EAGX,IAAK,IAAIlE,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC1B,IAAIuJ,OAAK,EAET,IACIA,EAAQF,EAAOrJ,GACjB,MAAO8C,GACL,OAAOoB,EAGX,IAAKqF,EACD,OAAOrF,EAGXA,EAAOW,KAAK0E,GAGhB,OAAOrF,EAIJ,SAASsF,EAAkB1B,GAA4D,IAE1F,IAAI5D,EAAS,GAF6EuF,EAAA,EAAAC,EAIxEN,EAAUtB,GAJ8D2B,EAAAC,EAAAvH,OAAAsH,IAIxD,CAA7B,IAAIF,EAAKG,EAAAD,GACVvF,EAAOW,KAAK0E,GADkB,QAAAI,EAAA,EAAAC,EAGPJ,EAAkBD,GAHXI,EAAAC,EAAAzH,OAAAwH,IAI1BzF,EAAOW,KADQ+E,EAAAD,IAKvB,OAAOzF,EAGJ,SAAS2F,EAAO/B,GAEnB,GAAKA,EAAL,CAIA,IACI,GAAIA,EAAIgC,IACJ,OAAOhC,EAAIgC,IAEjB,MAAOhH,IAIT,GAAImF,EAAUH,KAASA,EACnB,OAAOA,EAGX,IACI,GAAIkB,EAAiBvG,OAAQqF,IAAQrF,OAAOqH,IACxC,OAAOrH,OAAOqH,IAEpB,MAAOhH,IAIT,IACI,GAAIkG,EAAiBlB,EAAKrF,SAAWA,OAAOqH,IACxC,OAAOrH,OAAOqH,IAEpB,MAAOhH,IA9BgE,QAAAiH,EAAA,EAAAC,EAkCvDR,EAAkB1B,GAlCqCiC,EAAAC,EAAA7H,OAAA4H,IAkC/B,CAArC,IAAIR,EAAKS,EAAAD,GACV,IACI,GAAIR,EAAMO,IACN,OAAOP,EAAMO,IAEnB,MAAOhH,IAIT,GAAImF,EAAUsB,KAAWA,EACrB,OAAOA,IAmBZ,SAASU,EAAqBnC,GACjC,IAAIgC,EAAMD,EAAO/B,GAEjB,IAAKgC,EACD,MAAM,IAAItF,MAAJ,gCAGV,SAAA0F,OAAYV,EAAkBM,GAA9B,CAAoCA,IAoDxC,IAAIK,EAAgB,GAChBC,EAAe,GAEZ,SAASC,EAAevC,EAA6BwC,QAAsC,IAAtCA,OAAsB,GAE9E,IACI,GAAIxC,IAAQrF,OACR,OAAO,EAEb,MAAOK,GACL,OAAO,EAGX,IACI,IAAKgF,EACD,OAAO,EAGb,MAAOhF,GACL,OAAO,EAGX,IACI,GAAIgF,EAAIyC,OACJ,OAAO,EAGb,MAAOzH,GAIL,OAAIA,GAAOA,EAAI0H,UAAY5C,EAQ/B,GAAI0C,GAAa3B,EAAab,GAC1B,IAEI,GAAIA,EAAI2C,WACJ,OAAO,EAEb,MAAO3H,IAOb,IACI,IAAKgF,EAAII,SAAWJ,EAAIgC,IACpB,OAAO,EAEb,MAAOhH,IAeT,IAAI4H,EAtFR,SAAwBC,EAAuBpI,GAC3C,IAAK,IAAIvC,EAAI,EAAGA,EAAI2K,EAAWxI,OAAQnC,IAEnC,IACI,GAAI2K,EAAW3K,KAAOuC,EAClB,OAAOvC,EAEb,MAAO8C,IAKb,OAAQ,EA0EU8H,CAAYT,EAAerC,GAE7C,IAAqB,IAAjB4C,EAAoB,CACpB,IAAInB,EAAQa,EAAaM,GAEzB,GAAInB,GA9GL,SAA6BA,GAEhC,IAAKA,EAAMsB,cACP,OAAO,EAGX,IAAKtB,EAAMuB,WACP,OAAO,EAGX,IAAIC,EAAMxB,EAAMyB,cAEhB,SAAID,IAAOA,EAAIE,iBAAoBF,EAAIE,gBAAgBC,SAAS3B,IAkG/C4B,CAAoB5B,GAC7B,OAAO,EAIf,OAAO,EAgIJ,SAAS6B,EAAYtD,GAKxB,OAFaK,EAFbL,EAAMA,GAAOrF,SAQAwF,EAAUH,SAEvB,EA+DJ,SAASuD,EAASC,EAAaC,GAAuB,QAAAC,EAAA,EAAAA,EAEhCF,EAFgCnJ,OAAAqJ,IAEnB,IAA1B,IAAIC,EAASH,EAAJE,GAAiBE,EAAA,EAAAA,EACTH,EADSpJ,OAAAuJ,IAEvB,GAAID,IADUF,EAAJG,GAEN,OAAO,EAKnB,OAAO,EAGJ,SAASC,EAAmB7D,QAA+C,IAA/CA,MAA8BrF,QAI7D,IAHA,IAAImJ,EAAW,EACX1D,EAASJ,EAENI,IACHA,EAASD,EAAUC,MAEf0D,GAAY,GAIpB,OAAOA,EAqBJ,SAASC,EAAgBC,EAA8BC,GAE1D,IAAIC,EAAOnC,EAAOiC,IAASA,EACvBG,EAAOpC,EAAOkC,IAASA,EAE3B,IACI,GAAIC,GAAQC,EACR,OAAID,IAASC,EAMnB,MAAOnJ,IAIT,IAAIoJ,EAAajC,EAAqB6B,GAClCK,EAAalC,EAAqB8B,GAEtC,GAAIV,EAASa,EAAYC,GACrB,OAAO,EAGX,IAAIC,EAAUjE,EAAU6D,GACpBK,EAAUlE,EAAU8D,GAExB,QAAIG,GAAWf,EAASpB,EAAqBmC,GAAUD,KAInDE,GAAWhB,EAASpB,EAAqBoC,GAAUH,GAC5C,IAMR,SAASI,EAAYC,EAAyBC,GAEjD,GAAuB,iBAAZD,EAAsB,CAE7B,GAAsB,iBAAXC,EACP,OAAOD,IAAY/E,GAAYgF,IAAWD,EAG9C,GAAIpF,EAAQqF,GACR,OAAO,EAGX,GAAIC,MAAMC,QAAQF,GACd,OAAO,EAIf,OAAIrF,EAAQoF,GAEJpF,EAAQqF,GACDD,EAAQ3J,aAAe4J,EAAO5J,YAGrC6J,MAAMC,QAAQF,IAKXG,QAAQH,EAAOI,MAAML,MAG5BE,MAAMC,QAAQH,KAEVE,MAAMC,QAAQF,GACPK,KAAKC,UAAUP,KAAaM,KAAKC,UAAUN,IAGlDrF,EAAQqF,IAILD,EAAQQ,KAAK,SAAAC,GAAU,OAAIV,EAAYU,EAAYR,MAgB3D,SAASS,EAAiBC,GAI7B,OAAIA,EAAIN,MAAM,4BACDM,EAKGC,MAAM,KAAKC,MAAM,EAAG,GAAGC,KAAK,KAHjC7E,IAQR,SAAS8E,EAAcxF,EAA6ByF,EAAqBtG,EAAuBuG,GAEnG,IAAI7H,EAuBJ,YAzB0J,IAA9EsB,MAAiB,UAA6D,IAAvDuG,MAAmBC,KAI1G,SAARC,IAEA,GAAIrD,EAAevC,GAMf,OAJInC,GACAG,aAAaH,GAGV4H,IAGPC,GAAW,EACX1H,aAAaH,IAEb6H,GAAWvG,EACXtB,EAAUhB,WAAW+I,EAAOzG,IAIpCyG,GAEO,CACH7G,OADG,WAEKlB,GACAG,aAAaH,KAOtB,SAASgI,EAASC,GAErB,IACI,GAAIA,IAAQnL,OACR,OAAO,EAEb,MAAOK,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAA4C,oBAAxClH,GAAiBkC,SAASzC,KAAKyN,GAC/B,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAInF,OAAOC,QAAUkL,aAAenL,OAAOC,OACvC,OAAO,EAEb,MAAOI,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAIjO,OAASiO,EACpB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAI1F,SAAW0F,EACtB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAI9D,MAAQ8D,EACnB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAkBf,OAAO,ECr+BJ,SAASgD,EAAeD,EAAuBpI,GAClD,IAAK,IAAIvC,EAAI,EAAGA,EAAI2K,EAAWxI,OAAQnC,IAEnC,IACI,GAAI2K,EAAW3K,KAAOuC,EAClB,OAAOvC,EAEb,MAAO8C,IAKb,OAAQ,ECPZ,ICmDI+K,ECodAC,EFvgBAnN,EAAiBD,OAAOC,eACxBoN,EAAUC,KAAKC,MAAQ,IAEdC,EAAb,WAOI,SAAAA,IAMI,GANUtO,KALdW,UAKc,EAAAX,KAJduO,aAIc,EAAAvO,KAHd4G,UAGc,EAAA5G,KAFdwO,YAEc,EACVL,GAAW,EAGXnO,KAAKW,KAAL,cAA0C,IAAhB8N,KAAKC,WAAmB,GAAlD,KAA0DP,EGnB3D,WAEH,GAAuB,oBAAZQ,QACP,OAAO,EAGX,QAA6B,IAAlB7N,OAAO8N,OACd,OAAO,EAGX,IAEI,IAAIC,EAAc,IAAIF,QAClBG,EAAU,GAOd,OAJAhO,OAAO8N,OAAOE,GAEdD,EAAYE,IAAID,EAJA,mCAMZD,EAAY5N,IAAI6N,GAMtB,MAAO5L,GAEL,OAAO,GHPH8L,GACA,IACIhP,KAAKuO,QAAU,IAAII,QACrB,MAAOzL,IAKblD,KAAK4G,KAAQ,GACb5G,KAAKwO,OAAS,GAtBtB,IAAA9J,EAAA4J,EAAA3J,UAAA,OAAAD,EAyBIuK,sBAAA,WAKI,IAHA,IAAIV,EAAUvO,KAAKuO,QACf3H,EAAO5G,KAAK4G,KAEPxG,EAAI,EAAGA,EAAIwG,EAAKrE,OAAQnC,IAAK,CAClC,IAAIiB,EAAQuF,EAAKxG,GAEjB,GAAI2N,EAAS1M,IAAUoJ,EAAepJ,GAAQ,CAE1C,GAAIkN,EACA,IACIA,EAAQW,OAAO7N,GACjB,MAAO6B,IAKb0D,EAAKM,OAAO9G,EAAG,GACfJ,KAAKwO,OAAOtH,OAAO9G,EAAG,GAEtBA,GAAK,KA9CrBsE,EAmDIyK,kBAAA,SAAkBxN,GAEd,OAAIoM,EAASpM,IArDrB+C,EAmEIqK,IAAA,SAAIpN,EAASN,GAET,IAAKM,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACIA,EAAQQ,IAAIpN,EAAKN,GACnB,MAAO6B,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAerB,CAEH,IAAIhB,EAAOX,KAAKW,KACZyO,EAAQzN,EAAIhB,GAEZyO,GAASA,EAAM,KAAOzN,EACtByN,EAAM,GAAK/N,EAEXN,EAAeY,EAAKhB,EAAM,CACtBU,MAAU,CAAEM,EAAKN,GACjBgO,UAAU,QAzBY,CAE9BrP,KAAKiP,wBAEL,IAAIrI,EAAO5G,KAAK4G,KACZ4H,EAASxO,KAAKwO,OACdc,EAAQtE,EAAYpE,EAAMjF,IAEf,IAAX2N,GACA1I,EAAK3B,KAAKtD,GACV6M,EAAOvJ,KAAK5D,IAEZmN,EAAOc,GAASjO,IA/FhCqD,EAkHIzD,IAAA,SAAIU,GAEA,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAI5N,GACZ,OAAO4M,EAAQtN,IAAIU,GAEzB,MAAOuB,UACElD,KAAKuO,QAIpB,IAAKvO,KAAKmP,kBAAkBxN,GAAM,CAE9B3B,KAAKiP,wBAEL,IACIK,EAAQtE,EADDhL,KAAK4G,KACcjF,GAE9B,IAAe,IAAX2N,EACA,OAGJ,OAAOtP,KAAKwO,OAAOc,GAInB,IAAIF,EAAQzN,EAAI3B,KAAKW,MAErB,GAAIyO,GAASA,EAAM,KAAOzN,EACtB,OAAOyN,EAAM,IAtJ7B1K,EA2JIwK,OAAA,SAAOvN,GAEH,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACIA,EAAQW,OAAOvN,GACjB,MAAOuB,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAYrB,CAEH,IAAIyN,EAAQzN,EAAI3B,KAAKW,MAEjByO,GAASA,EAAM,KAAOzN,IACtByN,EAAM,GAAKA,EAAM,QAAKzJ,OAjBI,CAE9B3F,KAAKiP,wBAEL,IAAIrI,EAAO5G,KAAK4G,KACZ0I,EAAQtE,EAAYpE,EAAMjF,IAEf,IAAX2N,IACA1I,EAAKM,OAAOoI,EAAO,GACnBtP,KAAKwO,OAAOtH,OAAOoI,EAAO,MApL1C5K,EAiMI6K,IAAA,SAAI5N,GAEA,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAI5N,GACZ,OAAO,EAEb,MAAOuB,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAOrB,CAEH,IAAIyN,EAAQzN,EAAI3B,KAAKW,MAErB,SAAIyO,GAASA,EAAM,KAAOzN,GAN1B,OAHA3B,KAAKiP,yBAGa,IADNjE,EAAYhL,KAAK4G,KAAMjF,IAvN/C+C,EAsOI8K,SAAA,SAAS7N,EAASf,GACd,GAAIZ,KAAKuP,IAAI5N,GAET,OAAO3B,KAAKiB,IAAIU,GAGpB,IAAIN,EAAQT,IAEZ,OADAZ,KAAK+O,IAAIpN,EAAKN,GACPA,GA9OfiN,EAAA,GCFO,SAASmB,EAAaC,GACzB,GAAoB,mBAATC,KACP,OAAOA,KAAKD,GACT,GAAsB,oBAAXE,OACd,OAAOA,OAAOC,KAAKH,EAAK,QAAQ1M,SAAS,UAG7C,MAAM,IAAI4B,MAAJ,sCAeH,SAASkL,IAEZ,IAAIC,EAAQ,mBAUZ,MARe,aAAaC,QAAQ,KAAM,WACtC,OAAOD,EAAME,OAAOxB,KAAKyB,MAAMzB,KAAKC,SAAWqB,EAAMxN,WAOzD,IAJakN,GACT,IAAIrB,MAAO+B,cAAc3C,MAAM,GAAI,IAAIwC,QAAQ,IAAK,MACtDA,QAAQ,gBAAiB,IAAII,cAsCnC,SAASC,EAAcjJ,GACnB,IACI,OAAO6F,KAAKC,UAAUL,GAAgBW,MAAMjN,KAAK6G,GAAO,SAACkJ,EAAQC,GAC7D,MAAmB,mBAARA,EACP,WAtBT,SAAqBvC,GAIxB,GAFAC,EAAYA,GAAa,IAAIU,EAEzBX,SAAqD,iBAARA,GAAmC,mBAARA,EACxE,MAAM,IAAIpJ,MAAJ,kBAGV,IAAI4L,EAAMvC,EAAUhN,IAAI+M,GAOxB,OALKwC,IACDA,SAAiBxC,EAAd,IAAuB8B,IAC1B7B,EAAUc,IAAIf,EAAKwC,IAGhBA,EAOwBC,CAAYF,GAA/B,IAEGA,IAEb,MAAOrN,GACL,MAAM,IAAI0B,MAAJ,6DA2CP,SAAS8L,EAAkB3J,GAC9B,IAAI4J,EAAQ,GAGZ,SAASC,IAAgE,QAAAC,EAAAvO,UAAAC,OAArC6E,EAAqC,IAAAyF,MAAAgE,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAArC1J,EAAqC0J,GAAAxO,UAAAwO,GACrE,IAAInP,EAAe0O,EAAcjJ,GAEjC,OAAIuJ,EAAM3O,eAAeL,GACdgP,EAAMhP,IAGjBgP,EAAMhP,GAAOoF,EAAOtE,MAAMzC,KAAMsC,WAC3BsD,QAAQ,kBACE+K,EAAMhP,KAGdgP,EAAMhP,IAOjB,OAJAiP,EAAwBG,MAAQ,WAC5BJ,EAAQ,IAGLC,EAiBJ,SAASI,EAAiBjK,EAAsCkK,EAAqC7J,QAA4B,IAA5BA,MAAoB,IAC5H,IAAIuJ,EAAQ5J,EAAOmK,yBAA2BnK,EAAOmK,0BAA4B,GAC7EvP,EAAM0O,EAAcjJ,GAExB,OAAIuJ,EAAM3O,eAAeL,GACdgP,EAAMhP,GAGJgP,EAAMhP,GAAOsP,EAAKxO,WAAL,EAAS2E,GAKhC,SAAS+J,MAIT,SAASC,GAAKrK,GACjB,IAAIsK,GAAS,EAEb,OAAO,WACH,IAAKA,EAED,OADAA,GAAS,EACFtK,EAAOtE,MAAMzC,KAAMsC,YAkE/B,SAASgP,GAAepO,EAAaqO,GAExC,QAFqE,IAA7BA,MAAiB,GAErDA,GAAS,EACT,MAAO,gCAGX,IACI,IAAKrO,EACD,yBAA2BpC,GAAiBkC,SAASzC,KAAK2C,GAA1D,IAGJ,GAAmB,iBAARA,EACP,OAAOA,EAGX,GAAIA,aAAe0B,MAAO,CACtB,IAAIP,EAAQnB,GAAOA,EAAImB,MACnBuG,EAAU1H,GAAOA,EAAI0H,QAEzB,GAAIvG,GAASuG,EACT,OAAgC,IAA5BvG,EAAMW,QAAQ4F,GACPvG,EAEIuG,EAAX,KAAyBvG,EAE1B,GAAIA,EACP,OAAOA,EACJ,GAAIuG,EACP,OAAOA,EAIf,MAA4B,mBAAjB1H,EAAIF,SACJE,EAAIF,WAGRlC,GAAiBkC,SAASzC,KAAK2C,GAExC,MAAOsO,GACL,yCAA2CF,GAAeE,EAAQD,EAAQ,IAuB3E,SAASrE,GAAUvK,GACtB,MAAoB,iBAATA,EACAA,EAGPA,GAAiC,mBAAlBA,EAAKK,SACbL,EAAKK,WAGTlC,GAAiBkC,SAASzC,KAAKoC,GAsBnC,SAAS8O,GAA8BzD,EAASxL,GACnD,IAAKA,EACD,OAAOwL,EAGX,GAAIlN,OAAOsB,OACP,OAAOtB,OAAOsB,OAAO4L,EAAKxL,GAG9B,IAAK,IAAIb,KAAOa,EACRA,EAAOR,eAAeL,KACtBqM,EAAIrM,GAAOa,EAAOb,IAI1B,OAAOqM,EA8FJ,SAAS0D,GAAa3K,EAAmBf,GAE5C,IAAID,EAWJ,OATA,SAAS4L,IACL5L,EAAUhB,WAAW,WACjBgC,IACA4K,KACD3L,GAGP2L,GAEO,CACH1K,OADG,WAECf,aAAaH,KA8MlB,SAAS6L,GAAkB5D,EAA6BrM,EAAuBf,GAClF,GAAIiM,MAAMC,QAAQkB,IACd,GAAmB,iBAARrM,EACP,MAAM,IAAIyE,UAAJ,iCAEP,GAAmB,iBAAR4H,GAA4B,OAARA,GACf,iBAARrM,EACP,MAAM,IAAIyE,UAAJ,6BAIdtF,OAAOC,eAAeiN,EAAKrM,EAAK,CAC5BkQ,cAAc,EACd7Q,YAAc,EACdC,IAAc,kBAEH+M,EAAIrM,GACX,IAAIN,EAAQT,IAGZ,OADAoN,EAAIrM,GAAON,EACJA,GAEX0N,IAAK,SAAC1N,UAEK2M,EAAIrM,GAEXqM,EAAIrM,GAAON,KAShB,SAASyQ,GAAe9D,GAC3B,MAJwB,iBADHrL,EAKLqL,IAJ6B,OAATrL,GAI4B,oBAAxC7B,GAAiBkC,SAASzC,KAAKyN,GALpD,IAAkBrL,EAQlB,SAASoP,GAAc/D,GAC1B,IAAK8D,GAAe9D,GAChB,OAAO,EAIX,IAAIjL,EAAciL,EAAIjL,YAEtB,GAA2B,mBAAhBA,EACP,OAAO,EAGX,IAAI4B,EAAY5B,EAAY4B,UAE5B,QAAKmN,GAAenN,MAIfA,EAAU3C,eAAe,iBAO3B,SAASgQ,GAA0CrP,EAAUsP,EAAsDC,GAEtH,QAFiJ,IAA3BA,MAAmB,IAErIrF,MAAMC,QAAQnK,GAAO,CAIrB,IAHA,IAAIJ,EAASI,EAAKJ,OACd+B,EAAS,GAFQmC,EAAA,SAIZrG,GAGLwR,GAAetN,EAAQlE,EAAG,WACtB,IAAI+R,EAAUD,EAAcA,EAAP,IAAoB9R,EAApB,GAA+BA,EAGhDiJ,EAAQ4I,EAFHtP,EAAKvC,GAEWA,EAAG+R,GAO5B,OALIJ,GAAc1I,IAAUwD,MAAMC,QAAQzD,MAEtCA,EAAQ2I,GAAc3I,EAAO4I,EAAUE,IAGpC9I,KAdNjJ,EAAI,EAAGA,EAAImC,EAAQnC,IAAKqG,EAAxBrG,GAmBT,OAAOkE,EACJ,GAAIyN,GAAcpP,GAAO,CAC5B,IAAI2B,EAAS,GADe8N,EAAA,SAGnBzQ,GACL,IAAKgB,EAAKX,eAAeL,GACrB,iBAGJiQ,GAAetN,EAAQ3C,EAAK,WACxB,IAAIwQ,EAAUD,EAAcA,EAAP,IAAoBvQ,EAApB,GAAiCA,EAIlD0H,EAAQ4I,EAFHtP,EAAKhB,GAEWA,EAAKwQ,GAO9B,OALIJ,GAAc1I,IAAUwD,MAAMC,QAAQzD,MAEtCA,EAAQ2I,GAAc3I,EAAO4I,EAAUE,IAGpC9I,KAjBf,IAAK,IAAI1H,KAAOgB,EAAMyP,EAAbzQ,GAsBT,OAAO2C,EAEP,MAAM,IAAIM,MAAJ,2BAgFP,SAASyN,GAAUhR,GACtB,OAAOA,QAoBJ,SAASkG,GAAQ5E,GACpB,MAAgD,oBAAzC7B,GAAiBkC,SAASzC,KAAKoC,GAiCnC,SAAS6M,GAAgCxB,EAASrM,EAAcf,GACnE,GAAIoN,EAAIhM,eAAeL,GACnB,OAAOqM,EAAIrM,GAGf,IAAM4O,EAAM3P,IAEZ,OADAoN,EAAIrM,GAAO4O,EACJA,EASJ,SAAS+B,GAAQtE,GAEpB,IAAMuE,EAAQ,GACVC,GAAU,EAEd,MAAO,CACHzD,IADG,SACYpO,EAAegC,GAO1B,OANK6P,IACDxE,EAAIrN,GAAQgC,EACZ3C,KAAKyS,SAAS,kBACHzE,EAAIrN,MAGZgC,GAGX8P,SAXG,SAWM1L,GACDyL,EACAzL,IAEAwL,EAAMtN,KAAKmM,GAAKrK,KAIxBV,IAnBG,WAoBC,IAAMG,EAAU,GAGhB,IAFAgM,GAAU,EAEHD,EAAMhQ,QAAQ,CACjB,IAAMmQ,EAAOH,EAAMI,MACnBnM,EAAQvB,KAAKyN,KAGjB,OAAO9O,EAAayC,IAAIG,GAASvD,KAAKkO,MA0B3C,SAASyB,GAAgBjS,EAAekS,GAC3C,GAAIA,QACA,MAAM,IAAIjO,MAAJ,YAAuBjE,EAAvB,kBAGV,OAAOkS,ECt+BJ,SAASC,KACZ,OAAO/F,QAAQgG,SAASC,OAAiC,aAAxBD,SAASE,WAGvC,SAASC,GAAUxD,GACtB,OAAOA,EAAIM,QAAQ,MAAO,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,MAAO,OAevF,SAASmD,KACZ,OAAOnC,EAAcmC,GAAsB,WACvC,OAAO,IAAIvP,EAAa,SAAAH,GAEpB,GAAIqP,KACA,OAAOrP,IAGX,IAAI2P,EAAWC,YAAY,WACvB,GAAIP,KAEA,OADAQ,cAAcF,GACP3P,KAEZ,QAeR,SAAS8P,GAAWC,GACvB,OAAOxC,EAAcuC,GAAY,WAC7B,IAAIE,EAAS,GAEb,IAAKD,EACD,OAAOC,EAGX,IAAkC,IAA9BD,EAAYxO,QAAQ,KACpB,OAAOyO,EARiC,QAAAC,EAAA,EAAAC,EAW3BH,EAAYjG,MAAM,KAXSmG,EAAAC,EAAApR,OAAAmR,IAWH,CAApC,IAAIE,EAAID,EAAAD,IACTE,EAAOA,EAAKrG,MAAM,MAET,IAAMqG,EAAK,KAChBH,EAAOI,mBAAmBD,EAAK,KAAOC,mBAAmBD,EAAK,KAItE,OAAOH,GACR,CAAED,IAkCF,SAASM,GAAYC,EAAwBC,GAEhD,YAF+F,IAA/CA,MAAkC,IAE7EA,GAAUlT,OAAO8F,KAAKoN,GAAOzR,aAXmC,KAA7CyL,EAeL7L,EAAA,GACZoR,GAAWQ,GACXC,MAjBiBhG,EAAgC,IAEjDlN,OAAO8F,KAAKoH,GAAKiG,OAAO,SAAAtS,GAC3B,MAA2B,iBAAbqM,EAAIrM,KACnBkF,IAAI,SAAAlF,GACH,OAAWuR,GAAUvR,GAArB,IAA+BuR,GAAUlF,EAAIrM,MAC9C8L,KAAK,MAMGsG,EAZR,IAAqB/F,EA6MrB,SAASkG,GAAYC,EAAyB9K,GACjD8K,EAAUD,YAAY7K,GAGnB,SAAS+K,GAAUC,GAEtB,OAAIA,aAAmBxR,OAAOyR,SAId,OAAZD,GAAuC,iBAAZA,GAA6C,IAArBA,EAAQE,UAA2C,iBAAlBF,EAAQG,OAAuD,iBAA1BH,EAAQjJ,cAOlI,SAASqJ,GAAeC,EAAqBvJ,GAEhD,YAFwG,IAAxDA,MAA+B4H,UAE3EqB,GAAUM,GAEHA,EAGO,iBAAPA,EACAvJ,EAAIwJ,cAAcD,QAD7B,EAgBG,SAASE,GAAaF,GACzB,OAAO,IAAI9Q,EAAa,SAACH,EAASgB,GAE9B,IAAI9D,EAAOuM,GAAUwH,GACjBG,EAAKJ,GAAeC,GAExB,GAAIG,EACA,OAAOpR,EAAQoR,GAGnB,GAAI/B,KACA,OAAOrO,EAAO,IAAIG,MAAJ,iCAA4CjE,EAA5C,oBAGlB,IAAIyS,EAAWC,YAAY,WAIvB,OAFAwB,EAAKJ,GAAeC,KAGhBpB,cAAcF,GACP3P,EAAQoR,IAGf/B,MACAQ,cAAcF,GACP3O,EAAO,IAAIG,MAAJ,iCAA4CjE,EAA5C,0BAFlB,GAID,MAIJ,SAASmU,GAAelK,GAC3B5K,KAAK4K,QAAUA,EA6IZ,SAASmK,GAAepL,GAG3B,IAFAuE,EAAyBA,GAA0B,IAAIS,GAE5BY,IAAI5F,GAAQ,CACnC,IAAInG,EAAU0K,EAAuBjN,IAAI0I,GACzC,GAAInG,EACA,OAAOA,EAIf,IAAIA,EAAU,IAAII,EAAa,SAACH,EAASgB,GACrCkF,EAAMqL,iBAAiB,OAAQ,YJYhC,SAAyBrL,GAI5B,GArBJ,WACI,IAAK,IAAIvJ,EAAI,EAAGA,EAAImK,EAAchI,OAAQnC,IAAK,CAC3C,IAAIuK,GAAS,EAEb,IACIA,EAASJ,EAAcnK,GAAGuK,OAC5B,MAAOzH,IAILyH,IACAH,EAAatD,OAAO9G,EAAG,GACvBmK,EAAcrD,OAAO9G,EAAG,KAOhC6U,GAEItL,GAASA,EAAMsB,cACf,IACIV,EAActF,KAAK0E,EAAMsB,eACzBT,EAAavF,KAAK0E,GACpB,MAAOzG,MInBLgS,CAAgBvL,GAChBlG,EAAQkG,KAGZA,EAAMqL,iBAAiB,QAAS,SAAC9R,GACzByG,EAAMsB,cACNxH,EAAQkG,GAERlF,EAAOvB,OAOnB,OAFAgL,EAAuBa,IAAIpF,EAAOnG,GAE3BA,EAGJ,SAAS2R,GAAiBxL,GAC7B,OAAOoL,GAAepL,GAAO1G,KAAK,SAAAmS,GAE9B,IAAKA,EAAYnK,cACb,MAAM,IAAIrG,MAAJ,mCAGV,OAAOwQ,EAAYnK,gBA+DpB,SAASoK,GAAOC,EAAyCnB,QAA8C,IAAvFmB,MAAqC,IAExD,IACId,EAAQc,EAAQd,OAAS,GAEzB7K,EAhED,SAAuB4L,EAAsBD,EAAmCnB,QAAwC,IAAjGoB,MAAe,YAAkF,IAA3ED,MAA+B,IAE/EC,EAAMA,EAAInF,cACV,IAjEqByE,EAAkBW,EAAoBrK,EAiEvDkJ,EAAUtB,SAAS0C,cAAcF,GAcrC,GAZID,EAAQd,OACR/C,GAAO4C,EAAQG,MAAOc,EAAQd,OAG9Bc,EAAQI,QACRrB,EAAQsB,UAAYL,EAAQI,MAAMjI,KAAK,MAGvC6H,EAAQZ,IACRL,EAAQuB,aAAa,KAAMN,EAAQZ,IAGnCY,EAAQO,WAAY,QAAAC,EAAA,EAAAC,EACJjV,OAAO8F,KAAK0O,EAAQO,YADhBC,EAAAC,EAAAxT,OAAAuT,IAC6B,CAA5C,IAAInU,EAAGoU,EAAAD,GACRzB,EAAQuB,aAAajU,EAAK2T,EAAQO,WAAWlU,IAYrD,GARI2T,EAAQU,aArFSnB,EAsFRR,EAtF0BmB,EAsFjBF,EAAQU,gBAtF+D,IAAlC7K,MAAiBtI,OAAOkQ,UAE/E8B,EAAGmB,WAEHnB,EAAGmB,WAAWC,QAAUT,EAExBX,EAAGX,YAAY/I,EAAI+K,eAAeV,KAuFlCF,EAAQa,KACR,IAAY,WAARZ,EAGI,MAAM,IAAI3Q,MAAJ,8EAOVyP,EAAQ+B,UAAYd,EAAQa,KAIpC,OAAO9B,EAkBKoB,CAAc,SAAU,CAChCI,WAAY1T,EAAA,CACRkU,kBAAmB,QALVf,EAAQO,YAAc,IAQnCrB,MAAOrS,EAAA,CACHmU,gBAAiB,cACjBC,OAAiB,QACd/B,GAEP2B,KAAOb,EAAQa,KACfT,MAAOJ,EAAQI,QAGbc,EAAO3T,OAAO4T,UAAUC,UAAU1J,MAAM,cAmB9C,OAjBKrD,EAAMgN,aAAa,OACpBhN,EAAMiM,aAAa,KAAM9F,KAI7BiF,GAAepL,GAEXwK,GAxTD,SAAoBO,EAAqBvJ,QAAuD,IAAvDA,MAA+B4H,UAE3E,IAAIsB,EAAUI,GAAeC,EAAIvJ,GAEjC,GAAIkJ,EACA,OAAOA,EAGX,MAAM,IAAIzP,MAAJ,yBAAoCsI,GAAUwH,IAiTvCkC,CAAWzC,GACjBD,YAAYvK,IAGf2L,EAAQhI,KAAOkJ,IACf7M,EAAMiM,aAAa,MAAON,EAAQhI,KAAO,eAItC3D,EAGJ,SAASqL,GAAiBhH,EAAmB6I,EAAgBhT,GAEhE,OADAmK,EAAIgH,iBAAiB6B,EAAOhT,GACrB,CACHoD,OADG,WAEC+G,EAAI8I,oBAAoBD,EAAOhT,KAmJpC,SAASkT,GAAe1C,GACvBA,GAAWA,EAAQnJ,YACnBmJ,EAAQnJ,WAAW8L,YAAY3C,GAwBhC,SAAS4C,GAAgBpC,GAC5B,OAAKA,IAAOA,EAAG3J,WAoDZ,SAASgM,GAASrC,EAAkBhR,EAApCsT,GAAwL,IAAAC,OAAA,IAAAD,EAAT,GAASA,EAAAE,EAAAD,EAAzFE,aAAyF,IAAAD,KAAAE,EAAAH,EAA3EI,cAA2E,IAAAD,KAAAE,EAAAL,EAA5DhE,gBAA4D,IAAAqE,EAAjD,IAAiDA,EAAAC,EAAAN,EAA5ClP,WAA4C,IAAAwP,EAAtC7U,OAAsC6U,EACvLC,EAAe9C,EAAG+C,YAClBC,EAAgBhD,EAAGiD,aAEvBjU,EAAQ,CAAEyT,MAAOK,EAAcH,OAAQK,IAEvC,IAYIE,EACAhS,EAbA+H,EAAQ,WACR,IAAIkK,EAAWnD,EAAG+C,YACdK,EAAYpD,EAAGiD,cAEdR,GAASU,IAAaL,GAAkBH,GAAUS,IAAcJ,IACjEhU,EAAQ,CAAEyT,MAAOU,EAAUR,OAAQS,IAGvCN,EAAeK,EACfH,EAAgBI,GA2BpB,YArBkC,IAAvB/P,EAAIgQ,gBACXH,EAAW,IAAI7P,EAAIgQ,eAAepK,IACzBqK,QAAQtD,QAEsB,IAAzB3M,EAAIkQ,mBAClBL,EAAW,IAAI7P,EAAIkQ,iBAAiBtK,IAC3BqK,QAAQtD,EAAI,CACjBgB,YAAe,EACfwC,WAAe,EACfC,SAAe,EACfC,eAAe,IAEnBrQ,EAAI8M,iBAAiB,SAAUlH,IAEpB,SAAP6D,IACA7D,IACA/H,EAAUhB,WAAW4M,EAAMyB,GAE/BzB,GAGG,CACH1K,OAAQ,WACJ8Q,EAASS,aACT3V,OAAOiU,oBAAoB,SAAUhJ,GACrC5H,aAAaH,KE/6BlB,SAAS0S,GAAO/I,GACnB,MAAsB,iBAARA,GAAqB,YAAagJ,KAAKhJ,GAGlD,SAASiJ,GAAKjJ,GACjB,MAAsB,iBAARA,GAAqB,aAAcgJ,KAAKhJ,GAkBnD,SAASkJ,GAAKrI,GACjB,OAhBG,SAAeA,GAElB,GAAmB,iBAARA,EACP,OAAOA,EAGX,IAAIvD,EAAQuD,EAAIvD,MAAM,oBAEtB,IAAKA,EACD,MAAM,IAAIpI,MAAJ,kCAA6C2L,GAGvD,OAAOsI,SAAS7L,EAAM,GAAI,IAIf8L,CAAMvI,GAAjB,KAGG,SAASwI,GAAMxI,GAElB,MAAmB,iBAARA,EACAqI,GAAKrI,GAGTkI,GAAOlI,GAAOA,EAAMqI,GAAKrI,GFmWpCuE,GAAenQ,UAAY7D,OAAOY,OAAOkD,MAAMD,WGpYxC,ICWMqU,GAAe,CACxBC,OAAc,mBACdC,MAAc,kBACdC,YAAc,yBAYLvR,GAAW,IAEXwR,GAAqB,CAC9BC,2BAA6B,6BAC7BC,sBAA6B,wBAC7BC,oBAA6B,uBC3B1B,SAASC,GAAUtR,GACtB,YADoE,IAA9CA,MAA6BrF,QAC/CqF,IAAQrF,OACDqF,EAAG,uBAEUA,EAAG,uBAAkCA,EAAG,wBAAmC,GASvG,IAAMuR,GAAwB,iBAAO,IAe9B,SAASC,GAAuB/X,EAAyBgY,GAC5D,YADgH,IAA7EhY,MAAgB,cAA6D,IAApDgY,MAA2BF,IAChFjK,GAASgK,KAAa7X,EAAK,WAC9B,IAAIiY,EAAQD,IAEZ,MAAO,CACHpK,IAAK,SAACsK,GACF,OAAOD,EAAM5X,eAAe6X,IAEhC5Y,IAAK,SAAC4Y,EAAUC,GAEZ,OAAOF,EAAM5X,eAAe6X,GAAYD,EAAMC,GAAYC,GAE9D/K,IAAK,SAAC8K,EAAUtJ,GAEZ,OADAqJ,EAAMC,GAAYtJ,EACXA,GAEXwJ,IAAK,SAACF,UACKD,EAAMC,IAEjBrK,SAAU,SAACqK,EAAUjZ,GAEjB,OAAO4O,GAASoK,EAAOC,EAAUjZ,IAErCmQ,MAAO,WACH6I,EAAQD,KAEZ/S,KAAM,WACF,OAAO9F,OAAO8F,KAAKgT,OAM5B,IAAMI,GAAb,aAEO,SAASC,KACZ,IAAMC,EAASV,KAEf,OADAU,EAAOC,gBAAkBD,EAAOC,iBAAmB,IAAIH,GAChDE,EAAOC,gBAYX,SAASC,GAAezY,EAAyBgY,GACpD,YADwG,IAA7EhY,MAAgB,cAA6D,IAApDgY,MAA2BF,IACxEC,GAAY,eAAelK,SAAS7N,EAAK,WAC5C,IAAM0Y,EAAW,IAAI1L,EAEf2L,EAAW,SAACpS,GACd,OAAOmS,EAAS7K,SAAStH,EAAKyR,IAGlC,MAAO,CACHpK,IAAK,SAACrH,GAEF,OADcoS,EAASpS,GACVlG,eAAeL,IAEhCV,IAAK,SAACiH,EAAK4R,GACP,IAAMF,EAAQU,EAASpS,GAEvB,OAAO0R,EAAM5X,eAAeL,GAAOiY,EAAMjY,GAAOmY,GAEpD/K,IAAK,SAAC7G,EAAKqI,GAGP,OAFc+J,EAASpS,GACjBvG,GAAO4O,EACNA,GAEXwJ,IAAK,SAAC7R,UACYoS,EAASpS,GACVvG,IAEjB6N,SAAU,SAACtH,EAAKtH,GAEZ,OAAO4O,GADO8K,EAASpS,GACAvG,EAAKf,OCvG5C,SAAS2Z,KACL,OAAOb,GAAY,YAAYlK,SAAS,aAAcM,GAG1D,SAAS0K,GAAgBtS,GAErB,OADsBkS,GAAY,iBACb5K,SAAStH,EAAK,kBAAM,IAAItE,IAU1C,SAAS6W,GAASvS,EAAlBwS,GACH,OAAOC,EADiKD,EAApHC,MACxCzS,EAAK8Q,GAAaE,MAAO,CAAE0B,WAAYL,MAAmB,CAAE1R,OAAQjB,GAAU7B,SAAU,IAC/F9C,KAAK,SAAA4X,GAAsC,IAAnCjO,EAAmCiO,EAAnCjO,OAAgBgO,EAAmBC,EAA3BC,KAAQF,WAErB,OADAJ,GAAgBtS,GAAKzE,QAAQ,CAAEyE,MAAKW,OAAQ+D,IACrC,CAAE1E,MAAKW,OAAQ+D,EAAQgO,gBAInC,SAASG,GAAoB7S,EAA7B8S,GAAiH,IAArDL,EAAqDK,EAArDL,KAC/D,OAAOP,GAAY,4BAA4B5K,SAAStH,EAAK,WACzD,OAAOuS,GAASvS,EAAK,CAAEyS,SAAQ1X,KAAK,SAAAgY,GAAA,OAAAA,EAAGL,eC9BxC,SAASM,GAAgBhT,GACPkS,GAAY,gBACpBrL,IAAI7G,GAAK,GCNnB,OAAMiT,GAAO,CAChBC,SAAY,WACZC,MAAY,QACZC,QAAY,UACZC,MAAY,QACZC,KAAY,OACZC,MAAY,QACZC,OAAY,SACZC,OAAY,SACZC,OAAY,SACZC,QAAY,UACZC,KAAY,OACZC,UAAY,aCTT,SAASC,GAAiBrZ,GAC7B,MAAwB,iBAATA,GAA8B,OAATA,GAA0C,iBAAlBA,EAAKsZ,SAG9D,SAASC,GAAc3L,GAC1B,YAAmB,IAARA,EACA4K,GAAKY,UAGJ,OAARxL,EACO4K,GAAKW,KAGZjP,MAAMC,QAAQyD,GACP4K,GAAKM,MAGG,mBAARlL,EACA4K,GAAKC,SAGG,iBAAR7K,EAEHA,aAAe3L,MACRuW,GAAKE,MAGQ,mBAAb9K,EAAItN,KACJkY,GAAKG,QAG4B,oBAAxCxa,GAAiBkC,SAASzC,KAAKgQ,GACxB4K,GAAKI,MAG4B,kBAAxCza,GAAiBkC,SAASzC,KAAKgQ,GACxB4K,GAAKK,KAGTL,GAAKO,OAGG,iBAARnL,EACA4K,GAAKQ,OAGG,iBAARpL,EACA4K,GAAKS,OAGG,kBAARrL,EACA4K,GAAKU,aADhB,EAKG,SAASM,GAAqCC,EAAU7L,GAC3D,MAAO,CACH0L,SAAUG,EACVC,QAAU9L,GCxBlB,OAAM+L,KAAwBC,GAAA,IACxBpB,GAAKC,UCpCJ,aDmCuBmB,GAExBpB,GAAKE,OE5BJ,SAAAmB,GACH,OAAOL,GAAchB,GAAKE,MAAO,CAAEzQ,QADqF4R,EAA3F5R,QACevG,MAD4EmY,EAAlFnY,MACaoY,KADqED,EAA3EC,QF0BnBF,GAGxBpB,GAAKG,SGtCJ,aHmCuBiB,GAIxBpB,GAAKI,OInCJ,SAAwBhL,GAC3B,OAAO4L,GAAchB,GAAKI,MAAOhL,EAAI/N,SJ8BX+Z,GAKxBpB,GAAKK,MKpCJ,SAAuBjL,GAC1B,OAAO4L,GAAchB,GAAKK,KAAMjL,EAAImM,WL8BVH,GAMxBpB,GAAKM,OMzCJ,SAAmClL,GACtC,OAAOA,GNkCmBgM,GAOxBpB,GAAKO,QO1CJ,SAAyBnL,GAC5B,OAAOA,GPkCmBgM,GAQxBpB,GAAKQ,QQ3CJ,SAAyBpL,GAC5B,OAAOA,GRkCmBgM,GASxBpB,GAAKS,QS5CJ,SAAyBrL,GAC5B,OAAOA,GTkCmBgM,GAUxBpB,GAAKU,SU7CJ,SAA0BtL,GAC7B,OAAOA,GVkCmBgM,GAWxBpB,GAAKW,MW9CJ,SAAuBvL,GAC1B,OAAOA,GXkCmBgM,IAexBI,GAAmC,GYhBnCC,KAA4BC,GAAA,IAC5B1B,GAAKC,UX/BJ,WACH,MAAM,IAAIxW,MAAJ,sEW6BwBiY,GAE5B1B,GAAKE,OVvBJ,SAAAjE,GAA8E,IAAzC/S,EAAyC+S,EAAzC/S,MAAOoY,EAAkCrF,EAAlCqF,KACzCvY,EAAQ,IAAIU,MAD+DwS,EAAlDxM,SAK/B,OAFA1G,EAAMuY,KAAOA,EACbvY,EAAMG,MAAYA,EAAlB,OAAgCH,EAAMG,MAC/BH,GUgBuB2Y,GAG5B1B,GAAKG,STjCJ,WACH,MAAM,IAAI1W,MAAJ,qES6BwBiY,GAI5B1B,GAAKI,OR9BJ,SAA0BhL,GAE7B,OAAO,IAAIuM,OAAOvM,IQwBYsM,GAK5B1B,GAAKK,MP/BJ,SAAyBjL,GAC5B,OAAO,IAAInC,KAAKmC,IOyBcsM,GAM5B1B,GAAKM,ONpCJ,SAAqClL,GACxC,OAAOA,GM6BuBsM,GAO5B1B,GAAKO,QLrCJ,SAA2BnL,GAC9B,OAAOA,GK6BuBsM,GAQ5B1B,GAAKQ,QJtCJ,SAA2BpL,GAC9B,OAAOA,GI6BuBsM,GAS5B1B,GAAKS,QHvCJ,SAA2BrL,GAC9B,OAAOA,GG6BuBsM,GAU5B1B,GAAKU,SFxCJ,SAA4BtL,GAC/B,OAAOA,GE6BuBsM,GAW5B1B,GAAKW,MDzCJ,SAAyBvL,GAC5B,OAAOA,GC6BuBsM,IAe5BE,GAAuC,GCvC7C,SAASC,KAAsB,IAC3B,IAAMC,EAAkBvD,GAAY,mBADThG,EAAA,EAAAwJ,EAEVD,EAAgBrW,OAFN8M,EAAAwJ,EAAA3a,OAAAmR,IAEc,CAApC,IAAMgB,EAAEwI,EAAAxJ,GAELuJ,EAAgBhc,IAAIyT,GAAIyI,eACxBF,EAAgBlD,IAAIrF,IAiBhC,SAAS0I,GAAoB1I,EAAaxM,EAA1CsU,GAA+H,IACvHa,EADiE1C,EAAsD6B,EAAtD7B,KAGrE,MAAO,CACHjG,KACA0H,KAAe7T,EAAUL,GAAOL,EAAYE,MAAQF,EAAYC,OAChEyS,cAAe7J,EAAe,kBAAMqK,GAAoB7S,EAAK,CAAEyS,WAC/D2C,MAAe,kBAAM1Z,EAAakC,IAAI,WAClCoC,EAAIoV,WAERC,QAAS,kBAAM3Z,EAAakC,IAAI,WAC5B,IAAI2E,EAAevC,GAInB,OAAOmV,KAEXG,MAAS,kBAAM5Z,EAAakC,IAAI,WAC5BoC,EAAIsV,WAERC,SAAU,kBAAM7Z,EAAakC,IAAI,WAC7B,OAAO2E,EAAevC,MAE1BwV,YAAa,SAACC,GAAD,OAAU/Z,EAAakC,IAAI,WACpC,GAAIiD,EAAab,GACb,IACI,GAAIA,EAAIC,UAA4C,mBAAzBD,EAAIC,SAAS6H,QAGpC,YADA9H,EAAIC,SAAS6H,QAAQ2N,GAG3B,MAAOza,IAKbgF,EAAIC,SAAWwV,KAEnBC,QAAS,SAACjd,GAAD,OAAUiD,EAAakC,IAAI,YAKhCoC,EAAMiB,EAAiBjB,IAEnBvH,KAAOA,EAEPuH,EAAI2V,cACJ3V,EAAI2V,aAAajI,aAAa,OAAQjV,GAG1C0c,EAAa1c,MCbQ,IAAIiD,EAAa,SAAAH,GAE9C,GAAIZ,OAAOkQ,UAAYlQ,OAAOkQ,SAASC,KACnC,OAAOvP,EAAQZ,OAAOkQ,SAASC,MAGnC,IAAMI,EAAWC,YAAY,WACzB,GAAIxQ,OAAOkQ,UAAYlQ,OAAOkQ,SAASC,KAEnC,OADAM,cAAcF,GACP3P,EAAQZ,OAAOkQ,SAASC,OAEpC,MDOA,IAAM8K,GAAb,WASI,SAAAA,EAAYC,EAA0CC,EAAtD5G,GAA8H,IAA9BuD,EAA8BvD,EAA9BuD,KAA8B3a,KAP9Hie,eAAuB,EAOuGje,KAN9H+d,sBAM8H,EAAA/d,KAL9Hge,kBAK8H,EAAAhe,KAJ9Hke,yBAI8H,EAAAle,KAH9H2a,UAG8H,EAAA3a,KAF9HW,UAE8H,EAC1HX,KAAK+d,iBAAmBA,EACxB/d,KAAKke,oBAAsB,IAAIta,EAC/B5D,KAAK2a,KAAOA,EACRqD,GACAhe,KAAKme,UAAUH,GAd3B,IAAAtZ,EAAAoZ,EAAAnZ,UAAA,OAAAD,EAkBI0Z,QAAA,WACI,OAAOpe,KAAK+d,iBAAiB3B,MAnBrC1X,EAsBI2Z,QAAA,WACI,OAAOre,KAAKoe,YAAcvW,EAAYE,OAvB9CrD,EA0BI4Z,SAAA,WACI,OAAOte,KAAKoe,YAAcvW,EAAYC,QA3B9CpD,EA8BIgZ,YAAA,SAAYC,GAA2C,IAAA7Z,EAAA9D,KACnD,OAAOA,KAAK+d,iBAAiBL,YAAYC,GAAM1a,KAAK,kBAAMa,KA/BlEY,EAkCIkZ,QAAA,SAAQjd,GAA2C,IAAAmE,EAAA9E,KAC/C,OAAOA,KAAK+d,iBAAiBH,QAAQjd,GAAMsC,KAAK,kBAAM6B,KAnC9DJ,EAsCI4Y,MAAA,WAAoC,IAAAjY,EAAArF,KAChC,OAAOA,KAAK+d,iBAAiBT,QAAQra,KAAK,kBAAMoC,KAvCxDX,EA0CI8Y,MAAA,WAAoC,IAAAvX,EAAAjG,KAChC,OAAO4D,EAAakC,IAAI,WACpB,OAAOlC,EAAayC,IAAI,CACpBJ,EAAKoY,WAAapY,EAAK8X,iBAAiBR,UAAUta,KAAK,SAAAtC,GAC/CA,GACAkC,OAAO0b,KAAK,GAAI5d,KAGxBsF,EAAK8X,iBAAiBP,YAE3Bva,KAAK,kBAAMgD,KApDtBvB,EAuDI+Y,SAAA,WACI,OAAOzd,KAAK+d,iBAAiBN,YAxDrC/Y,EA2DI8Z,UAAA,WACI,OAAOxe,KAAKge,cA5DpBtZ,EA+DIyZ,UAAA,SAAUjW,GACNlI,KAAKge,aAAe9V,EACpBlI,KAAK+d,iBAAmBX,GAAoBpd,KAAK+d,iBAAiBrJ,GAAIxM,EAAK,CAAEyS,KAAM3a,KAAK2a,OACxF3a,KAAKke,oBAAoBza,QAAQyE,IAlEzCxD,EAqEI+Z,YAAA,WACI,OAAOze,KAAKke,qBAtEpBxZ,EAyEIga,YAAA,SAAYxW,GAAqD,IAAAyW,EAAA3e,KAC7D,OAAO4D,EAAakC,IAAI,WACpB,OAAI6Y,EAAKX,aACE9V,IAAQyW,EAAKX,aAGjBpa,EAAayC,IAAI,CACpBsY,EAAKpE,gBACLQ,GAAoB7S,EAAK,CAAEyS,KAAMgE,EAAKhE,SACvC1X,KAAK,SAAAyX,GAAgD,IAC9C1N,EAD8C0N,EAAA,KAAAA,EAAA,GAOpD,OAJI1N,GACA2R,EAAKR,UAAUjW,GAGZ8E,OAzFvBtI,EA8FIka,OAAA,WACI,OAAO5e,KAAKge,cAAgBhe,MA/FpC0E,EAkGI6V,cAAA,WACI,OAAOva,KAAK+d,iBAAiBxD,iBAnGrC7V,EAsGIma,UAAA,WACI,OAAO7e,KAAK+d,kBAvGpBrZ,EA0GIyY,YAAA,WACI,OAAOnd,KAAKge,cAAgBvT,EAAezK,KAAKge,eA3GxDF,EA8GWc,OAAP,SAAc1W,GACV,OAAO4V,EAAYG,cAAc/V,GAE3BA,EAAI0W,SACJ1W,GAlHd4V,EAqHWe,UAAP,SAAiB3W,EAAjB2S,GAAoH,IAAtDF,EAAsDE,EAAtDF,KAG1D,OAFAqC,KAEOc,EAAYgB,cAAc5W,EAAK,CAAEyS,SAAQkE,aAxHxDf,EA2HWiB,YAAP,SAAmBhB,EAAnB/C,GAA4H,IAA7DgE,EAA6DhE,EAA7DgE,GAAIrE,EAAyDK,EAAzDL,KAG/D,OAFAqC,KAEOtD,GAAY,mBAAmBlK,SAASuO,EAAiBrJ,GAAI,WAChE,OAAO,IAAIoJ,EAAYC,EAAkB,KAAM,CAAEiB,KAAIrE,YA/HjEmD,EAmIWG,cAAP,SAAqBjQ,GAEjB,OAAOjB,QAAQiB,IAAQD,EAASC,IAAQA,EAAIiQ,gBArIpDH,EAwIWgB,cAAP,SAAqB5W,EAArB+S,GAA8G,IAA5CN,EAA4CM,EAA5CN,KAG9D,GAFAqC,KAEIc,EAAYG,cAAc/V,GAE1B,OAAOA,EAIX,IAAM+W,EAAkC/W,EAGxC,OAAOkS,GAAY,oBAAoB5K,SAAStH,EAAK,WACjD,IAAMwM,EAAK5E,IAELoP,EAAc,IAAIpB,EADCV,GAAoB1I,EAAIuK,EAAS,CAAEtE,SACNsE,EAAS,CAAEtE,SAEjE,OAAOjB,GAAY,mBAAmB3K,IAAI2F,EAAIwK,MAzJ1DpB,EAAA,GExEA,SAASqB,GAAUzK,EAAanE,EAAgB5P,EAAe6B,EAA8CqG,GACzG,IAAMuW,EAAchF,GAAY,eAC1BiF,EAAqB3F,GAAY,sBAEnCoE,GAAYG,cAAczb,GAC1B6c,EAAmBtQ,IAAI2F,EAAI,CAAEnE,MAAK5P,OAAMkI,SAAQrG,YAEhD6c,EAAmBtF,IAAIrF,GAEP0K,EAAY5P,SAAShN,EAAQ,iBAAO,KAC5CkS,GAAM,CAAE7L,SAAQlI,OAAM4P,MAAK/N,WAI3C,SAAS8c,GAAa9c,EAAgCkS,GAClD,IAAM0K,EAAchF,GAAY,eAC1BiF,EAAqB3F,GAAY,sBAEvC,OADgB0F,EAAY5P,SAAShN,EAAQ,iBAAO,KACrCkS,IAAO2K,EAAmBpe,IAAIyT,GA0D1C,SAAS6K,GAAqBC,EAAmD3W,EAAwB0H,EAAiC5O,EAA1I+Y,IAvDP,SAAA8B,GAA2E,IAAzCwC,EAuD4KtE,EAA7CsE,GAtDtJtF,GAAY,oBAAoBlK,SAAS,gBAAiB,WAC7D,OAAOwP,EAAGhG,GAAaC,OAAQ,CAAEpQ,OAAQjB,IAAY,SAAAwP,GAAmG,IAAhG5U,EAAgG4U,EAAhG5U,OAAQoK,EAAwFwK,EAAxFxK,OAAQkO,EAAgF1D,EAAhF0D,KAC5DpG,EAAaoG,EAAbpG,GAAI/T,EAASma,EAATna,KAEN8e,EAAOH,GAAa9c,EAAQkS,GAElC,IAAK+K,EACD,MAAM,IAAI7a,MAAJ,0BAAqCkW,EAAKna,KAA1C,cAA8Dma,EAAKpG,GAAnE,OAA8E9L,EAAU/F,SANkD,IASpI6c,EAA8BD,EAAtCjd,OAAsBqG,EAAgB4W,EAAhB5W,OAAQ0H,EAAQkP,EAARlP,IAEtC,OAAO3M,EAAakC,IAAI,WACpB,IAAK4G,EAAY7D,EAAQ+D,GAErB,MAAM,IAAIhI,MAAJ,WAAsBkW,EAAKna,KAA3B,YAA6CsM,KAAKC,UAAU3F,GAAQkY,EAAK5W,QAAU4W,EAAK5W,OAAOrG,OAASid,EAAK5W,QAA7G,0BAAgJ+D,EAAhJ,OAA+JhE,EAAU/F,SAGnL,GAAIib,GAAYG,cAAcyB,GAE1B,OAAOA,EAAahB,YAAYlc,GAAQS,KAAK,SAAA+J,GACzC,IAAKA,EACD,MAAM,IAAIpI,MAAJ,gBAA2BkW,EAAKna,KAAhC,oDAA0FiI,EAAU/F,aAIvHI,KAAK,WACJ,OAAOsN,EAAI9N,MAAM,CAAED,SAAQoK,UAAUkO,EAAK1T,OAC3C,SAAAlE,GACC,OAAOU,EAAakC,IAAI,WACpB,GAAIyK,EAAI9K,QACJ,OAAO8K,EAAI9K,QAAQvC,KAExBD,KAAK,WAOJ,MALIC,EAAImB,QAEJnB,EAAImB,MAAJ,kBAA+B1D,EAA/B,SAA8CuC,EAAImB,OAGhDnB,MAEXD,KAAK,SAAAqB,GACJ,MAAO,CAAEA,SAAQoQ,KAAI/T,cAYjCgf,GAEA,IAAMjL,EAAKnE,EAAIqP,QAAU9P,IACzB0P,EAAc1B,GAAYc,OAAOY,GACjC,IAAM7e,EAAO4P,EAAIsP,UAAYtP,EAAI5P,MAAQgB,EAazC,OAXImc,GAAYG,cAAcuB,IAC1BL,GAAUzK,EAAInE,EAAK5P,EAAM6e,EAAa3W,GAGtC2W,EAAYf,cAAcxb,KAAK,SAAAiF,GAC3BiX,GAAUzK,EAAInE,EAAK5P,EAAMuH,EAAKW,MAGlCsW,GAAUzK,EAAInE,EAAK5P,EAAM6e,EAAa3W,GAGnCsT,GAAc/C,GAAmBE,sBAAuB,CAAE5E,KAAI/T,SCtGlE,SAASmf,GAA4BN,EAAmD3W,EAAwBmF,EAAhHwO,GAAmL,IAAAuD,EAAxDf,EAAwDxC,EAAxDwC,GAAIrE,EAAoD6B,EAApD7B,KAClI,OhB2CG,SAA8B3M,EAASgS,QAAyD,IAAzDA,MAA4BrD,IAyBtE,IAAMrY,EAAS2I,KAAKC,UAAUc,EAvB9B,SAAkBrM,GACd,IAAM4O,EAAMvQ,KAAK2B,GAEjB,GAAIqa,GAAiBhc,MACjB,OAAOuQ,EAGX,IAAM6L,EAAOF,GAAc3L,GAE3B,IAAK6L,EACD,OAAO7L,EAIX,IAAM0P,EAAaD,EAAY5D,IAASE,GAAWF,GAEnD,OAAK6D,EAIEA,EAAW1P,EAAK5O,GAHZ4O,IAQf,YAAsB,IAAXjM,EACA6W,GAAKY,UAGTzX,EgB1EAua,CAAU7Q,IAAD+R,EAAA,IACV5E,GAAKG,SAAY,SAAC/K,EAAgB5O,GAAjB,OCEpB,SAA0B6d,EAAmD3W,EAAwB0H,EAAgB5O,EAArH6a,GACH,OAAOL,GAAc/C,GAAmBC,2BAA4B,CAChEpW,KAAMsc,GAAkBC,EAAa3W,EAAQ,SAACpF,EAASgB,GAAV,OAAqB8L,EAAItN,KAAKQ,EAASgB,IAAS9C,EAAK,CAAEqd,GAFmGxC,EAAnEwC,GAE5BrE,KAF+F6B,EAA/D7B,SDF/DuF,CAAiBV,EAAa3W,EAAQ0H,EAAK5O,EAAK,CAAEqd,KAAIrE,UADnHoF,EAEV5E,GAAKC,UAAY,SAAC7K,EAAgB5O,GAAjB,OAAuD4d,GAAkBC,EAAa3W,EAAQ0H,EAAK5O,EAAK,CAAEqd,KAAIrE,UAFrHoF,EAGV5E,GAAKO,QAAY,SAACnL,GAChB,OAAQxC,EAASwC,IAAQuN,GAAYG,cAAc1N,GH4OpD4L,GAAc/C,GAAmBG,oBAAqBuE,GAAYe,UG5O+BtO,EH4OhB,CAAEoK,KG5OyBA,KAAUpK,GAJ7GwP,IASb,SAASI,GAA8B3d,EAA8CoK,EAAiBhC,EAAtGwM,GAA6K,IAAAgJ,EAAnDpB,EAAmD5H,EAAnD4H,GAAIrE,EAA+CvD,EAA/CuD,KACjI,OJgCG,SAA8CjL,EAAc2Q,GAC/D,QADyH,IAA1DA,MAAgCtD,IAC3FrN,IAAQyL,GAAKY,UAmCjB,OAAO9O,KAAKqT,MAAM5Q,EA9BlB,SAAkB/N,EAAK4O,GACnB,GAAIyL,GAAiBhc,MACjB,OAAOuQ,EAGX,IAAI6L,EACA/a,EAUJ,GARI2a,GAAiBzL,IACjB6L,EAAO7L,EAAI0L,SACX5a,EAAQkP,EAAI8L,UAEZD,EAAOF,GAAc3L,GACrBlP,EAAQkP,IAGP6L,EACD,OAAO/a,EAIX,IAAMkf,EAAeF,EAAcjE,IAASQ,GAAaR,GAEzD,OAAKmE,EAIEA,EAAalf,EAAOM,GAHhBN,II9DR0d,CAAYnU,IAADwV,EAAA,IACZhH,GAAmBC,4BAA8B,SAACmH,GAAD,OCDhD,IAAI5c,EDCuG4c,ECFfvd,ODCjFmd,EAEZhH,GAAmBE,uBAA8B,SAACmH,GAAD,OD4FpD,SAAgCje,EAA8CoK,EAA9EiO,EAAAG,GAAqO,IAApItG,EC5Fe+L,ED4Ff/L,GAAI/T,EC5FW8f,ED4FX9f,KAA2Cga,EAAqFK,EAArFL,KAC7I+F,EAA0B,SAACC,GAC7B,SAASC,IAA0D,IAAAC,EAAAve,UAO/D,OAAOwb,GAAYgB,cAActc,EAAQ,CAAEmY,SAAQ8D,cAAcxb,KAAK,SAAAiF,GAClE,IAAMuX,EAAOH,GAAapX,EAAKwM,GAE/B,GAAI+K,GAAQA,EAAKlP,MAAQqQ,EACrB,OAAOnB,EAAKlP,IAAI9N,MAAM,CAAED,OAAQK,OAAQ+J,OAAQhE,KAAetG,GAG/D,IAAMgT,EAAU,CAAEzM,OAAQ+D,EAAQkU,cAAeH,EAAKG,eAChD1Z,EAAOyF,GAAgBW,MAAMjN,KAAK+B,GAExC,OAAOqY,EAAKzS,EAAK8Q,GAAaC,OAAQ,CAAEvE,KAAI/T,OAAMyG,QAAQkO,GACrDrS,KAAK,SAAAuB,GACF,IAAKmc,EAAKG,cACN,OAAOtc,EAAIsW,KAAKxW,WAKjCoB,MAAM,SAAAxC,GAML,MAAMA,IAWd,YA3CqD,IAAxByd,MAAiB,IAoC9CC,EAA2Bf,SAAWlf,EACtCigB,EAA2BG,WAAanU,EACxCgU,EAA2BI,WAAaxe,EACxCoe,EAA2BhB,OAASlL,EAEpCkM,EAA2BhU,OAASA,EAE7BgU,GAGLA,EAA6BF,IAGnC,OAFAE,EAA2BE,cAAgBJ,EAAwB,CAAEI,eAAe,IAE7EF,EC9IwEK,CAAoBze,EAAQoK,EAAQ6T,EAAoB,CAAEzB,KAAIrE,UAF3HyF,EAGZhH,GAAmBG,qBAA8B,SAACwE,GAAD,OHuOhDD,GAAYiB,YGvO8FhB,EHuO7E,CAAEiB,IADnCkC,EGtOgI,CAAElC,KAAIrE,SHsObqE,GAClFrE,KAD+IuG,EAAzDvG,OAA7H,IAAAuG,GGzOed,IEbf,IAAMe,GAA0B,GCChC,SAASC,GAAYlZ,EAA6BW,EAAwB+B,EAA1E4R,GAA8I,IAAA6E,EAA/CrC,EAA+CxC,EAA/CwC,GAAIrE,EAA2C6B,EAA3C7B,KACtG,GAAIlQ,EAAevC,GACf,MAAM,IAAItD,MAAM,oBAF6H,IAKjJ,IAAM0c,EAAoBxB,GAAiB5X,EAAKW,IAANwY,EAAA,2BAAAlf,EAAA,CAElCuS,GAAQ5E,IACRlD,OAAQhE,EAAU/F,SACf+H,GAJ+ByW,GAMvC,CAAErC,KAAIrE,SAEH4G,EAAazgB,OAAO8F,KAAKua,IACzBK,EAAS,GAdkI9N,EAAA,EAAAA,EAgBtH6N,EAhBsHhf,OAAAmR,IAgB1G,CAAlC,IAAM+N,EAAgBF,EAAJ7N,GACnB,IACIyN,GAAwBM,GAAcvZ,EAAKoZ,EAAmBzY,GAChE,MAAO3F,GACLse,EAAOvc,KAAK/B,IAIpB,GAAIse,EAAOjf,SAAWgf,EAAWhf,OAC7B,MAAM,IAAIqC,MAAJ,kDAA6D4c,EAAO3a,IAAIyK,IAAgB7D,KAAK,SDxB3G0T,GAAuB,uBAA+B,SAACjZ,EAA6BoZ,EAA4BzY,IAUxGgE,MAAMC,QAAQjE,GACJA,EACe,iBAAXA,EACJ,CAAEA,GAEF,CAAEjB,KAGEf,IAAI,SAAA6a,GAkBlB,OAAmC,IAA/BA,EAAI1c,QAAQwC,EAASE,MACdE,GAGJ8Z,IAGHC,QAAQ,SAAAD,GACZxZ,EAAI0Z,YAAYN,EAAmBI,MA0BvCP,GAAuB,iBAAyB,SAACjZ,EAA6BoZ,GAE1E,GhCieD,SAAsBpZ,GAEzB,OADAA,EAAMA,GAAOrF,QACF4T,UAAUoL,eAAiB3Z,EAAIuO,UAAUC,UkCjjBhDoL,CAAajf,QAAQmK,MAAM,yCF8E3B,CAIA,IAAKjE,EAAab,GACd,MAAM,IAAItD,MAAJ,yEAGV,IAAqC,IAAjCqH,EAAgBpJ,OAAQqF,GACxB,MAAM,IAAItD,MAAJ,wFAIV,IAAMmd,EAAgBvI,GAAUtR,GAEhC,IAAK6Z,EACD,MAAM,IAAInd,MAAJ,mDAGVmd,EAAcC,eAAe,CACzBxf,OAAQK,OACR+J,OAAQhE,IACRkS,KAAQwG,MG1FpB,OAAMW,GAAmB,mBAwBlB,SAASC,GAAoBvb,GAEhC,OAD0B+S,GAAY,qBACbzY,IAAI0F,GAG1B,SAASwb,GAAuBxb,GACT+S,GAAY,qBACpBK,IAAIpT,GAmBnB,SAASyb,GAA0Bzb,GAEtC,OADiC+S,GAAY,4BACbnK,IAAI5I,GAGjC,SAAS0b,GAAT7F,GAAsK,IAAxI7b,EAAwI6b,EAAxI7b,KAAMuH,EAAkIsU,EAAlItU,IAAKW,EAA6H2T,EAA7H3T,OACtCyZ,EAAmBlI,GAAY,oBAUrC,GARIlS,IAAQN,KACRM,EAAM,MAGNW,IAAWjB,KACXiB,EAAS,OAGRlI,EACD,MAAM,IAAIiE,MAAJ,yCAZ+J,QAAA2d,EAAA,EAAA7H,EAe9I,CAAExS,EAAK+R,MAfuIsI,EAAA7H,EAAAnY,OAAAggB,IAetH,CAA9C,IAAMC,EAAY9H,EAAA6H,GACnB,GAAKC,EAAL,CAIA,IAAMC,EAAgBH,EAAiBrhB,IAAIuhB,GAE3C,GAAKC,EAAL,CAIA,IAAMC,EAAkBD,EAAc9hB,GAEtC,GAAK+hB,EAAL,CAIA,GAAI7Z,GAA4B,iBAAXA,EAAqB,CACtC,GAAI6Z,EAAgB7Z,GAChB,OAAO6Z,EAAgB7Z,GAG3B,GAAI6Z,EAAgBT,IAAmB,QAAAnM,EAAA,EAAA6M,EACDD,EAAgBT,IADfnM,EAAA6M,EAAApgB,OAAAuT,IACkC,KAAA8M,EAAAD,EAAA7M,GAAjD+M,EAAiDD,EAAjDC,SAChB,GAAInW,EAD6DkW,EAAxDE,MACcja,GACnB,OAAOga,GAMvB,GAAIH,EAAgB9a,IAChB,OAAO8a,EAAgB9a,QC1G5B,IAAMmb,KAAqBC,GAAA,uCAELxgB,EAAgCoK,EAAiBhC,EAF5C4R,GAE4I,IAApEwC,EAAoExC,EAApEwC,GAAIrE,EAAgE6B,EAAhE7B,KAEhGrF,EAAU+M,GAAmB,CAAE1hB,KAAMiK,EAAQjK,KAAMuH,IAAK1F,EAAQqG,OAAQ+D,IAS9E,SAASqW,EAAa7G,EAAqC8G,EAAoCC,QAAe,IAAfA,MAAW,IAElGvY,EAAQkW,eAAiBrW,EAAejI,IAe5C4e,GAAY5e,EAAQoK,EAATzK,EAAA,CACPia,OACA8G,MACAvc,KAAQiE,EAAQjE,KAChBhG,KAAQiK,EAAQjK,MACbwiB,GACJ,CAAEnE,KAAIrE,SAGb,OAAO/W,EAAayC,IAAI,CAEpB4c,E5BhDG,yB4BkDHrf,EAAakC,IAAI,WAEb,IAAKwP,EACD,MAAM,IAAI1Q,MAAJ,sCAAiDgG,EAAQjK,KAAzD,SAAwEiM,EAAxE,OAAuF/J,OAAOsF,SAASC,SAAvG,KAAsHvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAGzK,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,kBAA6BgI,EAA7B,0BAA+D0I,EAAQzM,OAAO7F,YAKxF,OAAOsS,EAAQzR,QAAQ,CAAErB,SAAQoK,SAAQkO,KAF5BlQ,EAAQkQ,SAItB7X,KAAK,SAAA6X,GACJ,OAAOmI,E5BlER,6BAKD,U4B6DkE,CAAEnI,UAEnE,SAAA5W,GACC,OAAO+e,E5BrER,6BAMD,Q4B+DgE,CAAE/e,cAGrEjB,KAAKkO,IAAMzL,MAAM,SAAAxC,GAChB,GAAIoS,GAAWA,EAAQ+N,YACnB,OAAO/N,EAAQ+N,YAAYngB,GAE3B,MAAMA,KApEY8f,GAAA,+BAyETxgB,EAAgCoK,EAAiBhC,GAElE,IAAIwX,GAA0BxX,EAAQjE,MAAtC,CAIA,IAAM2O,EAAU4M,GAAoBtX,EAAQjE,MAE5C,IAAK2O,EACD,MAAM,IAAI1Q,MAAJ,sDAAiEgG,EAAQjK,KAAzE,SAAwFiM,EAAxF,OAAuG/J,OAAOsF,SAASC,SAAvH,KAAsIvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAGzL,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,cAAyBgI,EAAzB,0BAA2D0I,EAAQzM,OAAO7F,YAGpF,GAAIR,IAAW8S,EAAQpN,IACnB,MAAM,IAAItD,MAAJ,+CAGV0Q,EAAQ4N,KAAM,IA7FYF,GAAA,oCAgGJxgB,EAAgCoK,EAAiBhC,GAEvE,IAAIwX,GAA0BxX,EAAQjE,MAAtC,CAIA,IpC6uB+BgG,EoC7uBzB2I,EAAU4M,GAAoBtX,EAAQjE,MAE5C,IAAK2O,EACD,MAAM,IAAI1Q,MAAJ,2DAAsEgG,EAAQjK,KAA9E,SAA6FiM,EAA7F,OAA4G/J,OAAOsF,SAASC,SAA5H,KAA2IvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAG9L,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,mBAA8BgI,EAA9B,2BpCsuBqBD,EoCtuBkE2I,EAAQzM,OpCuuBzGgE,MAAMC,QAAQH,GACd,IAAYA,EAAQc,KAAK,OAAzB,IACOlG,EAAQoF,GACf,UAAkBA,EAAQ3J,WAEnB2J,EAAQ3J,aoCzuBf,GAAIR,IAAW8S,EAAQpN,IACnB,MAAM,IAAItD,MAAJ,oDAGVud,GAAuBvX,EAAQjE,M5BtHzB,U4B0HFiE,EAAQsY,IAKR5N,EAAQ9R,QAAQiB,OAAOmG,EAAQ1G,O5BhI7B,Y4BkIK0G,EAAQsY,KAKf5N,EAAQ9R,QAAQC,QAAQ,CAAEjB,SAAQoK,SAAQkO,KAAMlQ,EAAQkQ,SApIlCkI,ICkC3B,SAAShB,GAAenL,EAAxBO,GAA+F,IAA/C4H,EAA+C5H,EAA/C4H,GAAIrE,EAA2CvD,EAA3CuD,KACjD2I,EAAmB5J,GAAY,oBAErC,IAAK7W,QAAUA,OAAO8H,OAClB,MAAM,IAAI/F,MAAJ,qCAGV,IACI,IAAKiS,EAAMrU,OACP,OAEN,MAAOU,GACL,OAZ8F,IAe5FV,EAAyBqU,EAAzBrU,OAAQoK,EAAiBiK,EAAjBjK,OAORhC,EAxDV,SAAsBA,EAAkBpI,EAAgCoK,EAAxE4P,GAAoJ,IAC5I+G,EADmFvE,EAAyDxC,EAAzDwC,GAAIrE,EAAqD6B,EAArD7B,KAG3F,IACI4I,EAAgBpD,GAAmB3d,EAAQoK,EAAQhC,EAAS,CAAEoU,KAAIrE,SACpE,MAAOzX,GACL,OAGJ,GAAKqgB,GAIwB,iBAAlBA,GAAgD,OAAlBA,IAIzCA,EAAgBA,EAAa,yBAEkB,iBAAlBA,GAAgD,OAAlBA,GAItDA,EAAcnH,MAAsC,iBAAvBmH,EAAcnH,MAI3C2G,GAAsBQ,EAAcnH,MAIzC,OAAOmH,EAyBSC,CAPe3M,EAATiE,KAOatY,EAAQoK,EAAQ,CAAEoS,KAAIrE,SAEpD/P,IAILsQ,GAAgB1Y,GAEZ8gB,EAAiB/T,IAAI3E,EAAQ8J,MAIjC4O,EAAiBvU,IAAInE,EAAQ8J,IAAI,GAE7BjK,EAAejI,KAAYoI,EAAQkW,gBAIO,IAA1ClW,EAAQgC,OAAO5H,QAAQwC,EAASE,QAChCkF,EAAapF,EAASE,KAAhB,MAGVqb,GAAsBnY,EAAQwR,MAAM5Z,EAAQoK,EAAQhC,EAAS,CAAEoU,KAAIrE,YClFhE,SAASqE,GAAGre,EAAe2U,EAA2CzR,GAEzE,IAAKlD,EACD,MAAM,IAAIiE,MAAM,iBASpB,GANuB,mBAAZ0Q,IACPzR,EAAUyR,EAEVA,EAAU,KAGTzR,EACD,MAAM,IAAIe,MAAM,qBAGpB0Q,EAAUA,GAAW,IACb3U,KAAOA,EACf2U,EAAQzR,QAAUA,GAAWyR,EAAQzR,QAErC,IAAMqE,EAAMoN,EAAQzS,OACdgG,EAASyM,EAAQzM,OAYjB4a,EHkFH,SAASC,EAAT7I,EAA2IgI,GAA0D,IAAvKliB,EAAuKka,EAAvKla,KAAMuH,EAAiK2S,EAAjK3S,IAAKW,EAA4JgS,EAA5JhS,OACtCyZ,EAAmBlI,GAAY,oBAErC,IAAKzZ,GAAwB,iBAATA,EAChB,MAAM,IAAIiE,MAAJ,yCAGV,GAAIiI,MAAMC,QAAQ5E,GAAM,KACpB,IAAMyb,EAAsB,GADRC,EAAA,EAAAC,EAGD3b,EAHC0b,EAAAC,EAAAthB,OAAAqhB,IAIhBD,EAAoB1e,KAAKye,EAAmB,CAAE/iB,OAAMkI,SAAQX,IADjD2b,EAAAD,IAC8Df,IAG7E,MAAO,CACH5b,OADG,WACM,QAAA6c,EAAA,EAAAA,EACwBH,EADxBphB,OAAAuhB,IACwBH,EAAJG,GACN7c,WAM/B,GAAI4F,MAAMC,QAAQjE,GAAS,KACvB,IAAM8a,EAAsB,GADLI,EAAA,EAAAC,EAGJnb,EAHIkb,EAAAC,EAAAzhB,OAAAwhB,IAInBJ,EAAoB1e,KAAKye,EAAmB,CAAE/iB,OAAMuH,MAAKW,OAD9Cmb,EAAAD,IAC8DlB,IAG7E,MAAO,CACH5b,OADG,WACM,QAAAgd,EAAA,EAAAA,EACwBN,EADxBphB,OAAA0hB,IACwBN,EAAJM,GACNhd,WAM/B,IAAMid,EAAmB7B,GAAmB,CAAE1hB,OAAMuH,MAAKW,WAQzD,GANKX,GAAOA,IAAQN,KAChBM,EAAM+R,MAGVpR,EAASA,GAAUjB,GAEfsc,EACA,MAAIhc,GAAOW,EACD,IAAIjE,MAAJ,uCAAkDjE,EAAlD,cAAsEkI,EAAO7F,WAA7E,SAAiGkF,IAAQ+R,KAAgB,WAAa,aAAtI,WACC/R,EACD,IAAItD,MAAJ,uCAAkDjE,EAAlD,SAAgEuH,IAAQ+R,KAAgB,WAAa,aAArG,WACCpR,EACD,IAAIjE,MAAJ,uCAAkDjE,EAAlD,cAAsEkI,EAAO7F,YAE7E,IAAI4B,MAAJ,uCAAkDjE,GAIhE,IAMIwjB,EACAC,EAPE3B,EAAgBH,EAAiB9S,SAAStH,EAAK,iBAAO,KAEtDwa,EAAkBlT,GAASiT,EAAe9hB,EAAM,iBAAO,KAEvD0jB,EAAYxb,EAAO7F,WAazB,OARIuE,GAAQsB,IACRsb,EAAiB3U,GAASkT,EAAiBT,GAAkB,iBAAM,MAEpDhd,KADfmf,EAAgB,CAAEtB,MAAOja,EAAQga,aAGjCH,EAAgB2B,GAAaxB,EAG1B,CACH5b,OADG,kBAEQyb,EAAgB2B,GAEnBD,IACAD,EAAejd,OAAOid,EAAenf,QAAQof,EAAe,IAEvDD,EAAe5hB,eACTmgB,EAAgBT,KAI1BnhB,OAAO8F,KAAK8b,GAAiBngB,eAEvBkgB,EAAc9hB,GAIrBuH,IAAQpH,OAAO8F,KAAK6b,GAAelgB,QACnC+f,EAAiBvI,IAAI7R,KGjLTwb,CAAmB,CAAE/iB,OAAMuH,MAAKW,UAVV,CAC1ChF,QAAayR,EAAQzR,QACrBwf,YAAa/N,EAAQgP,cAAiB,SAAAphB,GAClC,MAAMA,GAEVL,OAAQqF,EACRW,OAAQA,GAAUjB,GAClBjH,SAKJ,MAAO,CACHsG,OADG,WAECwc,EAAgBxc,WCIrB,ICnCIsd,GDmCE5J,GAAkB,SAAlBA,EAAmBzS,EAAKvH,EAAMma,EAAMxF,GAI7C,IAAIzM,GADJyM,EAAUA,GAAW,IACAzM,QAAUjB,GACzB4c,EAAkBlP,EAAQvP,UhC/CS,EgCgDnC0e,EAAenP,EAAQvP,ShCpDG,IgCqD1B+a,EAAgBxL,EAAQwL,gBAAiB,EAG/C,OAAOld,EAAakC,IAAI,WAEpB,OA9CR,SAAyBnF,EAAeuH,EAA6BW,GACjE,IAAKlI,EACD,MAAM,IAAIiE,MAAM,iBAGpB,GAAIiE,GACsB,iBAAXA,IAAwBgE,MAAMC,QAAQjE,KAAYtB,GAAQsB,GACjE,MAAM,IAAIzC,UAAJ,mDAId,GAAIqE,EAAevC,GACf,MAAM,IAAItD,MAAM,2BAiChB8f,CAAgB/jB,EAAMuH,EAAKW,GA7BnC,SAAyBX,EAA6BW,EAAwB4b,EAA9EjI,GAAqL,IAA9E7B,EAA8E6B,EAA9E7B,KACnG,OAAO/W,EAAakC,IAAI,WACpB,OvCmpBD,SAAoBwC,EAAgCe,GAEvD,IAAIsb,EAAenZ,EAAYnC,GAE/B,GAAIsb,EACA,OAAIA,IAAiBrc,EAOzB,GAAIe,IAAUf,EACV,OAAO,EAGX,GAAI2B,EAAOZ,KAAWA,EAClB,OAAO,EAjBqF,QAAAub,EAAA,EAAAC,EAoB9Erb,EAAUlB,GApBoEsc,EAAAC,EAAAtiB,OAAAqiB,IAqB5F,GADUC,EAAAD,KACIvb,EACV,OAAO,EAIf,OAAO,EuC7qBCyb,CAAWjiB,OAAQqF,G7BoBxB,SAA0BA,EAA6BnC,EAAyBpF,QAA2F,IAApHoF,MAAmB,UAAiG,IAA3FpF,MAAgB,UACnG,IAAI6C,EAAUgX,GAAgBtS,GAM9B,OAJiB,IAAbnC,IACAvC,EAAUA,EAAQuC,QAAQA,EAAS,IAAInB,MAAUjE,EAAd,uBAA2CoF,EAA3C,QAGhCvC,E6B1BQuhB,CAAiB7c,EAAKuc,GACtBld,GAAQsB,GAER4R,GAASvS,EAAK,CAAEyS,SAEhB,CAAE9R,YAGd5F,KAAK,SAAAmU,GAGJ,OAHsCA,EAA/BvO,SAmBAmc,CAAgB9c,EAAKW,EAAQ4b,EAAc,CAAE9J,WACrD1X,KAAK,SAAAgiB,GAEJ,IAAKvY,EAAY7D,EAAQoc,GACrB,MAAM,IAAIrgB,MAAJ,UAAqBsI,GAAUrE,GAA/B,mBAA2DqE,GAAU+X,IAG/Epc,EAASoc,EAET,IAAMC,EAAWvkB,IAASqY,GAAaC,QAAU6B,GAA6B,iBAAdA,EAAKna,KAAyBma,EAAKna,KAAnF,KAA+FA,EAMzG6C,EAAU,IAAII,EACd+C,EAAWhG,EAAP,IAAiBmP,IAE3B,IAAKgR,EAAe,CAChB,IAAMqE,EAA0C,CAAExkB,OAAMuH,MAAKW,SAAQrF,YJ7C1E,SAA6BmD,EAAekc,GACrBnJ,GAAY,qBACpB3K,IAAIpI,EAAMkc,GI4CpBuC,CAAoBze,EAAMwe,GAE1B,IAAME,EAAcjL,GAAY,mBAAmB5K,SAAStH,EAAK,iBAAM,KACvEmd,EAAYpgB,KAAKzB,GAEjBA,EAAQkC,MAAM,YJzBnB,SAAqCiB,GACP+S,GAAY,4BACpB3K,IAAIpI,GAAM,GIwBvB2e,CAA4B3e,GAC5Bwb,GAAuBxb,KAG3B,IAAM4e,E5BhFX,SAAuBrd,GAE1B,OADqBkS,GAAY,gBACbnZ,IAAIiH,GAAK,G4B8EGsd,CAActd,GhCrFjB,IADN,IgCuFTud,EAAkBjB,EAEpBkB,EAAaH,EACbI,EAAaF,EAEXrS,EAAW1B,GAAa,WAC1B,OAAIjH,EAAevC,GACR1E,EAAQiB,OAAO,IAAIG,MAAJ,qBAAgCjE,EAAhC,YAAiDwkB,EAAiBjC,IAAM,WAAa,SAG3GiC,EAAiBS,UACVpiB,EAAQiB,OAAO,IAAIG,MAAJ,uCAAkDjE,KAG5E+kB,EAAajX,KAAKoX,IAAIH,EhClGH,IgCkGqC,IACpC,IAAhBC,IACAA,EAAalX,KAAKoX,IAAIF,EhCpGP,IgCoGyC,IAGvDR,EAAiBjC,KAAsB,IAAfwC,EAGH,IAAfC,EACAniB,EAAQiB,OAAO,IAAIG,MAAJ,+BAA0CsgB,EAA1C,OAA0Dtc,IAA1D,OAA8E6c,EAA9E,YADnB,EAFIjiB,EAAQiB,OAAO,IAAIG,MAAJ,0BAAqCsgB,EAArC,OAAqDtc,IAArD,OAAyE2c,EAAzE,ShCxGP,KgC+GvB/hB,EAAQoC,QAAQ,WACZwN,EAASnM,SACToe,EAAYne,OAAOme,EAAYrgB,QAAQxB,EAAS,MACjDkC,MAAMyL,IAWb,OARAiQ,GAAYlZ,EAAKW,EAAQ,CACrBuT,K/B3HG,4B+B4HHzV,OACAhG,OACAma,OACAgG,iBACD,CAAE9B,MAAIrE,SAEFmG,EAAgBtd,EAAQC,UAAYD,KE1H5C,SAASsc,GAAoBN,EAAmD3W,EAAwBmF,GAC3G,OAAO8X,GAAyBtG,EAAa3W,EAAQmF,EAAK,CAAEgR,MAAIrE,UAG7D,SAASwF,GAA8B3d,EAA8CoK,EAAiBhC,GACzG,OAAOmb,GAA2BvjB,EAAQoK,EAAQhC,EAAS,CAAEoU,MAAIrE,UAG9D,SAASmE,GAAc5W,GAC1B,OAAO4V,GAAYgB,cAAc5W,EAAK,CAAEyS,UChBrC,SAASnB,GAAUtR,GAEtB,QAFsE,IAAhDA,MAA+BrF,SAEhDkG,EAAab,GACd,MAAM,IAAItD,MAAJ,qDAOV,OAJKsD,EAAG,kBACJA,EAAG,gBAA4B,IAG5BA,EAAG,gBCNP,SAAS8d,GAAkBhY,GAC9B,MAAO,CACH/M,IADG,WACqB,IAAA6C,EAAA9D,KACpB,OAAO4D,EAAakC,IAAI,WACpB,GAAIhC,EAAKtB,QAAUsB,EAAKtB,SAAWK,OAC/B,MAAM,IAAI+B,MAAJ,yDAGV,OAAOoJ,MCZhB,IAAMiY,GAAI,OAEJC,GACWD,GAAZ,YADCC,GAEWD,GAAN,kBAGLE,GAAY,CACrBxK,OAAM,SACND,OAAM,SACNN,SAAQ,WACRS,QAAO,UACPD,OAAM,SACNH,MAAK,SAeI2K,GAAqB,CAC9BnZ,KAAS,OACToZ,OAAS,SACTC,OAAS,UAGAC,GAAU1e,EAEVD,GAAW,IAEX4e,GAAqB,CAC9BC,MAAQ,QACRC,OAAQ,SAGCC,GAAQ,CACjBC,OAAU,cACVC,SAAU,gBACVC,QAAU,eACVzL,MAAU,aACV0L,MAAU,aACVC,MAAU,aACVC,OAAU,eC7CP,SAASC,GAAyBC,EAA0BnT,EAAwBrS,EAAcN,EAAW+lB,GAGhH,IAAMC,EAAoCF,EAAUG,kBAAkB3lB,GAEtE,OAAK0lB,GAI6B,mBAAvBA,EAAKE,cACLF,EAAKE,cAALplB,EAAA,CAAqBd,SAAU+lB,IAJ/B/lB,ECRf,SAASmmB,GAAqBnK,GAC1B,OAAOrM,EAAcwW,GAAsB,WACvC,IAAKnK,EACD,MAAM,IAAIzY,MAAJ,kBAFmC,IAAA6iB,EAKApK,EAAW9P,MAAM,MAApDma,EALmCD,EAAA,GAKzB9mB,EALyB8mB,EAAA,GAKnBE,EALmBF,EAAA,GAO7C,GAAIC,IAAazB,GACb,MAAM,IAAIrhB,MAAJ,qCAAgD8iB,GAG1D,IAAK/mB,EACD,MAAM,IAAIiE,MAAJ,2BAGV,IAAK+iB,EACD,MAAM,IAAI/iB,MAAJ,4BAGV,IACI,OAAOqI,KAAKqT,M3CVjB,SAAsB5Q,GACzB,GAAsB,oBAAX7M,QAAiD,mBAAhBA,OAAO+kB,KAC/C,OAAO/kB,OAAO+kB,KAAKlY,GAGvB,GAAsB,oBAAXE,OACP,OAAOA,OAAOC,KAAKH,EAAK,UAAU1M,SAAS,QAG/C,MAAM,IAAI4B,MAAJ,sC2CCoBijB,CAAaF,IACjC,MAAOzkB,GACL,MAAM,IAAI0B,MAAJ,uCAAkD+iB,EAAlD,KAAuErW,GAAepO,MAEjG,CAAEma,IAGF,SAASyK,KACZ,IACI,OAAON,GAAqB3kB,OAAOlC,MACrC,MAAOuC,KCsBN,IAAM6kB,GAAb,WAWE,SAAAA,EAAYZ,GAAyB,IAAArjB,EAAA9D,UAVrCmnB,eAUqC,EAAAnnB,KATrCgU,WASqC,EAAAhU,KARrCmH,aAQqC,EAAAnH,KAPrCsI,YAOqC,EAAAtI,KANrCgoB,kBAMqC,EAAAhoB,KALrCioB,2BAKqC,EAAAjoB,KAHrCkoB,oBAGqC,EAAAloB,KAFrCmoB,gBAEqC,EACnCvkB,EAAakC,IAAI,WACfhC,EAAKqjB,UAAYA,EACjBrjB,EAAKokB,eAAiB,GAEtB,IAAME,EAAeN,KAErB,IAAKM,EACH,MAAM,IAAIxjB,MAAJ,0BAGqByjB,WAAzBD,EAAaE,SAKfC,QAAQC,IAJC,kCACPJ,EAAaE,QADN,qCAXU,IAkBbhgB,EAA4C8f,EAA5C9f,OAAQO,EAAoCuf,EAApCvf,OAAQlJ,EAA4ByoB,EAA5BzoB,QAAkBqU,EAAUoU,EAAVpU,MAE1ClQ,EAAKqD,QAF+CihB,EAAnBjhB,QAGjCrD,EAAKmkB,sBAAwBnkB,EAAK2kB,yBAAyBngB,GAC3DxE,EAAKkkB,aAAenf,EACpB/E,EAAKwE,OAAS6X,GACZrc,EAAKmkB,sBACLpf,EACAlJ,GAGFmE,EAAK4kB,kBAAkB7f,GAEvB,IAAM8f,EAAe7kB,EAAK8kB,cACxB9kB,EAAKmkB,sBACLpf,EACAmL,GAOF,OALAlQ,EAAK+kB,SAASF,EAAc9f,GAC5BqS,GAAgBpX,EAAKmkB,uBAErBnkB,EAAKglB,gBAEEhlB,EAAKwE,OAAOygB,KAAKjlB,EAAKklB,kBAE5B/lB,KAAK,WACJ,OAAOa,EAAKmlB,mBAEbvjB,MAAM,SAAAxC,GACLY,EAAK2B,QAAQvC,KA3DrB,IAAAwB,EAAAqjB,EAAApjB,UAAA,OAAAD,EA+DEwkB,WAAA,WAA8B,IAAApkB,EAAA9E,KAC5B,MAAO,CACLwd,MAAO,kBAAM1Y,EAAK0Y,SAClBF,MAAO,kBAAMxY,EAAKwY,SAClB6L,OAAQ,SAAA3M,GAAA,OAAuB1X,EAAKqkB,OAAO,CAAE7R,MAArCkF,EAAGlF,MAAyCE,OAA5CgF,EAAUhF,UAClB/R,QAAS,SAAAvC,GAAG,OAAI4B,EAAKW,QAAQvC,IAC7BkmB,QAAS,SAAAvlB,GAAO,OAAIiB,EAAKskB,QAAQvlB,IACjCwE,UAAW,kBAAMvD,EAAKmjB,uBACtBoB,gBAAiB,kBAAMvkB,EAAKkjB,gBAvElCtjB,EA2EEgkB,kBAAA,SAAkB7f,GAChB,IAAK6D,EAAY1M,KAAKmnB,UAAUmC,qBAAsBzgB,GACpD,MAAM,IAAIjE,MAAJ,kCAA4CiE,IA7ExDnE,EAiFE0kB,QAAA,SAAQvlB,GACN7D,KAAKkoB,eAAejjB,KAAKpB,IAlF7Ba,EAqFEkkB,cAAA,SACEX,EACApf,EAFFuO,GAIgB,IACVpD,EAFFoI,EACYhF,EADZgF,KAAa5L,EACD4G,EADC5G,IAIf,GHnIK,QGmID4L,EACFpI,EAJYoD,EADN/V,WAMD,GHpIF,QGoIM+a,EAA4B,CACrC,IAAKrT,EAAakf,GAChB,MAAM,IAAIrjB,MAAJ,+DAC2DgE,IAD3D,6BAKR,IAAMsR,EAASV,GAAUyO,GACzBjU,EAAQpB,GAAa,QAASsH,GAAUA,EAAOlG,MAAMxD,IAGvD,IAAKwD,EACH,MAAM,IAAIpP,MAAJ,wBAGR,OAAOub,GAAmB8H,EAAuBpf,EAAQmL,IA7G7DtP,EAgHE+jB,yBAAA,SAAyBc,GAAuC,I/C0lB9BrhB,EAA6BrG,E+CzlBrDua,EAASmN,EAATnN,KAER,GHrJM,WGqJFA,EACF,OAAOxJ,GAAa,SAAUrK,EAAU1F,SACnC,GHrJD,WGqJKuZ,EAGT,OAAOxJ,GAAa,U/CklBU1K,E+CllBoBrF,Y/CklBkD,KAAzChB,E+CnlB1C0nB,EAAIvd,Y/CmlBsCnK,EAAa,GAdvE,SAAsBqG,EAA6BrG,QAAyC,IAAzCA,MAAa,GAGnE,IAFA,IAAIyG,EAASJ,EAEJ9H,EAAI,EAAGA,EAAIyB,EAAGzB,IAAK,CACxB,IAAKkI,EACD,OAGJA,EAASD,EAAUC,GAGvB,OAAOA,EAIAkhB,CAAathB,EAAK6D,EAAmB7D,GAAOrG,K+CllB5C,GHxJD,WGwJKua,EAAmC,KAEpC5L,EAAQ+Y,EAAR/Y,IACFiZ,EAAWje,EAAY3I,QAE7B,IAAK4mB,EACH,MAAM,IAAI7kB,MAAJ,gCANoC,QAAA8O,EAAA,EAAAgW,EASxBrf,EAAqBof,GATG/V,EAAAgW,EAAAnnB,OAAAmR,IASQ,CAA/C,IAAM/J,EAAK+f,EAAAhW,GACd,GAAI3K,EAAaY,GAAQ,CACvB,IAAMuQ,EAASV,GAAU7P,GAEzB,GAAIuQ,GAAUA,EAAOyP,SAAWzP,EAAOyP,QAAQnZ,GAC7C,OAAO0J,EAAOyP,QAAQnZ,KAM9B,MAAM,IAAI5L,MAAJ,kBAA4BwX,EAA5B,6BA7IV1X,EAgJEklB,SAAA,WAGE,OADA5pB,KAAKgU,MAAQhU,KAAKgU,OAAS,GACpBhU,KAAKgU,OAnJhBtP,EAsJEmkB,SAAA,SAAS7U,EAAqBpH,EAAgBid,QAA2B,IAA3BA,OAAoB,GAChE,IAAMzC,EAAUpnB,KAAKkpB,aACfY,EAAgB9pB,KAAK4pB,WAU3BnY,GAAOqY,EFpMJ,SAAgC7B,EAA+Cd,EAA0BnT,EAAwBpH,EAAiBwa,EAA2ByC,QAA6C,IAA7CA,OAAqB,GAAwB,IAE7N,IAAMvlB,EAAS,GAF8MoP,EAAA,EAAAqC,EAK3MjV,OAAO8F,KAAKoN,GAL+LN,EAAAqC,EAAAxT,OAAAmR,IAKvL,CAAjC,IAAM/R,EAAGoU,EAAArC,GACJ2T,EAAOF,EAAUG,kBAAkB3lB,GAEzC,IAAI0lB,IAAQA,EAAK0C,YAAend,IAAWhE,EAAU/F,SAAYkG,EAAakf,GAA9E,CAIA,IAAM5mB,EAAQ6lB,GAAmBC,EAAWnT,EAAOrS,EAAKqS,EAAMrS,GAAMylB,GAEpE9iB,EAAO3C,GAAON,EACVgmB,GAAQA,EAAK2C,QAAU1lB,EAAO+iB,EAAK2C,SACnC1lB,EAAO+iB,EAAK2C,OAAS3oB,IAI7B,IAAKwoB,EAAU,QAAAtH,EAAA,EAAA0H,EACO9C,EAAU+C,eADjB3H,EAAA0H,EAAA1nB,OAAAggB,IACiC,CAAvC,IAAM5gB,EAAGsoB,EAAA1H,GACLvO,EAAMhS,eAAeL,KACtB2C,EAAO3C,GAAOulB,GAAmBC,EAAWnT,EAAOrS,EAAKqS,EAAMrS,GAAMylB,IAMhF,OAAO9iB,EE8JiB6lB,CACtBnqB,KAAKioB,sBACLjoB,KAAKmnB,UACLnT,EACApH,EACAwa,EACAyC,IATqE,QAAAtH,EAAA,EAAA6H,EAcjDpqB,KAAKkoB,eAd4C3F,EAAA6H,EAAA7nB,OAAAggB,IAcrD6H,EAAA7H,GACRhiB,KAAKP,KAAM8pB,IArKzBplB,EAyKEokB,cAAA,WAAgB,IAAAzjB,EAAArF,KACd6C,OAAOmS,iBAAiB,eAAgB,WACtC3P,EAAKiD,OAAO+hB,WAAWvJ,kBAGzBje,OAAOmS,iBAAiB,SAAU,WAChC3P,EAAKiD,OAAO+hB,WAAWvJ,kBAGzBpT,EAAc1N,KAAKioB,sBAAuB,WACxC5iB,EAAKilB,aAnLX5lB,EAuLE6lB,cAAA,WAA4E,IAAA7P,EAExE1a,KAAKmoB,YAAcnoB,KAAKmnB,UAAUgB,YAAc,GAFwBqC,EAAA9P,EACpEpD,MADoEmT,EAAA/P,EACrDlD,OADqDkT,EAAAhQ,EACrCrG,eADqC,IAAAqW,EAC3B,OAD2BA,EAI1E,MAAO,CAAEpT,WAJiE,IAAAkT,KAI1DhT,YAJ0D,IAAAiT,KAIlDpW,QADxBA,EAAUI,GAAeJ,KA1L7B3P,EA8LEukB,eAAA,WAAsC,IAAAhjB,EAAAjG,KACpC,O3CpMOmT,KAAuBlQ,KAAK,WAC/B,GAAI8P,SAASC,KACT,OAAOD,SAASC,KAGpB,MAAM,IAAIpO,MAAM,kD2C+LS3B,KAAK,WAAM,IAAA0nB,EACH1kB,EAAKskB,gBAAhCjT,EAD8BqT,EAC9BrT,MAAOE,EADuBmT,EACvBnT,OAAQnD,EADesW,EACftW,QAElBA,IAAaiD,GAAUE,IAAWvR,EAAKkB,UAAYof,GAAQxe,OAIhEmP,GACE7C,EACA,SAAAwG,GACE5U,EAAKkjB,OAAO,CACV7R,MAAOA,EAFiCuD,EAAzCvD,WAE2B3R,EAC1B6R,OAAQA,EAHgCqD,EAAxBrD,YAGa7R,KAGjC,CAAE2R,QAAOE,cA9MjB9S,EAmNEskB,aAAA,WACE,IAAMjpB,EAAOC,KAEb,MAAO,CACL4qB,YADK,SACO5W,GAAyC,IAAA2K,EAAA3e,KACnD,OAAO4D,EAAakC,IAAI,kBACtB/F,EAAK8oB,SAAS7U,EAAO2K,EAAKoC,YAAY,MAI1CzD,MAPK,WAQH,OAAO1Z,EAAakC,IAAI,kBAAM/F,EAAKuqB,eA9N3C5lB,EAmOEykB,OAAA,SAAAnO,GAOE,OAAOhb,KAAKsI,OAAO6gB,OAAOrI,cAAc,CAAExJ,MADrB0D,EALrB1D,MAMiDE,OAD5BwD,EAJrBxD,UArOJ9S,EA6OE4Y,MAAA,WACE,OAAOtd,KAAKsI,OAAOgV,SA9OvB5Y,EAiPE4lB,QAAA,WACE,OAAO1mB,EAAakC,IAAI,WACtBjD,OAAOya,WAnPb5Y,EAuPE8Y,MAAA,WACE,OAAO5Z,EAAakC,IAAI,WACtBjD,OAAO2a,WAzPb9Y,EA6PEe,QAAA,SAAQvC,GAAgC,IAAA2nB,EAAA7qB,KACtC,OAAO4D,EAAakC,IAAI,WACtB,GAAI+kB,EAAKviB,QAAUuiB,EAAKviB,OAAO7C,QAC7B,OAAOolB,EAAKviB,OAAO7C,QAAQvC,GAE3B,MAAMA,KAlQd6kB,EAAA,GCtCa+C,GAAoD,GCoFjE,SAASC,GAAoB1D,EAAmC1lB,EAAcN,GAC1E,OAAOuC,EAAakC,IAAI,WACpB,MAA+B,mBAApBuhB,EAAK2D,WACL3D,EAAK2D,WAAW,CAAE3pB,UACS,iBAApBgmB,EAAK2D,WACZ3D,EAAK2D,WAELrpB,IAMnB,SAASspB,GAAoB5D,EAAmC1lB,EAAcN,GAC1E,OAAOuC,EAAakC,IAAI,WACpB,MAA+B,mBAApBuhB,EAAK6D,YAA6B7Y,GAAUhR,GAC5CgmB,EAAK6D,WAAW,CAAE7pB,UAElBA,IDpGnBypB,GAAevE,GAAQze,QAAU,CAC7BqjB,aAAa,EAEbC,UAH6B,WAIzB,OAAOpF,GAAe3Q,GAAO,CACzBQ,WAAY1T,EAAA,CACRkpB,MAAOrrB,KAAKmnB,UAAUxmB,MACnBX,KAAKmnB,UAAUtR,WAAWR,YAKzCkJ,KAZ6B,SAYxB+M,GAA0E,IAAAxnB,EAAA9D,KAC3E,IAAKsrB,EACD,MAAM,IAAI1mB,MAAJ,qCAGV,OAAO0mB,EAAWrqB,MAAMgC,KAAK,SAAA0G,GACzB,OAAOwL,GAAiBxL,GAAO1G,KAAK,SAAAiF,GAEhC,I5CyyBqBmM,EAAuBxQ,EAGpDuP,E4C5yBcmY,G5CyyBelX,E4CzyBqB1K,E5C0yBtD9F,EAAUuN,GAD8CvN,E4CzyBK,kBAAMC,EAAKwZ,U5C8yBpErG,GAAgB5C,GAChBxQ,IAEAuP,EAAW1B,GAAa,WAChBuF,GAAgB5C,KAChBjB,EAASnM,SACTpD,MAEL,IAGA,CACHoD,OADG,WAEKmM,GACAA,EAASnM,Y4CvzBT,OAJAnD,EAAK0nB,MAAM/Y,SAAS,kBAAM8Y,EAAatkB,WACvCnD,EAAK0nB,MAAM/Y,SAAS,kBAAMsE,GAAepN,KACzC7F,EAAK0nB,MAAM/Y,SAAS,kBExC7B,SAAuBvK,GAA6B,IACvD,IADuDwL,EAAA,EAAA+X,EAC/BrR,GAAY,mBACEnZ,IAAIiH,EAAK,IAFQwL,EAAA+X,EAAAlpB,OAAAmR,IAErC+X,EAAA/X,GACNjP,OAAO,IAAIG,MAAJ,sCAAgDc,MAAMyL,IFqCnCua,CAAcxjB,KAEjC4W,GAAc5W,QAKjCyjB,mBA9B6B,WA+BzB,OAAO3F,GAAe3Q,GAAO,CACzBQ,WAAY1T,EAAA,CACRxB,KAAI,2BAA+BX,KAAKmnB,UAAUxmB,KAA9C,IAAwDmP,IAAxD,KACJub,MAAK,cAAiBrrB,KAAKmnB,UAAUxmB,MAClCX,KAAKmnB,UAAUtR,WAAWR,YAKzCuW,cAxC6B,SAwCfC,EAAwBC,GAAmF,IAAAhnB,EAAA9E,KACrH,IAAK8rB,EACD,MAAM,IAAIlnB,MAAJ,qCAGV,OAAOknB,EAAoB7qB,MAAMgC,KAAK,SAAA8oB,GAGlC,OAFAjnB,EAAK0mB,MAAM/Y,SAAS,kBAAMsE,GAAegV,KAElC5W,GAAiB4W,GAAgB9oB,KAAK,SAAA+oB,GACzC,OAAO7iB,EAAiB6iB,KACzB/oB,KAAK,SAAAiF,GACJ,OAAO4W,GAAc5W,QAKjC+jB,SAAU,CACN,oBACA,kBACA,YACA,qBACA,YACA,OACA,kBGTD,IAAMC,GAAb,WAgBI,SAAAA,EAAY/E,EAA0BnT,GAA2B,IAAAlQ,EAAA9D,UAdjEmnB,eAciE,EAAAnnB,KAbjEmsB,YAaiE,EAAAnsB,KAZjEwrB,WAYiE,EAAAxrB,KAXjE6W,WAWiE,EAAA7W,KATjEosB,iBASiE,EAAApsB,KARjEqsB,mBAQiE,EAAArsB,KANjEgU,WAMiE,EAAAhU,KALjEssB,WAKiE,EAAAtsB,KAJjEqJ,WAIiE,EAAArJ,KAFjE6rB,cAEiE,EAC7D7rB,KAAKosB,YAAc,IAAIxoB,EACvB5D,KAAKqsB,cAAgB,GAGrBrsB,KAAKgU,MAAQ,GAEbhU,KAAKwrB,MAAQlZ,GAAQtS,MACrBA,KAAKssB,MAAQ,GAEbtsB,KAAKmnB,UAAYA,EAEjBnnB,KAAKusB,YAAYvY,EAAMvO,SACvBzF,KAAK6oB,SAAS7U,GACdhU,KAAKmnB,UAAUqF,wBAAwBxsB,MACvCA,KAAKwrB,MAAM/Y,SAAS,kBAAM3O,EAAKqjB,UAAUsF,uBAAuB3oB,KAChE9D,KAAK0sB,iBAhCb,IAAAhoB,EAAAwnB,EAAAvnB,UAAA,OAAAD,EAmCI6nB,YAAA,SAAY9mB,GAA4B,IhDwcpCknB,EACAxoB,EgDzcoCW,EAAA9E,KACpCA,KAAK6W,OhDucL8V,EAAY,GACZxoB,EAAW,GAER,CAEH6a,GAFG,SAEA4N,EAAoB/oB,GACnB,IAAIgpB,EAAc1oB,EAASyoB,GAAazoB,EAASyoB,IAAc,GAE/DC,EAAY5nB,KAAKpB,GAEjB,IAAI+hB,GAAY,EAEhB,MAAO,CACH3e,OADG,WAEM2e,IACDA,GAAY,EACZiH,EAAY3lB,OAAO2lB,EAAY7nB,QAAQnB,GAAU,OAOjEuN,KApBG,SAoBEwb,EAAoB/oB,GAErB,IAAIgf,EAAW7iB,KAAKgf,GAAG4N,EAAW,WAC9B/J,EAAS5b,SACTpD,MAGJ,OAAOgf,GAGXiK,QA9BG,SA8BKF,GAA0E,QAAAG,EAAAzqB,UAAAC,OAAnD6E,EAAmD,IAAAyF,MAAAkgB,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAnD5lB,EAAmD4lB,EAAA,GAAA1qB,UAAA0qB,GAE9E,IAAIH,EAAc1oB,EAASyoB,GACvBtmB,EAAW,GAEf,GAAIumB,EAAa,QAAAvnB,EAAA,SAAAoO,GACR,IAAI7P,EAAWgpB,EAAJnZ,GACZpN,EAASrB,KAAKrB,EAAakC,IAAI,kBAAMjC,EAAOpB,WAAP,EAAW2E,OAFvCsM,EAAA,EAAAA,EACOmZ,EADPtqB,OAAAmR,IACoBpO,EAAAoO,GAKrC,OAAO9P,EAAayC,IAAIC,GAAUrD,KAAKkO,KAG3C8b,YA5CG,SA4CSL,GAER,GAAID,EAAUC,GACV,OAAOhpB,EAAaH,UAGxBkpB,EAAUC,IAAa,EAN2D,QAAAM,EAAA5qB,UAAAC,OAAnD6E,EAAmD,IAAAyF,MAAAqgB,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAnD/lB,EAAmD+lB,EAAA,GAAA7qB,UAAA6qB,GAOlF,OAAOntB,KAAK8sB,QAALrqB,MAAAzC,KAAA,CAAa4sB,GAAbtiB,OAA2BlD,OgD3ftCpH,KAAK6W,MAAMmI,GAAG2H,GAAMC,OAAU,kBAAM9hB,EAAKkP,MAAMoZ,aAC/CptB,KAAK6W,MAAMmI,GAAG2H,GAAMG,QAAU,kBAAMhiB,EAAKkP,MAAMqZ,cAC/CrtB,KAAK6W,MAAMmI,GAAG2H,GAAME,SAAU,kBAAM/hB,EAAKkP,MAAMsZ,eAC/CttB,KAAK6W,MAAMmI,GAAG2H,GAAMI,MAAU,kBAAMjiB,EAAKkP,MAAMuZ,YAC/CvtB,KAAK6W,MAAMmI,GAAG2H,GAAMK,MAAU,SAAChT,GAAD,OAAWlP,EAAKkP,MAAMoV,QAAQpV,KAE5DhU,KAAK6W,MAAMmI,GAAG2H,GAAMtL,MAAO,SAAAnY,GACvB,OAAI4B,EAAKkP,OAASlP,EAAKkP,MAAMvO,QAClBX,EAAKkP,MAAMvO,QAAQvC,GACnBuC,EACAA,EAAQvC,GAER4B,EAAKsnB,YAAY3nB,OAAOvB,GAAKD,KAAK,WACrC8B,WAAW,WACP,MAAM7B,GACP,QArDvBwB,EA2DI8oB,OAAA,SAAOnrB,EAAgC8R,EAAkChN,GAAwD,IAAA9B,EAAArF,KAC7H,OAAO4D,EAAakC,IAAI,WACpBT,EAAK8hB,UAAUqB,IAAf,UAEAnjB,EAAK8mB,OAASrB,GAAe3jB,GAC7B,IAAMqJ,EAAUyV,GAAP,IAAiB5gB,EAAK8hB,UAAU5R,IAAhC,IAAyCzF,IAC5CjH,EAASxD,EAAKuD,YACd6kB,EAAgBpoB,EAAKqoB,mBAE3BroB,EAAK8hB,UAAUwG,iBAAiBtrB,EAAQwG,EAAQsL,GAE5C9R,IAAWQ,QACXwC,EAAK4mB,SAAS9kB,EAAS9E,GAG3B,IAAMkQ,EAAQ,GAkEd,OAhEAA,EAAMwW,KAAO1jB,EAAK+mB,YAClB7Z,EAAMqb,SAAWvoB,EAAKuoB,WACtBrb,EAAM6a,SAAW/nB,EAAKwR,MAAMiW,QAAQnG,GAAMC,QAE1CrU,EAAMsb,kBAAoBxoB,EAAKwoB,kBAAkB1Z,GAEjD5B,EAAM6Y,UAAY/lB,EAAK+lB,YACvB7Y,EAAMoZ,mBAAqBtmB,EAAKsmB,qBAEhCpZ,EAAMub,gBAAkBlqB,EAAayC,IAAI,CAAEkM,EAAMsb,kBAAmBtb,EAAM6Y,UAAW7Y,EAAMoZ,qBAAsB1oB,KAAK,SAAAuZ,GAClH,OAAOnX,EAAKyoB,gBAD+JtR,EAAA,GAC/H,CAAErV,UAASqJ,MAAK8a,WAD+G9O,EAAA,GACnGsP,oBADmGtP,EAAA,OAI/KjK,EAAMgM,KAAOlZ,EAAK8mB,OAAOhB,YACnB9lB,EAAKkZ,OACLhM,EAAM6Y,UAAUnoB,KAAK,SAAAqoB,GAAU,OAAIjmB,EAAKkZ,KAAK+M,KAEnD/Y,EAAMqZ,cAAgBhoB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAMoZ,qBAAsB1oB,KAAK,SAAAmU,GAClF,OAAO/R,EAAKumB,cAD6GxU,EAAA,GAAAA,EAAA,MAI7H7E,EAAMwb,SAAWnqB,EAAayC,IAAI,CAC9BkM,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAEZ,OADAxmB,EAAKwmB,SAAWA,EACTxmB,EAAK2oB,YAAYnC,OAIhCtZ,EAAM0b,UAAYrqB,EAAayC,IAAI,CAAEkM,EAAMqZ,cAAerZ,EAAMwb,WAAY9qB,KAAK,SAAAyX,GAC7E,OAAOrV,EAAK4oB,UAD4FvT,EAAA,GAC/D,CAAEvT,UAASqJ,UAGxD+B,EAAM2b,QAAUtqB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAMqb,SAAUrb,EAAM4b,cAAe5b,EAAM0b,YAAahrB,KAAK,SAAA4X,GACxG,OAD+HA,EAAA,GAC/G6C,YAD+G7C,EAAA,MAInItI,EAAM6b,gBAAkB7b,EAAMgM,KAAKtb,KAAK,SAAA4oB,GACpC,OAAOxmB,EAAK+oB,gBAAgB,CAAEvC,WAAU4B,gBAAe5kB,SAAQxG,SAAQ8E,UAASqJ,UAGpF+B,EAAM4b,cAAiBvqB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAM6b,kBAAmBnrB,KAAK,SAAA+X,GAChF,OAD8GA,EAAA,GAC9F4C,QAD8F5C,EAAA,MAIlHzI,EAAMuW,cAAgBvW,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAClCxmB,EAAKyjB,cAAc+C,KAGvBtZ,EAAM8a,UAAYzpB,EAAayC,IAAI,CAAEkM,EAAMub,gBAAiBvb,EAAM0b,YAAahrB,KAAK,WAChF,OAAOoC,EAAKwR,MAAMiW,QAAQnG,GAAMG,WAGpCvU,EAAM8b,WAAa9b,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAC/B,OAAOxmB,EAAKgpB,WAAWxC,EAAU4B,EAAetmB,KAGpDoL,EAAM+b,WAAa/b,EAAM2b,QAAQjrB,KAAK,WAClC,OAAOoC,EAAKipB,eAGhB/b,EAAM6a,SAAW7a,EAAMwW,KAAK9lB,KAAK,WAC7B,OAAOoC,EAAKwR,MAAMiW,QAAQnG,GAAME,YAG7BjjB,EAAa+C,KAAK4L,KAE1B7M,MAAM,SAAAxC,GACL,OAAOU,EAAayC,IAAI,CACpBhB,EAAKI,QAAQvC,GACbmC,EAAKilB,QAAQpnB,KACdD,KAAK,WACJ,MAAMC,MAEXD,KAAKkO,KArJhBzM,EAwJImpB,kBAAA,SAAkB1Z,GACd,OAAOvQ,EAAakC,IAAI,WACpB,OAAO8O,GAAaT,KACrBlR,KAAK,SAAAsrB,GACJ,OAAOvI,GAAeuI,MA5JlC7pB,EAgKI0pB,gBAAA,SAAAnT,GAAoP,IAC1OmN,EAAepoB,KAAKwuB,kBAAkB,CAAE3C,SADkM5Q,EAAlO4Q,SAC0C4B,cADwLxS,EAAxNwS,cAC+C5kB,OADyKoS,EAAzMpS,OACwCxG,OADiK4Y,EAAjM5Y,OACwC8E,QADyJ8T,EAApL9T,QACoCqJ,IADgJyK,EAAzLzK,MAEvD,WAAayV,GAAb,KAAwBjmB,KAAKmnB,UAAUxmB,KAAvC,KAAkD8O,EAAaxC,KAAKC,UAAUkb,IAA9E,MAlKR1jB,EAqKI+pB,YAAA,SAAY5C,EAAwB4B,EAAwB5kB,EAA0B2H,GAClF,IAAMnP,EAAQye,GAAiB+L,EAAUhjB,EAAQ7I,KAAK0uB,iBAAiB7lB,IAEjE8lB,EAAWlB,IAAkB7kB,IAC7B,CAAEwT,KPjOP,MOiOgC5L,OAC3B,CAAE4L,KPnOP,MOmOgC/a,SAEjC,GPpOC,QOoOGstB,EAAQvS,KAA4B,CACpC,IAAMlC,EAASV,GAAU3W,QACzBqX,EAAOlG,MAAQkG,EAAOlG,OAAS,GAC/BkG,EAAOlG,MAAMxD,GAAOnP,EAEpBrB,KAAKwrB,MAAM/Y,SAAS,kBACTyH,EAAOlG,MAAMxD,KAI5B,OAAOme,GAtLfjqB,EAyLI8pB,kBAAA,SAAArX,GAA0Q,IAAAyX,OAAA,IAAAzX,EAAnB,GAAmBA,EAAtP0U,EAAsP+C,EAAtP/C,SAAU4B,EAA4OmB,EAA5OnB,cAAe5kB,EAA6N+lB,EAA7N/lB,OAA6NgmB,EAAAD,EAArNvsB,cAAqN,IAAAwsB,EAA5MhsB,OAA4MgsB,EAApM1nB,EAAoMynB,EAApMznB,QAASqJ,EAA2Loe,EAA3Lpe,IAC3E,MAAO,CACHA,MACArJ,UACAmhB,QAASD,SACTxf,OAASD,EAAU/F,QACnB0S,IAASvV,KAAKmnB,UAAU5R,IACxBjN,OAAStI,KAAK8uB,aAAazsB,EAAQorB,EAAejd,EAAKrJ,GACvD6M,MAAShU,KAAKyuB,YAAY5C,EAAU4B,EAAe5kB,EAAQ2H,GAC3D7Q,QAASmgB,GAAiB+L,EAAUhjB,EAAQ7I,KAAK+uB,mBAAmBlD,MAlMhFnnB,EAsMIspB,YAAA,SAAYnC,GAA6C,IAAA5lB,EAAAjG,KACrD,OAAO4D,EAAakC,IAAI,WACpBG,EAAK4lB,SAAWA,KAxM5BnnB,EA4MIwkB,WAAA,WAAgC,IAAAvK,EAAA3e,KAC5B,MAAO,CACHssB,MAAatsB,KAAKssB,MAClBzV,MAAa7W,KAAK6W,MAClByG,MAAa,kBAAMqB,EAAKrB,SACxBE,MAAa,kBAAMmB,EAAKnB,SACxB2L,OAAa,SAAAjI,GAAA,OAAuBvC,EAAKwK,OAAO,CAAE7R,MAArC4J,EAAG5J,MAAyCE,OAA5C0J,EAAU1J,UACvB/R,QAAa,SAACvC,GAAD,OAASyb,EAAKlZ,QAAQvC,IACnC0nB,YAAa,SAAC5W,GAAD,OAAW2K,EAAKiM,YAAY5W,MApNrDtP,EAwNImkB,SAAA,SAAS7U,EAA2B6V,QAA4B,IAA5BA,OAAqB,GACjD7pB,KAAKmnB,UAAU6H,UACfhvB,KAAKmnB,UAAU6H,SAAS,CAAEhb,UAG9B,IAAMoT,EAAUpnB,KAAKkpB,cF1RtB,SAAwB/B,EAA0BnT,EAAsBib,EAAgC7H,EAA4ByC,QAA4B,IAA5BA,OAAqB,GAI5JpY,GAAOuC,EADPib,EAAaA,GAAc,IAHwI,IAMnK,IAAMC,EAAYrF,EAAW,GAAH,GAAAvf,OAAa6c,EAAU+C,gBANkHxW,EAAA,EAAAqC,EASjJjV,OAAO8F,KAAKqoB,GATqIvb,EAAAqC,EAAAxT,OAAAmR,IASxH,CAAtC,IAAM/R,EAAGoU,EAAArC,IACsB,IAA5Bwb,EAAUlqB,QAAQrD,IAClButB,EAAUjqB,KAAKtD,GAX4I,IAenK,IAAMwtB,EAAU,GAER7C,EAAiClF,EAAjCkF,MAAOhP,EAA0B8J,EAA1B9J,MAAOE,EAAmB4J,EAAnB5J,MAAO/X,EAAY2hB,EAAZ3hB,QAjBsI8c,EAAA,EAAAA,EAmBjJ2M,EAnBiJ3sB,OAAAggB,IAmBtI,CAAxB,IAAM5gB,EAAOutB,EAAJ3M,GACJ6M,EAAUjI,EAAUG,kBAAkB3lB,GAExCN,EAAQ4tB,EAAWttB,GAEvB,GAAKytB,EAAL,CAIA,IAAMpF,EAAQoF,EAAQpF,MAgBtB,GAfIA,KACK3X,GAAUhR,IAAUgR,GAAU4c,EAAWjF,MAC1C3oB,EAAQ4tB,EAAWjF,IAEvBmF,EAAQlqB,KAAK+kB,IAGboF,EAAQ/tB,QACRA,EAAQ+tB,EAAQ/tB,MAAM,CAAE2S,QAAOsY,QAAOhP,QAAOE,QAAO/X,cAGnD4M,GAAUhR,IAAU+tB,EAAQC,UAC7BhuB,EAAQ+tB,EAAQC,QAAQ,CAAErb,QAAOsY,QAAOhP,QAAOE,QAAO/X,aAGtD4M,GAAUhR,KACW,UAAjB+tB,EAAQhT,MAAoBvP,MAAMC,QAAQzL,UAAiBA,IAAU+tB,EAAQhT,MAC7E,MAAM,IAAIhW,UAAJ,uBAAsCgpB,EAAQhT,KAA9C,KAAyDza,GAKvEqS,EAAMrS,GAAON,GAnDkJ,QAAAyU,EAAA,EAAAA,EAsD/IqZ,EAtD+I5sB,OAAAuT,WAwDxJ9B,EAFSmb,EAAJrZ,IAtDmJ,QAAA8N,EAAA,EAAA0L,EA4DjJxuB,OAAO8F,KAAKoN,GA5DqI4P,EAAA0L,EAAA/sB,OAAAqhB,IA4D7H,CAAjC,IAAMjiB,EAAG2tB,EAAA1L,GACJwL,EAAUjI,EAAUG,kBAAkB3lB,GAEtCN,EAAQ2S,EAAMrS,GAEfytB,IAID/c,GAAUhR,IAAU+tB,EAAQJ,UAE5BI,EAAQJ,SAAS,CAAE3tB,QAAO2S,UAG1B3B,GAAUhR,IAAU+tB,EAAQG,WAE5Bvb,EAAMrS,GAAOytB,EAAQG,SAAS,CAAEluB,QAAO2S,QAAOsY,QAAOhP,QAAOE,QAAO/X,cA5EwF,QAAAqe,EAAA,EAAAmG,EAgFjJ9C,EAAU+C,eAhFuIpG,EAAAmG,EAAA1nB,OAAAuhB,IAgFvH,CAAvC,IAAMniB,EAAGsoB,EAAAnG,GAEV,IAAyB,IADTqD,EAAUG,kBAAkB3lB,GAChC6tB,WAAuBnd,GAAU2B,EAAMrS,IAC/C,MAAM,IAAIiD,MAAJ,kBAA6BjD,EAA7B,oBEwMV8tB,CAAYzvB,KAAKmnB,UAAWnnB,KAAKgU,MAAOA,EAAOoT,EAASyC,IA9NhEnlB,EAiOIkpB,SAAA,WAAkC,IF9KN8B,EAA0C1b,EAEhEP,EE4K4BoX,EAAA7qB,KAC9B,OF/KwB0vB,EE+KJvtB,EAAA,GAAKnC,KAAKmnB,UAAUnT,MAAUhU,KAAKmnB,UAAUwI,cF/KC3b,EE+KehU,KAAKgU,MF7KpFP,EAAS,GAGR7P,EAAayC,IAAIvF,OAAO8F,KAAKoN,GAAOnN,IAAI,SAAAlF,GAE3C,IAAM0lB,EAAOqI,EAAS/tB,GAEtB,GAAK0lB,EAIL,OAAOzjB,EAAaH,UAAUR,KAAK,WAE/B,IAAM5B,EAAQ2S,EAAMrS,GAEpB,GAAKN,GAIAgmB,EAAK2D,WAIV,OAAO3pB,IAER4B,KAAK,SAAA5B,GAEJ,GAAIA,QAIJ,OAAOuC,EAAayC,IAAI,CAEpB0kB,GAAc1D,EAAM1lB,EAAKN,GAEzB4pB,GAAc5D,EAAM1lB,EAAKN,KAC1B4B,KAAK,SAAAuZ,GAAgC,IAEhClY,EAFG0mB,EAA6BxO,EAAA,GAAjB0O,EAAiB1O,EAAA,GAIpC,GAA0B,kBAAf0O,EACP5mB,EAAS4mB,EAAWloB,gBACjB,GAA0B,iBAAfkoB,EACd5mB,EAAS4mB,EAAWloB,gBACjB,GAA0B,iBAAfkoB,GAA0C,OAAfA,GAEzC,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBnZ,KAC1C3I,EAAS2I,KAAKC,UAAUge,QACrB,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBE,OACjDhiB,EAASqL,KAAK1C,KAAKC,UAAUge,SAC1B,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBC,SAAWgB,EAAKuI,cAAe,CAChFtrB,E9CqUjB,SAASurB,EAAO7hB,EAAc8hB,EAAsBC,GAEvD,IAAK,IAAIpuB,UAF4F,IAApEmuB,MAAkB,SAAkD,IAA9CC,MAAkB,IACzED,EAASA,EAAaA,EAAP,IAAoBA,EACnB9hB,EACPA,EAAIhM,eAAeL,IAApB,MAA4BqM,EAAIrM,IAA+D,mBAAbqM,EAAIrM,KAE/EqM,EAAIrM,IAAQkL,MAAMC,QAAQkB,EAAIrM,KAASqM,EAAIrM,GAAKY,QAAUyL,EAAIrM,GAAKquB,MAAM,SAAAzf,GAAG,MAAmB,iBAARA,IAC9Fwf,EAAM,GAAKD,EAAWnuB,EAAhB,MAA4BqM,EAAIrM,GAAK8L,KAAK,KACzCO,EAAIrM,IAA4B,iBAAbqM,EAAIrM,GAC9BouB,EAASF,EAAO7hB,EAAIrM,GAAL,GAAemuB,EAAWnuB,EAAQouB,GAEjDA,EAAM,GAAKD,EAAWnuB,GAA6BqM,EAAIrM,GA3BlDqB,YA8Bb,OAAO+sB,E8ClVsBF,CAAO3E,EAAYvpB,GADoD,QAAAoiB,EAAA,EAAAkM,EAG3DnvB,OAAO8F,KAAKtC,GAH+Cyf,EAAAkM,EAAA1tB,OAAAwhB,IAGtC,CAArC,IAAMmM,EAAMD,EAAAlM,GACbtQ,EAAOyc,GAAU5rB,EAAO4rB,GAG5B,YAGyB,iBAAfhF,IACd5mB,EAAS4mB,EAAWloB,YAGxByQ,EAAOuX,GAAc1mB,SAI7BrB,KAAK,WACL,OAAOwQ,KEwGsFxQ,KAAK,SAAAktB,GAC9F,O/C9KL,SAAmB7iB,EAAcgI,QAA2F,IAA3FA,MAA8E,IAElH,IAGI8a,EAEAC,EALAF,EAAQ7a,EAAQ6a,OAAS,GACzBxpB,EAAO2O,EAAQ3O,MAAQ,GAHoG2pB,EAS/FhjB,EAAIC,MAAM,KAA3B8iB,EATgHC,EAAA,OAAAC,GAS7HH,EAT6HE,EAAA,IAUlF/iB,MAAM,KAAjD6iB,EAV6HG,EAAA,GAY/H,IAAI/c,EAAcM,GAZ6Gyc,EAAA,GAYlFJ,GACzCK,EAAa1c,GAAYuc,EAAc1pB,GAU3C,OARI6M,IACA4c,EAAkBA,EAAP,IAAwB5c,GAGnCgd,IACAJ,EAAkBA,EAAP,IAAwBI,GAGhCJ,E+CuJQK,CnDysBZ,SAA0BnjB,GAC7B,GAJyC,IAIvBD,EAAiBC,GAJrBtI,QAAQwC,EAASC,MAK3B,OAAO6F,EAIP,MAAM,IAAI1I,MAAJ,4CmD/sBe8rB,CAAiB7F,EAAK1D,UAAUwJ,OAAO9F,EAAK7W,QAAS,CAAEmc,aAnOpFzrB,EAuOIkE,UAAA,WACI,OAAO5I,KAAKmnB,UAAUve,UAAU5I,KAAKgU,QAxO7CtP,EA2OIgpB,iBAAA,WACI,OAAO1tB,KAAKmnB,UAAUuG,iBAAiB1tB,KAAKgU,QA5OpDtP,EA+OIgqB,iBAAA,SAAiB7lB,GAA2C,IACxD,IAAMvE,EAAS,GADyCoP,EAAA,EAAAqC,EAGtCjV,OAAO8F,KAAK5G,KAAKgU,OAHqBN,EAAAqC,EAAAxT,OAAAmR,IAGb,CAAtC,IAAM/R,EAAGoU,EAAArC,GACJ2T,EAAOrnB,KAAKmnB,UAAUG,kBAAkB3lB,GAE1C0lB,IAA6B,IAArBA,EAAKuJ,aAIbvJ,GAAQA,EAAK0C,aAAerd,EAAY7D,EAAQD,EAAU/F,WAK9DyB,EAAO3C,GAAO3B,KAAKgU,MAAMrS,IAI7B,OAAO2C,GAlQfI,EAqQIkmB,YAAA,SAAY5W,GAAgD,IAAA6c,EAAA7wB,KAGxD,OAFAA,KAAK6oB,SAAS7U,GAAO,GAEdhU,KAAKosB,YAAYnpB,KAAK,WACzB,GAAI4tB,EAAKxnB,MACL,OAAOwnB,EAAKxnB,MAAMuhB,YAAYiG,EAAKnC,iBAAiBmC,EAAKjoB,cAAclD,MAAM,SAAAxC,GACzE,GAAK2tB,EAAKxnB,OAAUwnB,EAAKhF,SAIzB,OAAOgF,EAAKxG,WAAWwG,EAAKhF,UAAU5oB,KAAK,WACvC,GAAI4tB,EAAKxnB,MACL,MAAMnG,SAjRlCwB,EAyRI0mB,UAAA,WAA4D,IAAA0F,EAAA9wB,KACxD,OAAO4D,EAAakC,IAAI,WACpB,GAAIgrB,EAAK3E,OAAOf,UACZ,OAAO0F,EAAK3E,OAAOf,UAAU7qB,KAAKuwB,MA5RlDpsB,EAiSIinB,mBAAA,WAAqE,IAAAoF,EAAA/wB,KACjE,OAAO4D,EAAakC,IAAI,WACpB,GAAIirB,EAAK5E,OAAOR,mBACZ,OAAOoF,EAAK5E,OAAOR,mBAAmBprB,KAAKwwB,MApS3DrsB,EAySI6Z,KAAA,SAAK+M,GAA0E,IAAA0F,EAAAhxB,KAC3E,OAAO4D,EAAakC,IAAI,WACpBkrB,EAAK7J,UAAUqB,IAAf,QAEA,IAAMyI,EAAaD,EAAKhd,MAAMnR,OAE9B,OAAIouB,GACAD,EAAKxF,MAAM/Y,SAAS,kBAAMwe,EAAW3T,UAC9BwB,GAAcmS,IAGlBD,EAAK7E,OAAO5N,KAAKhe,KAAKywB,EAAM1F,KAEpCroB,KAAK,SAAA4oB,GAEJ,OADAmF,EAAKnF,SAAWA,EACTA,KAxTnBnnB,EA4TIknB,cAAA,SAAcC,EAAwBC,GAAmF,IAAAoF,EAAAlxB,KACrH,OAAO4D,EAAakC,IAAI,WACpB,OAAOorB,EAAK/E,OAAOP,cAAcrrB,KAAK2wB,EAAMrF,EAAUC,MA9TlEpnB,EAkUI8Y,MAAA,WAA6B,IAAA2T,EAAAnxB,KACzB,OAAO4D,EAAakC,IAAI,WACpB,GAAIqrB,EAAKtF,SACL,OAAOsF,EAAKtF,SAASrO,QAAQva,KAAKkO,OArUlDzM,EA0UIunB,SAAA,SAAS9kB,EAAmC9E,GAAgC,IAAA+uB,EAAApxB,KACxEA,KAAKmnB,UAAUqB,IAAf,YADwE,IAGxE,IAAMxU,EAAQ,GAH0DuO,EAAA,EAAA8O,EAIjDrxB,KAAKmnB,UAAU+C,eAJkC3H,EAAA8O,EAAA9uB,OAAAggB,IAIlB,CAAjD,IAAM+O,EAAQD,EAAA9O,GACXviB,KAAKmnB,UAAUG,kBAAkBgK,GAAUC,gBAC3Cvd,EAAMsd,GAAYtxB,KAAKgU,MAAMsd,IANmC,IAUxE,IAAME,EAAmB7W,GAAKtY,EAAY6jB,GAAb,IAAwClmB,KAAKmnB,UAAUxmB,KAAS,CACzFwG,UACA6M,QACAyd,UAAW,CACP5a,MAAS7W,KAAK6W,MACdyG,MAAS,kBAAM8T,EAAK9T,SACpB7X,QAAS,SAACvC,GAAD,OAASkuB,EAAK3rB,QAAQvC,OAGpCD,KAAK,SAAAyuB,GAAc,IAAX5W,EAAW4W,EAAX5W,KAEP,OADAsW,EAAK5F,MAAM/Y,SAASqI,EAAKwP,SAClBxP,EAAK2W,YAEb/rB,MAAM,SAAAxC,GACL,MAAM,IAAI0B,MAAJ,+FAA0G0M,GAAepO,MAxB3DoC,EAAA,SAAAwQ,EAAA6b,GA2BnE,IAAMhwB,EAAGgwB,EAAA7b,GAEVsb,EAAKzvB,GAAO,WAAoD,IAAAiwB,EAAA5xB,KAAA6gB,EAAAve,UAC5D,OAAOkvB,EAAiBvuB,KAAK,SAAAwuB,GACzB,OAAOA,EAAU9vB,GAAKc,MAAMmvB,EAAMtvB,OA/B0BwT,EAAA,EAAA6b,EA2BtD3xB,KAAKmsB,OAAOF,SA3B0CnW,EAAA6b,EAAApvB,OAAAuT,IA2BhCxQ,EAAAwQ,EAAA6b,IArWhDjtB,EA+WIoqB,aAAA,SAAazsB,EAAgCwG,EAAiB2H,EAAcrJ,GAExE,GAAI0B,IAAWD,EAAU/F,QAAS,CAC9B,IAAMqX,EAASV,GAAU3W,QAOzB,OANAqX,EAAOyP,QAAUzP,EAAOyP,SAAW,GACnCzP,EAAOyP,QAAQnZ,GAAO3N,OACtB7C,KAAKwrB,MAAM/Y,SAAS,kBACTyH,EAAOyP,QAAQnZ,KAGnB,CAAE4L,KP1aX,SO0a2C5L,OAG7C,OAAIrJ,IAAYof,GAAQxe,MACb,CAAEqU,KPjbX,UOobK,CAAEA,KPlbP,SOkbuCpQ,SAAUD,EAAmBlJ,UAhY9E6B,EAmYIokB,cAAA,SAAc+C,GAA6C,IAAAgG,EAAA7xB,KACnD4lB,GAAY,EAMhB,OAJA5lB,KAAKwrB,MAAM/Y,SAAS,WAChBmT,GAAY,IAGThiB,EAAayD,MAAM,KAAMpE,KAAK,WACjC,OAAO4oB,EAASpO,aACjBxa,KAAK,SAAAwa,GACJ,OAAIA,GACAoU,EAAK1K,UAAUqB,IAAf,sBACOqJ,EAAKvU,SACJsI,OAAL,EACIiM,EAAK/I,cAAc+C,MAjZ1CnnB,EAsZIgoB,eAAA,WAAiB,IAAAoF,EAAA9xB,KACP+xB,EAAuB/c,GAAiBnS,OAAQ,SAAUuO,GAAK,WACjE0gB,EAAK3K,UAAUqB,IAAf,iBACAsJ,EAAKxH,QAAQ,IAAI1lB,MAAJ,6BAGjB5E,KAAKwrB,MAAM/Y,SAASsf,EAAqB9qB,SA5ZjDvC,EA+ZI4pB,WAAA,WAAkC,IAAA0D,EAAAhyB,KAC9B,OAAO4D,EAAakC,IAAI,WACpB,IAAMC,EAAUisB,EAAKhe,MAAMjO,QAE3B,GAAIA,EACA,OAAOisB,EAAK5F,YAAYrmB,QAAQA,EAAS,IAAInB,MAAJ,qCAAgDmB,EAAhD,qBApazDrB,EAyaIutB,UAAA,SAAU5oB,GAAkD,IAAA6oB,EAAAlyB,KACxD,OAAO4D,EAAakC,IAAI,WACpBosB,EAAK1G,MAAMzc,IAAI,QAAS1F,GACxB6oB,EAAK9F,YAAY3oB,aA5a7BiB,EAgbIqqB,mBAAA,SAAmB7mB,GAA0C,IAAAiqB,EAAAnyB,KACnDyF,EAAa,SAACvC,GAAD,OAASivB,EAAK1sB,QAAQvC,IACnC6lB,EAAa,SAAC1f,GAAD,OAAW8oB,EAAKF,UAAU5oB,IAO7C,OAFA0f,EAAKtjB,QAAUA,EAER,CAAEsjB,OAAMzL,MANI,kBAAM6U,EAAK7U,SAMR+M,WALH,kBAAM8H,EAAK9H,WAAWniB,IAKPihB,OAJf,SAAAiJ,GAAA,OAAuBD,EAAKhJ,OAAO,CAAE7R,MAArC8a,EAAG9a,MAAyCE,OAA5C4a,EAAU5a,UAIa/R,YAzblDf,EA4bIykB,OAAA,SAAAkJ,GAAyF,IAAAC,EAAAtyB,KAAhFsX,EAAgF+a,EAAhF/a,MAAOE,EAAyE6a,EAAzE7a,OACZ,OAAO5T,EAAakC,IAAI,WACpBwsB,EAAKzb,MAAMiW,QAAQnG,GAAMM,OAAQ,CAAE3P,QAAOE,cA9btD9S,EAkcI2lB,WAAA,SAAWniB,GAAwC,IAAAqqB,EAAAvyB,KAC/C,OAAOkI,EAAIuV,WAAWxa,KAAK,SAAA0H,GACvB,OAAIA,EACO4nB,EAAKjV,QAGT1Z,EAAayD,MAAM,KACrBpE,KAAK,kBAAMiF,EAAIuV,aACfxa,KAAK,SAAAuvB,GACF,GAAIA,EACA,OAAOD,EAAKjV,aA5cpC5Y,EAkdI4Y,MAAA,WAA6B,IAAAmV,EAAAzyB,KACzB,OAAO4D,EAAakC,IAAI,WAEpB,OADA2sB,EAAKtL,UAAUqB,IAAf,SACOiK,EAAK5b,MAAMiW,QAAQnG,GAAMI,SAEjC9jB,KAAK,WAKJ,OAJIwvB,EAAKppB,OACLopB,EAAKppB,MAAMiU,MAAMwD,gBAAgBpb,MAAMyL,IAGpCshB,EAAKnI,QAAQ,IAAI1lB,MAAJ,kBAA4B,MA5d5DF,EAgeIupB,UAAA,SAAUyE,EAAVC,GAAwI,IAAAC,EAAA5yB,KAA3FmH,EAA2FwrB,EAA3FxrB,QAASqJ,EAAkFmiB,EAAlFniB,IAClD,OAAO5M,EAAakC,IAAI,WACpB,IAAM+sB,EAAoBD,EAAKzL,UAAU0L,kBAEzC,GAAKA,EAAL,CAIA,IAAIC,EAAkBJ,EAAkBlU,YAExC,GAAKsU,GAAoB/pB,EAAa+pB,InDrc3C,SAAuB5qB,GAC1B,IAEI,IAAKA,EAAIC,SAASwV,KACd,OAAO,EAGX,GAA0B,gBAAtBzV,EAAIC,SAASwV,KACb,OAAO,EAEb,MAAOza,IAIT,OAAO,EmDub4D6vB,CAAcD,GAAzE,CAMA,IAAM3nB,GAFN2nB,EAAkB3pB,EAAiB2pB,IAEP/f,SACtB8B,EAAK+d,EAAKI,eAAeH,EAAmB,CAAE1rB,UAASqJ,MAAKrF,QAElE,GAAK0J,EAAL,CAIA,GAAIA,EAAGzJ,gBAAkBD,EACrB,MAAM,IAAIvG,MAAJ,qF/C9Ff,SAA8BsD,EAA4B2M,GAE7D,IAAIU,EAAMV,EAAGoe,QAAQ7iB,cAErB,GAAY,SAARmF,EACA,MAAM,IAAI3Q,MAAJ,oCAA+C2Q,GAKzD,IAFA,IAAIlK,EAAkBnD,EAAI6K,SAAS1H,gBAE5BA,EAAgB6nB,UAAY7nB,EAAgB6nB,SAAS3wB,QACxD8I,EAAgB2L,YAAY3L,EAAgB6nB,SAAS,IAGzD,KAAOre,EAAGqe,SAAS3wB,QACf8I,EAAgB6I,YAAYW,EAAGqe,SAAS,I+CkFpCC,CAAqBL,EAAiBje,GA1BZ,IAAAue,EA4BgCR,EAAKzL,UAAUgB,YAAc,GA5B7DkL,EAAAD,EA4BpB9b,aA5BoB,IAAA+b,KAAAC,EAAAF,EA4BL5b,cA5BK,IAAA8b,KAAAC,EAAAH,EA4BW/e,eA5BX,IAAAkf,EA4BqB,OA5BrBA,GA6B1Blf,EAAUI,GAAeJ,EAASlJ,MAElBmM,GAASE,IACrBN,GAAS7C,EAAS,SAAAmf,GACdZ,EAAKzJ,OAAO,CACR7R,MAAQA,EAF8Ckc,EAAzClc,WAEc3R,EAC3B6R,OAAQA,EAH8Cgc,EAAxBhc,YAGD7R,KAElC,CAAE2R,QAAOE,SAAQtP,IAAK4qB,UAtgBzCpuB,EA2gBIsuB,eAAA,SAAeS,EAAfC,GAA6S,IAAAC,EAAA3zB,KAEzS,OAAOyzB,EAASlzB,KAAKP,KAAM,CACvBmU,UAHqSuf,EAA3Nvf,UAI1EhN,QAJqSusB,EAAzOvsB,QAK5DqJ,IALqSkjB,EAAhOljB,IAMrErF,IANqSuoB,EAAhNvoB,IAOrFxB,MAPqS+pB,EAA3M/pB,MAQ1FoiB,eARqS2H,EAApM3H,eASjGvO,MAAY,kBAAMmW,EAAKnW,SACvBF,MAAY,kBAAMqW,EAAKrW,SACvBgP,MAAYtsB,KAAKssB,MACjBtY,MAAYhU,KAAKgU,MACjBuB,IAAYvV,KAAKmnB,UAAU5R,IAC3Bqe,WAAY5zB,KAAKmnB,UAAUyM,WAC3B/c,MAAY7W,KAAK6W,SA1hB7BnS,EA8hBIopB,gBAAA,SAAgB+F,EAAhBC,GAAmT,IAAAC,EAAA/zB,KAAtPsrB,EAAsPwI,EAAtPxI,WAAYQ,EAA0OgI,EAA1OhI,oBAAqB3kB,EAAqN2sB,EAArN3sB,QAASqJ,EAA4MsjB,EAA5MtjB,IACnG,OAAO5M,EAAayC,IAAI,CACpBwtB,EAAe5yB,MAAMgC,KAAK2R,IAE1B0W,EAAaA,EAAWrqB,MAAQ,KAEhC6qB,EAAsBA,EAAoB7qB,MAAQ,OACnDgC,KAAK,SAAA+wB,GAA0C,IAAvC7f,EAAuC6f,EAAA,GACxCC,EAAiBF,EAAKf,eAAee,EAAK5M,UAAU+M,kBAAmB,CAAE/sB,UAASqJ,MAAK2D,YAAWxK,MAD1DqqB,EAAA,GACiEjI,eADjEiI,EAAA,GACiF7oB,IAAK4H,WACpI,GAAIkhB,EAGA,OAFA/f,GAAYC,EAAW8f,GACvBF,EAAKvI,MAAM/Y,SAAS,kBAAMsE,GAAekd,KAClCjO,GAAeiO,MA1iBtCvvB,EA+iBI4lB,QAAA,SAAQpnB,EAAc4pB,GAAgD,IAAAqH,EAAAn0B,KAClE,YADkE,IAAhD8sB,OAAqB,GAChClpB,EAAakC,IAAI,WAMpB,OALK5C,IACD4pB,GAAU,EACV5pB,EAAM,IAAI0B,MAAM,wBAEpBuvB,EAAKhN,UAAUqB,IAAf,WACO2L,EAAK1uB,QAAQvC,EAAK4pB,KAC1B7pB,KAAK,WACJ,OAAOkxB,EAAK3I,MAAMnlB,SAxjB9B3B,EA4jBIe,QAAA,SAAQvC,EAAa4pB,GAAgD,IAAAsH,EAAAp0B,KACjE,YADiE,IAAhD8sB,OAAqB,GAC/BlpB,EAAakC,IAAI,WACpB,IAAyC,IAArCsuB,EAAK/H,cAAcrnB,QAAQ9B,GAO/B,OAHAkxB,EAAK/H,cAAcpnB,KAAK/B,GACxBkxB,EAAKhI,YAAYhnB,YAAYlC,GAEzB4pB,EACOsH,EAAKvd,MAAMiW,QAAQnG,GAAMtL,MAAOnY,QAD3C,KArkBZwB,EA2kBI2pB,WAAA,SAAWxC,EAAwBhjB,EAAiB1B,KA3kBxD+kB,EAAA,GC9CamI,GAAb,WAiBI,SAAAA,EAAYlN,EAA0B3kB,EAAgC8S,GAA+B,IAAAxR,EAAA9D,UAfrGmnB,eAeqG,EAAAnnB,KAdrGwC,YAcqG,EAAAxC,KAbrGmH,aAaqG,EAAAnH,KAZrGmsB,YAYqG,EAAAnsB,KAXrGgU,WAWqG,EAAAhU,KAVrGwrB,WAUqG,EAAAxrB,KARrGwd,WAQqG,EAAAxd,KAPrGmpB,YAOqG,EAAAnpB,KANrGgzB,oBAMqG,EAAAhzB,KAJrGsd,WAIqG,EAAAtd,KAHrGyF,aAGqG,EAAAzF,KAFrG6W,WAEqG,EACjG7W,KAAKmnB,UAAYA,EACjBnnB,KAAKmH,QAAUmO,EAAQnO,QACvBnH,KAAKmsB,OAASrB,GAAexV,EAAQnO,SACrCnH,KAAKwrB,MAAQlZ,GAAQtS,MAErBA,KAAKwd,MAAQ0O,GAAgBvnB,UAAU6Y,MACvCxd,KAAKmpB,OAAS+C,GAAgBvnB,UAAUwkB,OACxCnpB,KAAKgzB,eAAiB9G,GAAgBvnB,UAAUquB,eAGhDhzB,KAAKgU,MAAQ,GAXoF,QAAAN,EAAA,EAAAqC,EAY1EjV,OAAO8F,KAAK0O,EAAQtB,OAZsDN,EAAAqC,EAAAxT,OAAAmR,IAY9C,CAA9C,IAAM4d,EAAQvb,EAAArC,GACT0b,EAAUpvB,KAAKmnB,UAAUG,kBAAkBgK,GAC7ClC,GAAWA,EAAQmC,eAAiBjc,EAAQtB,MAAMsd,KAElDtxB,KAAKgU,MAAMsd,GAAYhc,EAAQtB,MAAMsd,IAI7CtxB,KAAKsd,MAAUhI,EAAQmc,UAAUnU,MACjCtd,KAAKyF,QAAU6P,EAAQmc,UAAUhsB,QACjCzF,KAAK6W,MAAUvB,EAAQmc,UAAU5a,MAEjC7W,KAAKmnB,UAAUqF,wBAAwBxsB,MACvCA,KAAKwrB,MAAM/Y,SAAS,kBAAM3O,EAAKqjB,UAAUsF,uBAAuB3oB,KAEhE9D,KAAKs0B,oBAAoB9xB,GA5CjC,IAAAkC,EAAA2vB,EAAA1vB,UAAA,OAAAD,EA+CI6vB,YAAA,WAAmC,IAAAzvB,EAAA9E,KAC/B,MAAO,CACHyxB,UAAWzxB,KAAKw0B,eAChBlK,QAAW,kBAAMxlB,EAAKwlB,aAlDlC5lB,EAsDI4vB,oBAAA,SAAoB9xB,GAAgC,IAAA6C,EAAArF,KAC1Cy0B,EAA4B/mB,EAAclL,EAAQ,kBAAM6C,EAAKilB,WAAW,KAC9EtqB,KAAKwrB,MAAM/Y,SAASgiB,EAA0BxtB,SAxDtDvC,EA2DI8vB,aAAA,WAAsC,IAClC,IAAM/C,EAAY,GACZ1xB,EAAOC,KAFqBsF,EAAA,SAAAid,EAAAoP,GAI7B,IAAMhwB,EAAGgwB,EAAApP,GACVkP,EAAU9vB,GAAO,WAEb,OAAOuqB,GAAgBvnB,UAAUhD,GAAKc,MAAM1C,EAAMuC,YAEtDmvB,EAAU9vB,GAAKke,SAAWle,GATI4gB,EAAA,EAAAoP,EAIhB3xB,KAAKmsB,OAAOF,SAJI1J,EAAAoP,EAAApvB,OAAAggB,IAIMjd,EAAAid,EAAAoP,GAQxC,OAAOF,GAvEf/sB,EA0EI4lB,QAAA,WACI,OAAOtqB,KAAKwrB,MAAMnlB,OA3E1BguB,EAAA,GCGaK,GAAmD,CAE5DjiB,SAF4D,SAEnD0U,EAFmD3K,GAEyC,IAAhEmY,EAAgEnY,EAAhEmY,MAAOC,EAAyDpY,EAAzDoY,SAGxC,gBAAAC,GCxCO,IAAwBC,EAAUC,EDwCzC,SAAAC,IAAA,OAAAH,EAAApyB,MAAAzC,KAAAsC,YAAAtC,KCxCyC+0B,EDwCzCF,GCxC+BC,EDwC/BE,GCvCGrwB,UAAY7D,OAAOY,OAAOqzB,EAAWpwB,WAC9CmwB,EAASnwB,UAAU5B,YAAc+xB,EACjCA,EAASG,UAAYF,EDqCf,IAAArwB,EAAAswB,EAAArwB,UAAA,OAAAD,EACI8oB,OAAA,WACI,OAAOmH,EAAMlf,cAAc,MAAO,OAF1C/Q,EAKIwwB,kBAAA,WACI/N,EAAUqB,IAAV,+BAGA,IAAM3T,EAAK+f,EAASO,YAAYn1B,MAE1BsI,EAAS6e,EAAU4B,KAAKtX,GAAO,GAAIzR,KAAKgU,QAC9C1L,EAAOklB,OAAO3Y,EAAI0R,GAAQze,QAC1B9H,KAAK+tB,SAAS,CAAEzlB,YAbxB5D,EAgBI0wB,mBAAA,WAEQp1B,KAAKssB,OAAStsB,KAAKssB,MAAMhkB,QACzBtI,KAAKssB,MAAMhkB,OAAOsiB,YAAYnZ,GAAO,GAAIzR,KAAKgU,QAAQtO,MAAMyL,KAnBxE6jB,EAAA,CAAqBL,EAAMU,aEbtBC,GAAwC,CAEjD7iB,SAFiD,SAErC0U,EAA0BoO,GAElC,OAAOA,EAAIpO,UAAUA,EAAU5R,IAAK,CAChCiY,OADgC,SACzB/X,GACH,OAAOA,EAAc,QAGzB+f,cAAc,EAEdC,QAPgC,WAQ5B,IAAM5gB,EAAK7U,KAAK01B,IAGhB11B,KAAKsI,OAAS6e,EAAU4B,KAAKtX,GAAO,GAAIzR,KAAK21B,SAC7C31B,KAAKsI,OAAOklB,OAAO3Y,EAAI0R,GAAQze,SAGnC8tB,MAAO,CACHD,OAAQ,CACJ9xB,QAAS,WACD7D,KAAKsI,QAAUtI,KAAK21B,QACpB31B,KAAKsI,OAAOsiB,YAAYnZ,GAAO,GAAIzR,KAAK21B,SAASjwB,MAAMyL,KAG/D0kB,MAAM,QClCbC,GAA4C,CAErDrjB,SAFqD,SAE5C0U,EAA0B4O,GAqD/B,OAnDeA,EAAGn2B,OAAOunB,EAAU5R,IAAK,IAAIygB,UAA2B7O,EAAU5R,IrDomBvEvF,QAAQ,YAAa,SAACimB,GAChC,OAAOA,EAAE,GAAGC,gBqDrmB2E,WAAM,IAEzF,IAAMC,EAAQ,GAF2EziB,EAAA,EAAAuW,EAIvE9C,EAAU+C,eAJ6DxW,EAAAuW,EAAA1nB,OAAAmR,IAKrFyiB,EADUlM,EAAAvW,IACG,IAKjB,OAFAyiB,EAAMniB,MAAQ,IAEP,CACHmiB,QAEAC,SAAU,IAEVC,WAAY,CAAE,SAAU,WAAY,SAACC,EAAQC,GACzCpP,EAAUqB,IAAV,iCAYA,IAAMoB,EAAW,WACb,OAAO5X,GAAcskB,EAAOtiB,MAAO,SAAArR,GAC/B,MAAoB,mBAATA,EACA,WACH,IAAM2B,EAAS3B,EAAKF,MAAMzC,KAAMsC,WAEhC,OAhBhB,WACI,GAA6B,WAAzBg0B,EAAOE,MAAMC,SAAiD,YAAzBH,EAAOE,MAAMC,QAClD,IACIH,EAAOI,SACT,MAAOxzB,KAWDyzB,GACOryB,GAGR3B,KAITi0B,EAAWzP,EAAU4B,KAAKa,KAChCgN,EAASpJ,OAAO+I,EAAS,GAAIhQ,GAAQze,QAErCwuB,EAAOO,OAAO,WACVD,EAAShM,YAAYhB,KAAYlkB,MAAMyL,aCrBlD2lB,GAA8C,CAEvDrkB,SAFuD,SAE9CskB,EAF8Cva,GAEwD,IAAnEwa,EAAmExa,EAA/E6Y,UAA8B4B,EAAiDza,EAAjDya,SAAUC,EAAuC1a,EAAvC0a,WAAYC,EAA2B3a,EAA3B2a,OAEhFJ,EAAKvO,IAAI,mCAET,IAAMoB,EAAW,SAACzC,GACd,OAAOnV,GAAc7P,EAAA,GAAKglB,EAAUiQ,cAAkBjQ,EAAUnT,OAAS,SAAArR,GACrE,MAAoB,mBAATA,EACA,WAAkC,IAAAmB,EAAA9D,KAAA6gB,EAAAve,UACrC,OAAO6kB,EAAUkQ,KAAKC,IAAI,kBAAM30B,EAAKF,MAAMqB,EAAMxB,MAGlDK,KAIT40B,EACFP,EAAiB,CACbQ,SAAUT,EAAKxhB,IACfkiB,SAAU,cACVC,OAAU,CAAE,WACbC,MAAM,CACL50B,YAAa,CAAEm0B,EAAYC,EAAQ,SAA4BS,EAAYP,GACvEr3B,KAAK63B,OAAS,GACd73B,KAAK43B,WAAaA,EAClB53B,KAAKq3B,KAAOA,IAEhBS,SANK,WAOD,IAAMC,EAAgB/3B,KAAK43B,WAAWI,cAEtCh4B,KAAKsI,OAASyuB,EAAKhO,KAAKa,EAAS5pB,OACjCA,KAAKsI,OAAOklB,OAAOuK,EAAexR,GAAQze,SAE9CmwB,UAZK,WAaGj4B,KAAKsI,SAzDd,SAAC4vB,EAAMC,GAClB,IAAMC,EAAU,GAEhB,IAAK,IAAMz2B,KAAOu2B,EACd,GAAIA,EAAKl2B,eAAeL,KACpBy2B,EAAQz2B,IAAO,EAEXu2B,EAAKv2B,KAASw2B,EAAKx2B,IACnB,OAAO,EAKnB,IAAK,IAAMA,KAAOw2B,EACd,IAAKC,EAAQz2B,GACT,OAAO,EAIf,OAAO,EAsC6B02B,CAAOr4B,KAAK63B,OAAQ73B,KAAKgU,SACzChU,KAAK63B,OAAL11B,EAAA,GAAmBnC,KAAKgU,OACxBhU,KAAKsI,OAAOsiB,YAAYhB,EAAS5pB,WAejD,OATuBi3B,EAAS,CAC5BqB,aAAc,CAAEf,GAChB53B,QAAc,CAAE43B,KACjBI,MAAM,CACL50B,YADK,iBCrFXw1B,GAAQ,CACVC,QAAW,UACXC,UAAW,aAGR,SAASC,GAATlc,GAA8J,IAAvHhM,EAAuHgM,EAAvHhM,IAAK7G,EAAkH6S,EAAlH7S,MAAOoiB,EAA2GvP,EAA3GuP,eAAgB5gB,EAA2FqR,EAA3FrR,IAAK6I,EAAsFwI,EAAtFxI,MAAO6C,EAA+E2F,EAA/E3F,MAA+E8hB,EAAAnc,EAAxEoX,WAAetc,EAAyDqhB,EAAzDrhB,MAAOE,EAAkDmhB,EAAlDnhB,OAE3G,GAAK7N,GAAUoiB,EAAf,CAIA,IAAM6M,EAAMztB,EAAIsK,cAAc,OAC9BmjB,EAAIhjB,aAAa,KAAMpF,GACvB,IAAMgE,EAAQrJ,EAAIsK,cAAc,SA6DhC,OA5DIzB,EAAM6kB,UACNrkB,EAAMoB,aAAa,QAAS5B,EAAM6kB,UAGtCrkB,EAAMN,YAAY/I,EAAI+K,eAAJ,kBACV1F,EADU,2GAIA8G,EAJA,8BAKCE,EALD,oCAQVhH,EARU,iSAkBVA,EAlBU,aAkBQ+nB,GAAME,UAlBd,kEAsBVjoB,EAtBU,aAsBQ+nB,GAAMC,QAtBd,yDA2BlBI,EAAI1kB,YAAYvK,GAChBivB,EAAI1kB,YAAY6X,GAChB6M,EAAI1kB,YAAYM,GAEhBuX,EAAe+M,UAAUC,IAAIR,GAAMC,SACnC7uB,EAAMmvB,UAAUC,IAAIR,GAAME,WAE1B5hB,EAAMmI,GAAG2H,GAAME,SAAU,WACrBkF,EAAe+M,UAAUE,OAAOT,GAAMC,SACtCzM,EAAe+M,UAAUC,IAAIR,GAAME,WAEnC9uB,EAAMmvB,UAAUE,OAAOT,GAAME,WAC7B9uB,EAAMmvB,UAAUC,IAAIR,GAAMC,SAE1BzzB,WAAW,WACPgS,GAAegV,IAChB,KAGPlV,EAAMmI,GAAG2H,GAAMM,OAAQ,SAAA7P,GAA4C,IAAlCY,EAAkCZ,EAAzCE,MAAyBW,EAAgBb,EAAxBI,OACf,iBAAbQ,IACP4gB,EAAIpkB,MAAM8C,MAAQyB,GAAMf,IAGH,iBAAdC,IACP2gB,EAAIpkB,MAAMgD,OAASuB,GAAMd,MAI1B2gB,GC7ER,SAASK,GAATzc,GAA2F,IAApDrR,EAAoDqR,EAApDrR,IAAK6I,EAA+CwI,EAA/CxI,MAErCmC,EAAOhL,EAAIsK,cAAc,QACzBzC,EAAO7H,EAAIsK,cAAc,QACzBjB,EAAQrJ,EAAIsK,cAAc,SAC1ByjB,EAAU/tB,EAAIsK,cAAc,OAyClC,OAxCAyjB,EAAQJ,UAAUC,IAAI,WAElB/kB,EAAM6kB,UACNrkB,EAAMoB,aAAa,QAAS5B,EAAM6kB,UAGtC1iB,EAAKjC,YAAYlB,GACjBA,EAAKkB,YAAYglB,GACjBlmB,EAAKkB,YAAYM,GACjBA,EAAMN,YAAY/I,EAAI+K,eAAJ,k6BA+BXC,ECiDf,IAAMgjB,GAAc,kBAAMhoB,IACpBioB,GAAe,SAAA5c,GAAA,OAAepL,GAAfoL,EAAGnb,QChBXg0B,GAAb,WAqCI,SAAAA,EAAY/f,GAAmCtV,KAnC/CuV,SAmC+C,EAAAvV,KAlC/CW,UAkC+C,EAAAX,KAhC/CsN,SAgC+C,EAAAtN,KA/B/C6I,YA+B+C,EAAA7I,KA9B/Cq5B,eA8B+C,EAAAr5B,KA5B/CgU,WA4B+C,EAAAhU,KA3B/C2vB,kBA2B+C,EAAA3vB,KAzB/C4zB,gBAyB+C,EAAA5zB,KAxB/CmoB,gBAwB+C,EAAAnoB,KAtB/CspB,0BAsB+C,EAAAtpB,KApB/Cs5B,oBAoB+C,EAAAt5B,KAlB/C6V,gBAkB+C,EAAA7V,KAb/Ck0B,uBAa+C,EAAAl0B,KAZ/C6yB,uBAY+C,EAAA7yB,KAV/CgvB,cAU+C,EAAAhvB,KAR/Cu5B,iBAQ+C,EAAAv5B,KAN/Cw5B,YAM+C,EAAAx5B,KAJ/Cy5B,YAI+C,EAAAz5B,KAF/CkvB,eAE+C,EC5E5C,SAAqB5Z,GAExB,IAAKA,EACD,MAAM,IAAI1Q,MAAJ,iCAIV,IAAK0Q,EAAQC,MAAQD,EAAQC,IAAIvI,MAAM,4BACnC,MAAM,IAAIpI,MAAJ,wBAAmC0Q,EAAQC,KAKrD,GAnDJ,SAAoCD,GAEhC,GAAIA,EAAQtB,OAAoC,iBAAlBsB,EAAQtB,MAClC,MAAM,IAAIpP,MAAJ,0CAGV,IAAM80B,E3DoWH,SAAmB1rB,GACtB,IAAI1J,EAAS,GACb,IAAK,IAAI3C,KAAOqM,EACRA,EAAIhM,eAAeL,IACnB2C,EAAOW,KAAK+I,EAAIrM,IAGxB,OAAO2C,E2D3WgBkK,CAAO2X,IAE9B,GAAI7Q,EAAQtB,MAAO,QAAAN,EAAA,EAAAqC,EACGjV,OAAO8F,KAAK0O,EAAQtB,OADvBN,EAAAqC,EAAAxT,OAAAmR,IAC+B,CAAzC,IAAM/R,EAAGoU,EAAArC,GAGJ2T,EAAO/R,EAAQtB,MAAMrS,GAE3B,IAAK0lB,GAA0B,iBAATA,EAClB,MAAM,IAAIziB,MAAJ,0BAAqCjD,EAArC,oBAGV,IAAK0lB,EAAKjL,KACN,MAAM,IAAIxX,MAAJ,sBAGV,IAA2C,IAAvC80B,EAAe10B,QAAQqiB,EAAKjL,MAC5B,MAAM,IAAIxX,MAAJ,mCAA8C80B,EAAejsB,KAAK,OAG5E,GAAI4Z,EAAKmI,UAAYnI,EAAKgI,QACtB,MAAM,IAAIzqB,MAAJ,8CAGV,GAAIyiB,EAAKjL,OAAS+J,GAAU/K,UAAYiM,EAAK2D,aAAe3D,EAAK6D,WAC7D,MAAM,IAAItmB,MAAJ,6CAkBlB+0B,CAAwBrkB,GAEpBA,EAAQse,WAAY,CACpB,GAAIte,EAAQse,aAAejb,GAAKrD,EAAQse,WAAWtc,SAAWmB,GAAOnD,EAAQse,WAAWtc,OACpF,MAAM,IAAI1S,MAAJ,kEAGV,GAAI0Q,EAAQse,aAAejb,GAAKrD,EAAQse,WAAWpc,UAAYiB,GAAOnD,EAAQse,WAAWpc,QACrF,MAAM,IAAI5S,MAAJ,mEAId,GAAI0Q,EAAQgkB,gBACJhkB,EAAQgkB,iBAAmB/S,GAAQze,QAAUwN,EAAQgkB,iBAAmB/S,GAAQxe,MAChF,MAAM,IAAInD,MAAJ,8BAAwC0Q,EAAQgkB,gBAAkB,YAIhF,IAAKhkB,EAAQhI,IACT,MAAM,IAAI1I,MAAJ,iBAGV,GAA2B,iBAAhB0Q,EAAQhI,KAA2C,mBAAhBgI,EAAQhI,IAClD,MAAM,IAAIlH,UAAJ,yCAGV,GAAIkP,EAAQud,mBAA0D,mBAA9Bvd,EAAQud,kBAC5C,MAAM,IAAIjuB,MAAJ,uDAGV,GAAK0Q,EAAQ4e,mBAA8F,mBAA9B5e,EAAQ4e,kBACjF,MAAM,IAAItvB,MAAJ,uDDmCNoqB,CAAS1Z,GAKTtV,KAAKuV,IAAMD,EAAQC,IACnBvV,KAAKW,KAAOX,KAAKuV,IAAIvF,QAAQ,KAAM,KAEnChQ,KAAKspB,qBAAuBhU,EAAQgU,sBAAwB1hB,GAE5D,IAAMsS,EAASV,KAGf,GAFAU,EAAO0f,WAAa1f,EAAO0f,YAAc,GAErC1f,EAAO0f,WAAW55B,KAAKuV,KACvB,MAAM,IAAI3Q,MAAJ,2DAAsE5E,KAAKuV,KAMrFvV,KAAK2vB,aDvCF,CACH9sB,OAAQ,CACJuZ,KAAe,SACfwU,aAAe,EACfpB,UAAe,EACf+B,eAAe,EACfvC,SALI,SAAA5X,GAKkE,IAA3D/V,EAA2D+V,EAA3D/V,MACP,IAAK0M,EAAS1M,KAAWyc,GAAYG,cAAc5c,GAC/C,MAAM,IAAIuD,MAAJ,mCAGd2qB,SAVI,SAAA7U,GAWA,OAAOoE,GADyEpE,EAAzErZ,SAKf0E,QAAS,CACLqW,KAAa,SACboT,UAAa,EACboB,aAAa,GAGjBtT,MAAO,CACHlB,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAA1M,GAAA,OAAAA,EAAGyC,QAGtBE,MAAO,CACHpB,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAvM,GAAA,OAAAA,EAAGwC,QAGtB2L,OAAQ,CACJ/M,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAtM,GAAA,OAAAA,EAAGkO,SAGtB0P,SAAU,CACNzc,KAAU,SACVoT,UAAU,GAGdnnB,UAAW,CACP+T,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAqH,GAAA,OAAAA,EAAGvmB,YAGtBghB,gBAAiB,CACbjN,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAArG,GAAA,OAAAA,EAAGmI,kBAGtBgE,UAAW,CACPjR,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfW,eAAe,EACflC,QAAe8J,GACf5J,SAAe6J,IAGnB9L,WAAY,CACRlR,KAAa,WACboT,UAAa,EACboB,aAAa,EACbvB,QAAa8J,GACb5J,SAAa6J,IAGjBhM,SAAU,CACNhR,KAAa,WACboT,UAAa,EACboB,aAAa,EACbvB,QAAa8J,GACb5J,SAAa6J,IAGjB7L,QAAS,CACLnR,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfW,eAAe,EACflC,QAAe8J,GACf5J,SAAe6J,IAGnB3zB,QAAS,CACL2W,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAmK,GAAA,OAAAA,EAAGjsB,UAGtB2jB,QAAS,CACLhN,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfvB,QAAe8J,GACf5R,cAAe,SAAA6K,GAAA,OAAAA,EAAGhJ,WCpEtBppB,KAAKgU,MAAQsB,EAAQtB,OAAS,GAtBa,IAAAwI,EA0BsClH,EAAQse,YAAc,GA1B5DiG,EAAArd,EA0BnClF,MA1BmCwiB,EAAAtd,EA0BDhF,OAC1CxX,KAAK4zB,WAAa,CAAEtc,WA3BuB,IAAAuiB,EA0B3BrT,GAAmBC,MA1BQoT,EA2BhBriB,YA3BgB,IAAAsiB,EA0BQtT,GAAmBE,OA1B3BoT,GA6B3C95B,KAAKsN,IAAMgI,EAAQhI,IACnBtN,KAAK6I,OAASyM,EAAQzM,OACtB7I,KAAKq5B,UAAY/jB,EAAQ+jB,UAEzBr5B,KAAK6V,WAAaP,EAAQO,YAAc,GACxC7V,KAAK6V,WAAWR,OAASrV,KAAK6V,WAAWR,QAAU,GACnDrV,KAAK6V,WAAWkkB,MAAQ/5B,KAAK6V,WAAWkkB,OAAS,GAEjD/5B,KAAKs5B,eAAiBhkB,EAAQgkB,gBAAkB/S,GAAQze,OAExD9H,KAAKmoB,WAAa7S,EAAQ6S,WAGtBnoB,KAAKk0B,kBADL5e,EAAQ4e,kBACiB5e,EAAQ4e,kBAERwE,GAIzB14B,KAAK6yB,kBADLvd,EAAQud,kBACiBvd,EAAQud,kBAERoG,GAG7Bj5B,KAAKgvB,SAAW1Z,EAAQ0Z,SAExBhvB,KAAKy5B,OAASnkB,EAAQmkB,QAAU,CAC5BO,MAAO7oB,GACP8oB,KAAO9oB,GACP+oB,KAAO/oB,GACPjN,MAAOiN,IAGXnR,KAAKm6B,gBACLn6B,KAAKo6B,iBAELlgB,EAAO0f,WAAW55B,KAAKuV,KAAOvV,KAtGtC,IAAA0E,EAAA2wB,EAAA1wB,UAAA,OAAAD,EAyGIwlB,aAAA,WACI,GAAIlqB,KAAKkvB,UACL,OAAOlvB,KAAKkvB,UAFoB,IAKpC,IAAMA,EAAYpuB,OAAO8F,KAAK5G,KAAKgU,OALCN,EAAA,EAAAqC,EAMlBjV,OAAO8F,KAAK5G,KAAK2vB,cANCjc,EAAAqC,EAAAxT,OAAAmR,IAMc,CAA7C,IAAM/R,EAAGoU,EAAArC,IACsB,IAA5Bwb,EAAUlqB,QAAQrD,IAClButB,EAAUjqB,KAAKtD,GAKvB,OADA3B,KAAKkvB,UAAYA,EACVA,GAtHfxqB,EA0HI4iB,kBAAA,SAAkB3mB,GAEd,OAAOX,KAAKgU,MAAMrT,IAASX,KAAK2vB,aAAahvB,IA5HrD+D,EA+HIynB,OAAA,SAAOxrB,EAAe05B,GAEd,IAAMC,EAAU,CAAE5F,SAAOoB,WAASR,OAAKwB,aAEvC,IAAKwD,EAAQ35B,GACT,MAAM,IAAIiE,MAAJ,wCAAmDjE,GAS7D,OANAX,KAAKu5B,YAAcv5B,KAAKu5B,aAAe,GAElCv5B,KAAKu5B,YAAY54B,KAClBX,KAAKu5B,YAAY54B,GAAQ25B,EAAQ35B,GAAM8R,SAASzS,KAAMq6B,IAGnDr6B,KAAKu5B,YAAY54B,IA7IpC+D,EAmJIy1B,cAAA,WACI,GAAIn6B,KAAKu6B,UAAW,CAChB,GAAI13B,OAAO22B,OACP,MAAM,IAAI50B,MAAJ,oBAA+B5E,KAAKW,KAApC,qEAGV,IAAM0I,EAAQ,IAAI0e,GAAe/nB,MACjC6C,OAAO22B,OAASx5B,KAAKw5B,OAASnwB,EAAMugB,aA1JhDllB,EA8JI01B,eAAA,WAAiB,IAAAt2B,EAAA9D,KACbgf,GAAOkH,GAAL,IAAsClmB,KAAKW,KAAS,WAClD,OAAO,IAGXqe,GAAOkH,GAAL,IAAgClmB,KAAKW,KAAS,SAAAyW,GAAqD,IAAAojB,EAAApjB,EAA1C0D,KAEvD,OADiB,IAAIuZ,GAAkBvwB,EAD0DsT,EAAlD5U,OACM,CAAE2E,QAD0CqzB,EAAlCrzB,QACC6M,MADiCwmB,EAAzBxmB,MACDyd,UAD0B+I,EAAlB/I,YAE/D8C,iBArK5B7vB,EAyKI+1B,YAAA,SAAYvyB,GACR,OAAOyS,GAAKzS,EAASge,GAAV,IAA2ClmB,KAAKW,MAASsC,KAAK,SAAAyX,GACrE,OADmFA,EAAXI,OAEzEpV,MAAM,WACL,OAAO,KA7KnBhB,EAiLIisB,OAAA,SAAO3c,GACH,MAAwB,mBAAbhU,KAAKsN,IACLtN,KAAKsN,IAAI,CAAE0G,UAGfhU,KAAKsN,KAtLpB5I,EAyLIgpB,iBAAA,SAAiB1Z,GACb,OAAIhU,KAAK6I,QAAiC,iBAAhB7I,KAAK6I,OACpB7I,KAAK6I,OAGTwE,EAAiBrN,KAAK2wB,OAAO3c,KA9L5CtP,EAiMIkE,UAAA,SAAUoL,GACN,OAAIzM,GAAQvH,KAAK6I,QAEN7I,KAAK6I,OAGT7I,KAAK0tB,iBAAiB1Z,IAvMrCtP,EA0MIg2B,aAAA,WACI,GAAI16B,KAAKq5B,UACL,OAAOr5B,KAAKq5B,WA5MxB30B,EAgNI61B,QAAA,WACI,IAAMI,EAAU7S,KAChB,OAAO/a,QAAQ4tB,GAAWA,EAAQplB,MAAQvV,KAAKuV,MAlNvD7Q,EAqNIk2B,oBAAA,SAAgDzzB,EAAmCgN,GAC/E,GAAIA,EAAW,CACX,GAAyB,iBAAdA,IAA2BC,GAAUD,GAC5C,MAAM,IAAI/N,UAAJ,oDAGV,OAAO+N,EAGX,GAAIhN,IAAYof,GAAQxe,MAEpB,MAAO,OAGX,MAAM,IAAInD,MAAJ,mDAnOdF,EAsOIm2B,kBAAA,SAAkB1zB,EAAoC6M,GAClD,GAAIA,EAAMnR,OACN,OAAOic,GAAc9K,EAAMnR,QAAQub,UAGvC,GAAIjX,EAAS,CACT,GAAIA,IAAYof,GAAQze,QAAUX,IAAYof,GAAQxe,MAClD,MAAM,IAAInD,MAAJ,yBAAoCuC,GAG9C,OAAOA,EAGX,OAAOnH,KAAKs5B,gBAnPpB50B,EAsPIqkB,KAAA,SAAK/U,GAAsD,IAAAlP,EAAA9E,KAKjDsI,EAAS,IAAI4jB,GAAgBlsB,KAFnCgU,EAAQA,GAAS,IAIXwZ,EAAS,SAACnrB,EAAQ8R,EAAWhN,GAApB,OAAgCvD,EAAakC,IAAI,WAC5D,IAAKiI,EAAS1L,GACV,MAAM,IAAIuC,MAAJ,gCAKV,OAFAuC,EAAUrC,EAAK+1B,kBAAkB1zB,EAAS6M,GAC1CG,EAAYrP,EAAK81B,oBAAoBzzB,EAASgN,GACvC7L,EAAOklB,OAAOnrB,EAAQ8R,EAAWhN,MAG5C,OAAAhF,EAAA,GACOmG,EAAO4gB,aADd,CAEIsE,OAAU,SAACrZ,EAAWhN,GAAZ,OAAwBqmB,EAAO3qB,OAAQsR,EAAWhN,IAC5D2zB,SAAU,SAACz4B,EAAQ8R,EAAWhN,GAApB,OAAgCqmB,EAAOnrB,EAAQ8R,EAAWhN,OA1QhFzC,EA8QIipB,iBAAA,SAAiBtrB,EAAgCwG,EAA0BsL,GACvE,GAAI9R,IAAWQ,OAAf,CAIA,IAAKoJ,EAAgBpJ,OAAQR,GACzB,MAAM,IAAIuC,MAAJ,uCAGV,IAAMgI,EAAShE,IAEf,IAAK8D,EAAY7D,EAAQ+D,KAAY7D,EAAa1G,GAC9C,MAAM,IAAIuC,MAAJ,8BAAyCiE,EAAO7F,WAAhD,yBAAqF4J,GAG/F,GAAIuH,GAAkC,iBAAdA,EACpB,MAAM,IAAIvP,MAAJ,sEAAiFuP,EAAjF,QA9RlBzP,EAkSI8jB,IAAA,SAAI3R,EAAgB8jB,GAChB36B,KAAKy5B,OAAOQ,KAASj6B,KAAKW,KAA1B,IAAoCkW,EAAU8jB,IAnStDj2B,EAsSI8nB,wBAAA,SAA2BoK,GACvB,IAAM1c,EAASV,KACfU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GACrD7gB,EAAO6gB,iBAAiB91B,KAAK2xB,IAzSrClyB,EA4SI+nB,uBAAA,SAA0BmK,GACtB,IAAM1c,EAASV,KACfU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GACrD7gB,EAAO6gB,iBAAiB7zB,OAAOgT,EAAO6gB,iBAAiB/1B,QAAQ4xB,GAAW,IA/SlFvB,EAAA,GAuTO,SAAS3zB,GAAU4T,GpBrXnB,IJsEAoF,EAAqCsE,EAAIrE,EACtCT,EItEDV,KAAYwhB,cACbxhB,KAAYwhB,aAAc,EJoEUhc,GAArCtE,EIlE2B,CAAEsE,MAAIrE,UJkEIqE,GAAIrE,EAA2CD,EAA3CC,MACtCT,EAASV,MACRwI,eAAiB9H,EAAO8H,gBAAmB,SAAApX,GAAO,OAAIoX,GAAepX,EAAS,CAAEoU,KAAIrE,UA4CxF,SAAAK,GAA6F,IAAhEgE,EAAgEhE,EAAhEgE,GAAIrE,EAA4DK,EAA5DL,KAC7BjB,KAAclK,SAAS,sBAAuB,WAEjD,OAAOwF,GAAiBnS,OAAQ,UAAW,SAAAgU,IApC5C,SAAyBA,EAAzBgE,GAAiG,IAA/CmE,EAA+CnE,EAA/CmE,GAAIrE,EAA2CE,EAA3CF,KAQnDnY,EAASqU,EAAMrU,QAAUqU,EAAMokB,cACjCruB,EAASiK,EAAMjK,QAAWiK,EAAMqkB,eAAiBrkB,EAAMqkB,cAActuB,OACnEkO,EAAOjE,EAAMiE,KAMnB,GAJe,SAAXlO,IACAA,EAAapF,EAASE,KAAhB,MAGLlF,EAAL,CAIA,IAAKoK,EACD,MAAM,IAAIhI,MAAJ,2CASVod,GAAe,CAAExf,SAAQoK,SAAQkO,QAAQ,CAAEkE,KAAIrE,UAQvCwgB,CAAgBtkB,EAAO,CAAEmI,KAAIrE,aIpHjCygB,CAAkB,CAAEpc,MAAIrE,U/BYzB,SAAAiU,GAAqF,IAAhE5P,EAAgE4P,EAAhE5P,GAAIrE,EAA4DiU,EAA5DjU,KACrBjB,GAAY,oBAAoBlK,SAAS,gBAAiB,WAC7D,IAAMqT,EAA4B7D,EAtB5BhG,GAAaE,MAAO,CAAErQ,OAAQjB,IAAY,SAAAwP,GAAwB,IAArB5U,EAAqB4U,EAArB5U,OAAQoK,EAAawK,EAAbxK,OAE3D,OADA4N,GAAgBhY,GAAQiB,QAAQ,CAAEyE,IAAK1F,EAAQqG,OAAQ+D,IAChD,CAAEgO,WAAYL,QAsBfjS,EAASkD,IAKf,OAJIlD,GACAmS,GAASnS,EAAQ,CAAEqS,SAAQjV,MAAMyL,IAG9B0R,I+BfPwY,CAAU,CAAErc,MAAIrE,WoB6WpB,IAAMwM,EAA2B,IAAIkO,GAAU/f,GAEzCyT,EAAO,SAAC/U,GAAD,OAAWmT,EAAU4B,KAAK/U,IAOvC,OANA+U,EAAKoD,OAAS,SAACxrB,EAAM05B,GAAP,OAAelT,EAAUgF,OAAOxrB,EAAM05B,IACpDtR,EAAKwR,QAAU,kBAAMpT,EAAUoT,WAC/BxR,EAAK0R,YAAc,SAACvyB,GAAD,OAASif,EAAUsT,YAAYvyB,IAClD6gB,EAAKyQ,OAASrS,EAAUqS,OAGjBzQ,EAGJ,SAASuS,KACR/W,IACAA,GAAOgX,iBAGX,IAAM/0B,EAAU,GAEV0T,EAASV,KAEf,IADAU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GAC9C7gB,EAAO6gB,iBAAiBx4B,QAC3BiE,EAAQvB,KAAKiV,EAAO6gB,iBAAiB,GAAGzQ,QAAQ,IAAI1lB,MAAJ,sBAAgC,IAGpF,OAAOhB,EAAayC,IAAIG,GAASvD,KAAKkO,IAGnC,IAAMqqB,GAAoBF,GAE1B,SAAShR,KpBvYT,IJgHGzH,EwBwRNyY,YnB5ZOz4B,OAAM,gBPgCV,WAAmC,IACtC,IAAM44B,EAAoB/hB,GAAY,qBADAhG,EAAA,EAAAgoB,EAEnBD,EAAkB70B,OAFC8M,EAAAgoB,EAAAn5B,OAAAmR,IAEO,CAAxC,IAAM/M,EAAI+0B,EAAAhoB,GACLmP,EAAW4Y,EAAkBx6B,IAAI0F,GACnCkc,IACAA,EAAS+C,WAAY,GAEzB6V,EAAkB1hB,IAAIpT,IMlB1Bg1B,IJ+GM9Y,EAAWnJ,KAAczY,IAAI,yBAE/B4hB,EAAS5b,gB5BzINpE,OAAM,uBsDbjB3C,EAAAQ,EAAAk7B,EAAA,mCAAA9mB,KAAA5U,EAAAQ,EAAAk7B,EAAA,2BAAAl6B,KAAAxB,EAAAQ,EAAAk7B,EAAA,4BAAAC,KAAA37B,EAAAQ,EAAAk7B,EAAA,sCAAAJ,KAAAt7B,EAAAQ,EAAAk7B,EAAA,+BAAAN,KAAAp7B,EAAAQ,EAAAk7B,EAAA,8BAAAE,KAAA57B,EAAAQ,EAAAk7B,EAAA,8BAAAzV,KAAAjmB,EAAAQ,EAAAk7B,EAAA,uCAAAxV,KAAAlmB,EAAAQ,EAAAk7B,EAAA,4BAAArV,KAAArmB,EAAAQ,EAAAk7B,EAAA,0BAAAjV","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/drivers/react.js","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://zoid/./src/drivers/vue.js","webpack://zoid/./src/drivers/angular.js","webpack://zoid/./src/drivers/angular2.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","defineLazyProp","configurable","isObjectObject","isPlainObject","replaceObject","replacer","fullKey","itemKey","_loop3","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","navigator","userAgent","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toPx","parseInt","toNum","toCSS","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","open","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","on","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","fireAndForget","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","sendMessage","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","mockUserAgent","getUserAgent","foreignGlobal","receiveMessage","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","bridge","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","awaitWindowHello","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","max","internalSerializeMessage","internalDeserializeMessage","getProxyObject","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","_requestPromises$get2","cleanUpWindow","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","openBridge","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","normalizeMockUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","dimensions","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","react","React","ReactDOM","_React$Component","subClass","superClass","_class","__proto__","componentDidMount","findDOMNode","componentDidUpdate","Component","vue","Vue","inheritAttrs","mounted","$el","$attrs","watch","deep","angular","ng","directive","g","toUpperCase","scope","restrict","controller","$scope","$element","$root","$$phase","$apply","safeApply","instance","$watch","angular2","zoid","AngularComponent","NgModule","ElementRef","NgZone","internalProps","zone","run","ComponentInstance","selector","template","inputs","Class","elementRef","_props","ngOnInit","targetElement","nativeElement","ngDoCheck","obj1","obj2","checked","equals","declarations","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","bridgeUrl","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","popup","debug","info","warn","registerChild","listenDelegate","dep","drivers","isChild","_ref2$data","canRenderTo","getBridgeUrl","payload","getDefaultContainer","getDefaultContext","renderTo","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyBridges","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,IACA,mBAAAG,eAAAC,IACAD,OAAA,UAAAH,GACA,iBAAAC,QACAA,QAAA,KAAAD,IAEAD,EAAA,KAAAC,IARA,CASC,oBAAAK,UAAAC,KAAA,WACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAR,QAGA,IAAAC,EAAAK,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAV,QAAA,IAUA,OANAW,EAAAH,GAAAI,KAAAX,EAAAD,QAAAC,IAAAD,QAAAO,GAGAN,EAAAS,GAAA,EAGAT,EAAAD,QA0DA,OArDAO,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAf,EAAAgB,EAAAC,GACAV,EAAAW,EAAAlB,EAAAgB,IACAG,OAAAC,eAAApB,EAAAgB,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAAvB,GACA,oBAAAwB,eAAAC,aACAN,OAAAC,eAAApB,EAAAwB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAApB,EAAA,cAAiD0B,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAAjC,GACA,IAAAgB,EAAAhB,KAAA4B,WACA,WAA2B,OAAA5B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAM,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,MAAAjB,GAAAkB,eAAAzB,KAAAuB,EAAAC,IAGtD7B,EAAA+B,EAAA,GAIA/B,IAAAgC,EAAA,kDClFe,SAASC,IAetB,OAdAA,EAAWrB,OAAOsB,QAAU,SAAUC,GACpC,IAAK,IAAIjC,EAAI,EAAGA,EAAIkC,UAAUC,OAAQnC,IAAK,CACzC,IAAIoC,EAASF,UAAUlC,GAEvB,IAAK,IAAIuB,KAAOa,GACV1B,IAAiBkB,eAAezB,KAAKiC,EAAQb,KAC/CU,EAAOV,GAAOa,EAAOb,IAK3B,OAAOU,IAGOI,MAAMzC,KAAMsC,WCbvB,SAASI,EAAUC,GACtB,IACI,IAAKA,EACD,OAAO,EAGX,GAAuB,oBAAZC,SAA2BD,aAAgBC,QAClD,OAAO,EAGX,GAAsB,oBAAXC,QAA0BA,OAAOC,QAAUH,aAAgBE,OAAOC,OACzE,OAAO,EAGX,GAAsB,oBAAXD,QAA0BA,OAAOE,aAAeJ,aAAgBE,OAAOE,YAC9E,OAAO,EAGX,IAAIC,EAAY,GAAIA,SAEpB,GAAIA,EAAU,CACV,IAAIrC,EAAOqC,EAASzC,KAAKoC,GAEzB,GAAa,oBAAThC,GAAuC,oBAATA,GAAuC,uBAATA,EAC5D,OAAO,EAIf,GAAyB,mBAAdgC,EAAKM,KACZ,OAAO,EAEb,MAAOC,GACL,OAAO,EAGX,OAAO,+CCjCX,ICCIC,EDDEC,EAAmB,GACnBC,EAAmC,GCDrCC,EAAc,EAGlB,SAASC,IACL,IAAKD,GAAeH,EAAc,CAC9B,IAAMK,EAAUL,EAChBA,EAAe,KACfK,EAAQC,WAIT,SAASC,IACZJ,GAAe,EAGZ,SAASK,IACZL,GAAe,EACfC,ICfG,IAAMK,EAAb,WAeI,SAAAA,EAAYC,GAAuF,IAAAC,EAAA9D,KAQ/F,GAR+FA,KAbnG+D,cAamG,EAAA/D,KAZnGgE,cAYmG,EAAAhE,KAXnGiE,kBAWmG,EAAAjE,KAVnGqB,WAUmG,EAAArB,KATnGkE,WASmG,EAAAlE,KARnGmE,cAQmG,EAAAnE,KAHnGoE,iBAGmG,EAAApE,KAFnGqE,WAEmG,EAE/FrE,KAAK+D,UAAW,EAChB/D,KAAKgE,UAAW,EAChBhE,KAAKiE,cAAe,EAEpBjE,KAAKmE,SAAW,GAEZN,EAAS,CAET,IAAIS,EACAJ,EACAH,GAAW,EACXC,GAAW,EACXO,GAAU,EAEdb,IAEA,IACIG,EAAQ,SAAAW,GACAD,EACAT,EAAKL,QAAQe,IAEbT,GAAW,EACXO,EAASE,IAGd,SAAAtB,GACKqB,EACAT,EAAKW,OAAOvB,IAEZc,GAAW,EACXE,EAAQhB,KAIlB,MAAOA,GAGL,OAFAS,SACA3D,KAAKyE,OAAOvB,GAIhBS,IAEAY,GAAU,EAENR,EAEA/D,KAAKyD,QAAQa,GACNN,GACPhE,KAAKyE,OAAOP,IAjE5B,IAAAQ,EAAAd,EAAAe,UAAA,OAAAD,EA8EIjB,QAAA,SAAQa,GACJ,GAAItE,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,GAAI0C,EAAU4B,GACV,MAAM,IAAIM,MAAM,gDAOpB,OAJA5E,KAAK+D,UAAW,EAChB/D,KAAKqB,MAAQiD,EACbtE,KAAK6E,WAEE7E,MA3Ff0E,EA8FID,OAAA,SAAOP,GAAiC,IAAAY,EAAA9E,KACpC,GAAIA,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,GAAI0C,EAAUwB,GACV,MAAM,IAAIU,MAAM,+CAGpB,IAAKV,EAAO,CACR,IAAIhB,EAAOgB,GAAmC,mBAAnBA,EAAMlB,SAA0BkB,EAAMlB,WAAalC,GAAiBkC,SAASzC,KAAK2D,GAC7GA,EAAQ,IAAIU,MAAJ,gDAA2D1B,GAgBvE,OAbAlD,KAAKgE,UAAW,EAChBhE,KAAKkE,MAAQA,EAERlE,KAAKiE,cACNc,WAAW,WACFD,EAAKb,cFhHnB,SAA2Cf,EAAaM,GAE3D,IAAuC,IAAnCJ,EAAiB4B,QAAQ9B,GAA7B,CAIAE,EAAiB6B,KAAK/B,GAEtB6B,WAAW,WAMP,MAAM7B,GACP,GAEH,IAAK,IAAIgC,EAAI,EAAGA,EAAI7B,EAAiCd,OAAQ2C,IAEzD7B,EAAiC6B,GAAGhC,EAAKM,IE8F7B2B,CAA+BjB,EAAOY,IAE3C,GAGP9E,KAAK6E,WAEE7E,MAzHf0E,EA4HIU,YAAA,SAAYlB,GAGR,OAFAlE,KAAKiE,cAAe,EACpBjE,KAAKyE,OAAOP,GACLlE,MA/Hf0E,EAkIIG,SAAA,WAAW,IAAAQ,EAAArF,KAEY+D,EAAiC/D,KAAjC+D,SAAUC,EAAuBhE,KAAvBgE,SAAUG,EAAanE,KAAbmE,SAEvC,IAFoDnE,KAA9CoE,cAMDL,GAAaC,GAAlB,CAIAhE,KAAKoE,aAAc,EACnBV,IAEA,IAfO,IAAA4B,EAAA,SAeElF,GAfF,IAAAmF,EAiBmCpB,EAAS/D,GAAzCoF,EAjBHD,EAiBGC,UAAWC,EAjBdF,EAiBcE,QAASjC,EAjBvB+B,EAiBuB/B,QAEtBc,OAAM,EAEV,GAAIP,EAEA,IACIO,EAASkB,EAAYA,EAAUH,EAAKhE,OAASgE,EAAKhE,MACpD,MAAO6B,GAEL,OADAM,EAAQiB,OAAOvB,GACf,gBAGD,GAAIc,EAAU,CAEjB,IAAKyB,EAED,OADAjC,EAAQiB,OAAOY,EAAKnB,OACpB,WAGJ,IACII,EAASmB,EAAQJ,EAAKnB,OACxB,MAAOhB,GAEL,OADAM,EAAQiB,OAAOvB,GACf,YAIJoB,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,WAEzDM,EAAOP,SACPP,EAAQC,QAAQa,EAAOjD,OAEvBmC,EAAQiB,OAAOH,EAAOJ,OAG1BI,EAAOL,cAAe,GAEfvB,EAAU4B,GAEbA,aAAkBV,IAAiBU,EAAOP,UAAYO,EAAON,UACzDM,EAAOP,SACPP,EAAQC,QAAQa,EAAOjD,OAEvBmC,EAAQiB,OAAOH,EAAOJ,OAK1BI,EAAOrB,KAAK,SAAAuB,GACRhB,EAAQC,QAAQe,IACjB,SAAAtB,GACCM,EAAQiB,OAAOvB,KAMvBM,EAAQC,QAAQa,IA5DflE,EAAI,EAAGA,EAAI+D,EAAS5B,OAAQnC,IAAKkF,EAAjClF,GAgET+D,EAAS5B,OAAS,EAClBvC,KAAKoE,aAAc,EACnBT,MAnNRe,EAsNIzB,KAAA,SAA2BuC,EAA0DC,GAEjF,GAAID,GAAkC,mBAAdA,IAA6BA,EAAUjF,KAC3D,MAAM,IAAIqE,MAAM,wDAGpB,GAAIa,GAA8B,mBAAZA,IAA2BA,EAAQlF,KACrD,MAAM,IAAIqE,MAAM,sDAGpB,IAAIpB,EAAgC,IAAII,EAYxC,OAVA5D,KAAKmE,SAASc,KAAK,CACfzB,UACAgC,YACAC,YAGJzF,KAAKiE,cAAe,EAEpBjE,KAAK6E,WAEErB,GA5OfkB,EA+OIgB,MAAA,SAA4BD,GACxB,OAAOzF,KAAKiD,UAAK0C,EAAWF,IAhPpCf,EAmPIkB,QAAA,SAAQC,GAEJ,GAAIA,GAAkC,mBAAdA,IAA6BA,EAAUtF,KAC3D,MAAM,IAAIqE,MAAM,uCAGpB,OAAO5E,KAAKiD,KAAK,SAACqB,GACd,OAAOV,EAAakC,IAAID,GACnB5C,KAAK,WACF,OAAOqB,KAEhB,SAACpB,GACA,OAAOU,EAAakC,IAAID,GACnB5C,KAAK,WACF,MAAMC,OAjQ1BwB,EAsQIqB,QAAA,SAAQC,EAAe9C,GAAgC,IAAA+C,EAAAjG,KAEnD,GAAIA,KAAK+D,UAAY/D,KAAKgE,SACtB,OAAOhE,KAGX,IAAI+F,EAAUhB,WAAW,WAEjBkB,EAAKlC,UAAYkC,EAAKjC,UAI1BiC,EAAKxB,OAAOvB,GAAO,IAAI0B,MAAJ,2BAAsCoB,EAAtC,QAEpBA,GAEH,OAAOhG,KAAKiD,KAAK,SAAAqB,GAEb,OADA4B,aAAaH,GACNzB,KAxRnBI,EA6RIyB,UAAA,WAEI,GAAuB,oBAAZvD,QACP,MAAM,IAAIwD,UAAJ,0BAGV,OAAOxD,QAAQa,QAAQzD,OAnS/B4D,EAsSWH,QAAP,SAA0BpC,GAEtB,OAAIA,aAAiBuC,EACVvC,EAGPqB,EAAUrB,GAEH,IAAIuC,EAAa,SAACH,EAASgB,GAAV,OAAqBpD,EAAM4B,KAAKQ,EAASgB,MAG9D,IAAIb,GAAeH,QAAQpC,IAjT1CuC,EAoTWa,OAAP,SAAcP,GACV,OAAO,IAAIN,GAAea,OAAOP,IArTzCN,EAwTWwB,YAAP,SAAmBlB,GACf,OAAO,IAAIN,GAAewB,YAAYlB,IAzT9CN,EA4TWyC,IAAP,SAA+LC,GAE3L,IAAI9C,EAAU,IAAII,EACd2C,EAAQD,EAAS/D,OACjBiE,EAAU,GAEd,IAAKD,EAED,OADA/C,EAAQC,QAAQ+C,GACThD,EAGX,IAXqQ,IAAAiD,EAAA,SAW5PrG,GACL,IAAIsG,EAAOJ,EAASlG,GAEpB,GAAIsG,aAAgB9C,GAChB,GAAI8C,EAAK3C,SAGL,OAFAyC,EAAQpG,GAAKsG,EAAKrF,MAClBkF,GAAS,EACT,gBAED,IAAK7D,EAAUgE,GAGlB,OAFAF,EAAQpG,GAAKsG,EACbH,GAAS,EACT,WAGJ3C,EAAaH,QAAQiD,GAAMzD,KAAK,SAAAqB,GAC5BkC,EAAQpG,GAAKkE,EAEC,IADdiC,GAAS,IAEL/C,EAAQC,QAAQ+C,IAErB,SAAAtD,GACCM,EAAQiB,OAAOvB,MAtBd9C,EAAI,EAAGA,EAAIkG,EAAS/D,OAAQnC,IAAKqG,EAAjCrG,GA8BT,OAJc,IAAVmG,GACA/C,EAAQC,QAAQ+C,GAGbhD,GArWfI,EAwWW+C,KAAP,SAAkCL,GAC9B,IAAIhC,EAAS,GAEb,OAAOV,EAAayC,IAAIvF,OAAO8F,KAAKN,GAAUO,IAAI,SAAAlF,GAC9C,OAAOiC,EAAaH,QAAQ6C,EAAS3E,IAAMsB,KAAK,SAAA5B,GAC5CiD,EAAO3C,GAAON,OAElB4B,KAAK,WACL,OAAOqB,KAhXnBV,EAoXWiD,IAAP,SAAiBC,EAAkBC,GAE/B,OAAOnD,EAAayC,IAAIS,EAAMD,IAAIE,KAtX1CnD,EAyXWoD,6BAAP,SAAoCnD,GAChC,OFlWD,SAAsCA,GAGzC,OAFAR,EAAiC4B,KAAKpB,GAE/B,CACHoD,OADG,WAEC5D,EAAiC6D,OAAO7D,EAAiC2B,QAAQnB,GAAU,KE6VxFmD,CAA6BnD,IA1X5CD,EA6XWkC,IAAP,SAA8DiB,EAAiDI,EAAcC,GAEzH,GAAIL,GAA4B,mBAAXA,IAA0BA,EAAOxG,KAClD,MAAM,IAAIqE,MAAM,mCAGpB,IAAIN,EAEJZ,IAEA,IAEIY,EAASyC,EAAOtE,MAAM0E,EAASC,GAAQ,IACzC,MAAOlE,GAEL,OADAS,IACOC,EAAaa,OAAOvB,GAK/B,OAFAS,IAEOC,EAAaH,QAAQa,IAjZpCV,EAoZWyD,MAAP,SAAaA,GACT,OAAO,IAAIzD,EAAa,SAAAH,GACpBsB,WAAWtB,EAAS4D,MAtZhCzD,EA0ZWlB,UAAP,SAAiBrB,GAEb,SAAIA,GAASA,aAAiBuC,IAIvBlB,EAAUrB,IAhazBuC,EAmaW0D,MAAP,WACI,ODjZA9D,EAAUL,EAAeA,GAAgB,ICiZtBS,EDhZvBL,IACOC,EAHJ,IACCA,GCnBRI,EAAA,GCJO,SAAS2D,EAAQ5E,GACpB,MAAgD,oBAAzC7B,GAAiBkC,SAASzC,KAAKoC,GCDnC,IAAM6E,EAAW,CACpBC,KAAQ,QACRC,KAAQ,QACRC,MAAQ,UAGCC,EAAW,IAEXC,EAAc,CACvBC,OAAS,SACTC,MAAS,SCLTC,EAAsB,mCAMnB,SAASC,EAAgBC,GAC5B,YAD2E,IAA/CA,MAA6BrF,QAClDqF,EAAIC,SAASC,WAAaZ,EAASG,MAGvC,SAASU,EAAUH,GAEtB,GAAKA,EAIL,IACI,GAAIA,EAAII,QAAUJ,EAAII,SAAWJ,EAC7B,OAAOA,EAAII,OAEjB,MAAOpF,KAKN,SAASqF,EAAUL,GAEtB,GAAKA,IAKDG,EAAUH,GAId,IACI,OAAOA,EAAIM,OACb,MAAOtF,KAKN,SAASuF,EAAkBP,GAC9B,IAGI,OAAO,EACT,MAAOhF,IAIT,OAAO,EAGJ,SAASwF,EAAgBR,GAI5B,IAAIC,GAFJD,EAAMA,GAAOrF,QAEMsF,SAEnB,IAAKA,EACD,MAAM,IAAIvD,MAAJ,gCAGV,IAAIwD,EAAWD,EAASC,SAExB,IAAKA,EACD,MAAM,IAAIxD,MAAJ,gCAGV,GAAIwD,IAAaZ,EAASE,KACtB,OAAWF,EAASE,KAApB,KAGJ,GAAIU,IAAaZ,EAASG,MAAO,CAE7B,IAAIW,EAASD,EAAUH,GACvB,OAAII,GAAUG,IAEHC,EAAgBJ,GAGhBd,EAASG,MAApB,KAGJ,IAAIgB,EAAOR,EAASQ,KAEpB,IAAKA,EACD,MAAM,IAAI/D,MAAJ,4BAGV,OAAWwD,EAAX,KAA0BO,EAGvB,SAASC,EAAUV,GAItB,IAAIW,EAASH,EAFbR,EAAMA,GAAOrF,QAIb,OAAIgG,GAAUX,EAAIY,YAAwD,IAA1CZ,EAAIY,WAAW9D,QAAQwC,EAASC,MACrDS,EAAIY,WAGRD,EAgEJ,SAASE,EAAab,GAEzB,IA9CG,SAA8BA,GAEjC,IACI,GAAIA,IAAQrF,OACR,OAAO,EAGb,MAAOK,IAIT,IACI,IAAI8F,EAAOlI,OAAOmI,yBAAyBf,EAAK,YAEhD,GAAIc,IAA4B,IAApBA,EAAKhI,WACb,OAAO,EAGb,MAAOkC,IAIT,IAEI,GAAI+E,EAAgBC,IAAQO,IACxB,OAAO,EAEb,MAAOvF,IAIT,IAEI,GAAIwF,EAAgBR,KAASQ,EAAgB7F,QACzC,OAAO,EAGb,MAAOK,IAIT,OAAO,EAKFgG,CAAqBhB,GACtB,OAAO,EAGX,IAEI,GAAIA,IAAQrF,OACR,OAAO,EAIX,GAAIoF,EAAgBC,IAAQO,IACxB,OAAO,EAIX,GAAIG,EAAU/F,UAAY+F,EAAUV,GAChC,OAAO,EAGb,MAAOhF,IAIT,OAAO,EAIJ,SAASiG,EAAiBjB,GAC7B,IAAKa,EAAab,GACd,MAAM,IAAItD,MAAJ,qCAIV,OAAOsD,EAqBJ,SAASkB,EAAiBd,EAAgCe,GAE7D,IAAKf,IAAWe,EACZ,OAAO,EAGX,IAAIC,EAAcjB,EAAUgB,GAE5B,OAAIC,EACOA,IAAgBhB,GAGgB,IA9BxC,SAAoBJ,GAEvB,IAAI5D,EAAS,GAEb,IAEI,KAAO4D,EAAII,SAAWJ,GAClB5D,EAAOW,KAAKiD,EAAII,QAChBJ,EAAMA,EAAII,OAGhB,MAAOpF,IAIT,OAAOoB,EAeHiF,CAAWF,GAAOrE,QAAQsD,GAO3B,SAASkB,EAAUtB,GAEtB,IAEIuB,EAQAC,EAVApF,EAAS,GAIb,IACImF,EAASvB,EAAIuB,OACf,MAAOvG,GACLuG,EAASvB,EAKb,IACIwB,EAAMD,EAAOlH,OACf,MAAOW,IAIT,GAAY,IAARwG,EACA,OAAOpF,EAGX,GAAIoF,EAAK,CACL,IAAK,IAAItJ,EAAI,EAAGA,EAAIsJ,EAAKtJ,IAAK,CAE1B,IAAIuJ,OAAK,EAET,IACIA,EAAQF,EAAOrJ,GACjB,MAAO8C,GACL,SAGJoB,EAAOW,KAAK0E,GAGhB,OAAOrF,EAGX,IAAK,IAAIlE,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC1B,IAAIuJ,OAAK,EAET,IACIA,EAAQF,EAAOrJ,GACjB,MAAO8C,GACL,OAAOoB,EAGX,IAAKqF,EACD,OAAOrF,EAGXA,EAAOW,KAAK0E,GAGhB,OAAOrF,EAIJ,SAASsF,EAAkB1B,GAA4D,IAE1F,IAAI5D,EAAS,GAF6EuF,EAAA,EAAAC,EAIxEN,EAAUtB,GAJ8D2B,EAAAC,EAAAvH,OAAAsH,IAIxD,CAA7B,IAAIF,EAAKG,EAAAD,GACVvF,EAAOW,KAAK0E,GADkB,QAAAI,EAAA,EAAAC,EAGPJ,EAAkBD,GAHXI,EAAAC,EAAAzH,OAAAwH,IAI1BzF,EAAOW,KADQ+E,EAAAD,IAKvB,OAAOzF,EAGJ,SAAS2F,EAAO/B,GAEnB,GAAKA,EAAL,CAIA,IACI,GAAIA,EAAIgC,IACJ,OAAOhC,EAAIgC,IAEjB,MAAOhH,IAIT,GAAImF,EAAUH,KAASA,EACnB,OAAOA,EAGX,IACI,GAAIkB,EAAiBvG,OAAQqF,IAAQrF,OAAOqH,IACxC,OAAOrH,OAAOqH,IAEpB,MAAOhH,IAIT,IACI,GAAIkG,EAAiBlB,EAAKrF,SAAWA,OAAOqH,IACxC,OAAOrH,OAAOqH,IAEpB,MAAOhH,IA9BgE,QAAAiH,EAAA,EAAAC,EAkCvDR,EAAkB1B,GAlCqCiC,EAAAC,EAAA7H,OAAA4H,IAkC/B,CAArC,IAAIR,EAAKS,EAAAD,GACV,IACI,GAAIR,EAAMO,IACN,OAAOP,EAAMO,IAEnB,MAAOhH,IAIT,GAAImF,EAAUsB,KAAWA,EACrB,OAAOA,IAmBZ,SAASU,EAAqBnC,GACjC,IAAIgC,EAAMD,EAAO/B,GAEjB,IAAKgC,EACD,MAAM,IAAItF,MAAJ,gCAGV,SAAA0F,OAAYV,EAAkBM,GAA9B,CAAoCA,IAoDxC,IAAIK,EAAgB,GAChBC,EAAe,GAEZ,SAASC,EAAevC,EAA6BwC,QAAsC,IAAtCA,OAAsB,GAE9E,IACI,GAAIxC,IAAQrF,OACR,OAAO,EAEb,MAAOK,GACL,OAAO,EAGX,IACI,IAAKgF,EACD,OAAO,EAGb,MAAOhF,GACL,OAAO,EAGX,IACI,GAAIgF,EAAIyC,OACJ,OAAO,EAGb,MAAOzH,GAIL,OAAIA,GAAOA,EAAI0H,UAAY5C,EAQ/B,GAAI0C,GAAa3B,EAAab,GAC1B,IAEI,GAAIA,EAAI2C,WACJ,OAAO,EAEb,MAAO3H,IAOb,IACI,IAAKgF,EAAII,SAAWJ,EAAIgC,IACpB,OAAO,EAEb,MAAOhH,IAeT,IAAI4H,EAtFR,SAAwBC,EAAuBpI,GAC3C,IAAK,IAAIvC,EAAI,EAAGA,EAAI2K,EAAWxI,OAAQnC,IAEnC,IACI,GAAI2K,EAAW3K,KAAOuC,EAClB,OAAOvC,EAEb,MAAO8C,IAKb,OAAQ,EA0EU8H,CAAYT,EAAerC,GAE7C,IAAqB,IAAjB4C,EAAoB,CACpB,IAAInB,EAAQa,EAAaM,GAEzB,GAAInB,GA9GL,SAA6BA,GAEhC,IAAKA,EAAMsB,cACP,OAAO,EAGX,IAAKtB,EAAMuB,WACP,OAAO,EAGX,IAAIC,EAAMxB,EAAMyB,cAEhB,SAAID,IAAOA,EAAIE,iBAAoBF,EAAIE,gBAAgBC,SAAS3B,IAkG/C4B,CAAoB5B,GAC7B,OAAO,EAIf,OAAO,EAgIJ,SAAS6B,EAAYtD,GAKxB,OAFaK,EAFbL,EAAMA,GAAOrF,SAQAwF,EAAUH,SAEvB,EA+DJ,SAASuD,EAASC,EAAaC,GAAuB,QAAAC,EAAA,EAAAA,EAEhCF,EAFgCnJ,OAAAqJ,IAEnB,IAA1B,IAAIC,EAASH,EAAJE,GAAiBE,EAAA,EAAAA,EACTH,EADSpJ,OAAAuJ,IAEvB,GAAID,IADUF,EAAJG,GAEN,OAAO,EAKnB,OAAO,EAGJ,SAASC,EAAmB7D,QAA+C,IAA/CA,MAA8BrF,QAI7D,IAHA,IAAImJ,EAAW,EACX1D,EAASJ,EAENI,IACHA,EAASD,EAAUC,MAEf0D,GAAY,GAIpB,OAAOA,EAqBJ,SAASC,EAAgBC,EAA8BC,GAE1D,IAAIC,EAAOnC,EAAOiC,IAASA,EACvBG,EAAOpC,EAAOkC,IAASA,EAE3B,IACI,GAAIC,GAAQC,EACR,OAAID,IAASC,EAMnB,MAAOnJ,IAIT,IAAIoJ,EAAajC,EAAqB6B,GAClCK,EAAalC,EAAqB8B,GAEtC,GAAIV,EAASa,EAAYC,GACrB,OAAO,EAGX,IAAIC,EAAUjE,EAAU6D,GACpBK,EAAUlE,EAAU8D,GAExB,QAAIG,GAAWf,EAASpB,EAAqBmC,GAAUD,KAInDE,GAAWhB,EAASpB,EAAqBoC,GAAUH,GAC5C,IAMR,SAASI,EAAYC,EAAyBC,GAEjD,GAAuB,iBAAZD,EAAsB,CAE7B,GAAsB,iBAAXC,EACP,OAAOD,IAAY/E,GAAYgF,IAAWD,EAG9C,GAAIpF,EAAQqF,GACR,OAAO,EAGX,GAAIC,MAAMC,QAAQF,GACd,OAAO,EAIf,OAAIrF,EAAQoF,GAEJpF,EAAQqF,GACDD,EAAQ3J,aAAe4J,EAAO5J,YAGrC6J,MAAMC,QAAQF,IAKXG,QAAQH,EAAOI,MAAML,MAG5BE,MAAMC,QAAQH,KAEVE,MAAMC,QAAQF,GACPK,KAAKC,UAAUP,KAAaM,KAAKC,UAAUN,IAGlDrF,EAAQqF,IAILD,EAAQQ,KAAK,SAAAC,GAAU,OAAIV,EAAYU,EAAYR,MAgB3D,SAASS,EAAiBC,GAI7B,OAAIA,EAAIN,MAAM,4BACDM,EAKGC,MAAM,KAAKC,MAAM,EAAG,GAAGC,KAAK,KAHjC7E,IAQR,SAAS8E,EAAcxF,EAA6ByF,EAAqBtG,EAAuBuG,GAEnG,IAAI7H,EAuBJ,YAzB0J,IAA9EsB,MAAiB,UAA6D,IAAvDuG,MAAmBC,KAI1G,SAARC,IAEA,GAAIrD,EAAevC,GAMf,OAJInC,GACAG,aAAaH,GAGV4H,IAGPC,GAAW,EACX1H,aAAaH,IAEb6H,GAAWvG,EACXtB,EAAUhB,WAAW+I,EAAOzG,IAIpCyG,GAEO,CACH7G,OADG,WAEKlB,GACAG,aAAaH,KAOtB,SAASgI,EAASC,GAErB,IACI,GAAIA,IAAQnL,OACR,OAAO,EAEb,MAAOK,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAA4C,oBAAxClH,GAAiBkC,SAASzC,KAAKyN,GAC/B,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAInF,OAAOC,QAAUkL,aAAenL,OAAOC,OACvC,OAAO,EAEb,MAAOI,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAIjO,OAASiO,EACpB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAI1F,SAAW0F,EACtB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAIf,IACI,GAAIgG,GAAOA,EAAI9D,MAAQ8D,EACnB,OAAO,EAEb,MAAO9K,GACL,GAAIA,GAAOA,EAAI0H,UAAY5C,EACvB,OAAO,EAkBf,OAAO,ECr+BJ,SAASgD,EAAeD,EAAuBpI,GAClD,IAAK,IAAIvC,EAAI,EAAGA,EAAI2K,EAAWxI,OAAQnC,IAEnC,IACI,GAAI2K,EAAW3K,KAAOuC,EAClB,OAAOvC,EAEb,MAAO8C,IAKb,OAAQ,ECPZ,ICmDI+K,ECodAC,EFvgBAnN,EAAiBD,OAAOC,eACxBoN,EAAUC,KAAKC,MAAQ,IAEdC,EAAb,WAOI,SAAAA,IAMI,GANUtO,KALdW,UAKc,EAAAX,KAJduO,aAIc,EAAAvO,KAHd4G,UAGc,EAAA5G,KAFdwO,YAEc,EACVL,GAAW,EAGXnO,KAAKW,KAAL,cAA0C,IAAhB8N,KAAKC,WAAmB,GAAlD,KAA0DP,EGnB3D,WAEH,GAAuB,oBAAZQ,QACP,OAAO,EAGX,QAA6B,IAAlB7N,OAAO8N,OACd,OAAO,EAGX,IAEI,IAAIC,EAAc,IAAIF,QAClBG,EAAU,GAOd,OAJAhO,OAAO8N,OAAOE,GAEdD,EAAYE,IAAID,EAJA,mCAMZD,EAAY5N,IAAI6N,GAMtB,MAAO5L,GAEL,OAAO,GHPH8L,GACA,IACIhP,KAAKuO,QAAU,IAAII,QACrB,MAAOzL,IAKblD,KAAK4G,KAAQ,GACb5G,KAAKwO,OAAS,GAtBtB,IAAA9J,EAAA4J,EAAA3J,UAAA,OAAAD,EAyBIuK,sBAAA,WAKI,IAHA,IAAIV,EAAUvO,KAAKuO,QACf3H,EAAO5G,KAAK4G,KAEPxG,EAAI,EAAGA,EAAIwG,EAAKrE,OAAQnC,IAAK,CAClC,IAAIiB,EAAQuF,EAAKxG,GAEjB,GAAI2N,EAAS1M,IAAUoJ,EAAepJ,GAAQ,CAE1C,GAAIkN,EACA,IACIA,EAAQW,OAAO7N,GACjB,MAAO6B,IAKb0D,EAAKM,OAAO9G,EAAG,GACfJ,KAAKwO,OAAOtH,OAAO9G,EAAG,GAEtBA,GAAK,KA9CrBsE,EAmDIyK,kBAAA,SAAkBxN,GAEd,OAAIoM,EAASpM,IArDrB+C,EAmEIqK,IAAA,SAAIpN,EAASN,GAET,IAAKM,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACIA,EAAQQ,IAAIpN,EAAKN,GACnB,MAAO6B,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAerB,CAEH,IAAIhB,EAAOX,KAAKW,KACZyO,EAAQzN,EAAIhB,GAEZyO,GAASA,EAAM,KAAOzN,EACtByN,EAAM,GAAK/N,EAEXN,EAAeY,EAAKhB,EAAM,CACtBU,MAAU,CAAEM,EAAKN,GACjBgO,UAAU,QAzBY,CAE9BrP,KAAKiP,wBAEL,IAAIrI,EAAO5G,KAAK4G,KACZ4H,EAASxO,KAAKwO,OACdc,EAAQtE,EAAYpE,EAAMjF,IAEf,IAAX2N,GACA1I,EAAK3B,KAAKtD,GACV6M,EAAOvJ,KAAK5D,IAEZmN,EAAOc,GAASjO,IA/FhCqD,EAkHIzD,IAAA,SAAIU,GAEA,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAI5N,GACZ,OAAO4M,EAAQtN,IAAIU,GAEzB,MAAOuB,UACElD,KAAKuO,QAIpB,IAAKvO,KAAKmP,kBAAkBxN,GAAM,CAE9B3B,KAAKiP,wBAEL,IACIK,EAAQtE,EADDhL,KAAK4G,KACcjF,GAE9B,IAAe,IAAX2N,EACA,OAGJ,OAAOtP,KAAKwO,OAAOc,GAInB,IAAIF,EAAQzN,EAAI3B,KAAKW,MAErB,GAAIyO,GAASA,EAAM,KAAOzN,EACtB,OAAOyN,EAAM,IAtJ7B1K,EA2JIwK,OAAA,SAAOvN,GAEH,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACIA,EAAQW,OAAOvN,GACjB,MAAOuB,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAYrB,CAEH,IAAIyN,EAAQzN,EAAI3B,KAAKW,MAEjByO,GAASA,EAAM,KAAOzN,IACtByN,EAAM,GAAKA,EAAM,QAAKzJ,OAjBI,CAE9B3F,KAAKiP,wBAEL,IAAIrI,EAAO5G,KAAK4G,KACZ0I,EAAQtE,EAAYpE,EAAMjF,IAEf,IAAX2N,IACA1I,EAAKM,OAAOoI,EAAO,GACnBtP,KAAKwO,OAAOtH,OAAOoI,EAAO,MApL1C5K,EAiMI6K,IAAA,SAAI5N,GAEA,IAAKA,EACD,MAAM,IAAIiD,MAAJ,wBAGV,IAAI2J,EAAUvO,KAAKuO,QAEnB,GAAIA,EACA,IACI,GAAIA,EAAQgB,IAAI5N,GACZ,OAAO,EAEb,MAAOuB,UACElD,KAAKuO,QAIpB,GAAKvO,KAAKmP,kBAAkBxN,GAOrB,CAEH,IAAIyN,EAAQzN,EAAI3B,KAAKW,MAErB,SAAIyO,GAASA,EAAM,KAAOzN,GAN1B,OAHA3B,KAAKiP,yBAGa,IADNjE,EAAYhL,KAAK4G,KAAMjF,IAvN/C+C,EAsOI8K,SAAA,SAAS7N,EAASf,GACd,GAAIZ,KAAKuP,IAAI5N,GAET,OAAO3B,KAAKiB,IAAIU,GAGpB,IAAIN,EAAQT,IAEZ,OADAZ,KAAK+O,IAAIpN,EAAKN,GACPA,GA9OfiN,EAAA,GCFO,SAASmB,EAAaC,GACzB,GAAoB,mBAATC,KACP,OAAOA,KAAKD,GACT,GAAsB,oBAAXE,OACd,OAAOA,OAAOC,KAAKH,EAAK,QAAQ1M,SAAS,UAG7C,MAAM,IAAI4B,MAAJ,sCAeH,SAASkL,IAEZ,IAAIC,EAAQ,mBAUZ,MARe,aAAaC,QAAQ,KAAM,WACtC,OAAOD,EAAME,OAAOxB,KAAKyB,MAAMzB,KAAKC,SAAWqB,EAAMxN,WAOzD,IAJakN,GACT,IAAIrB,MAAO+B,cAAc3C,MAAM,GAAI,IAAIwC,QAAQ,IAAK,MACtDA,QAAQ,gBAAiB,IAAII,cAsCnC,SAASC,EAAcjJ,GACnB,IACI,OAAO6F,KAAKC,UAAUL,GAAgBW,MAAMjN,KAAK6G,GAAO,SAACkJ,EAAQC,GAC7D,MAAmB,mBAARA,EACP,WAtBT,SAAqBvC,GAIxB,GAFAC,EAAYA,GAAa,IAAIU,EAEzBX,SAAqD,iBAARA,GAAmC,mBAARA,EACxE,MAAM,IAAIpJ,MAAJ,kBAGV,IAAI4L,EAAMvC,EAAUhN,IAAI+M,GAOxB,OALKwC,IACDA,SAAiBxC,EAAd,IAAuB8B,IAC1B7B,EAAUc,IAAIf,EAAKwC,IAGhBA,EAOwBC,CAAYF,GAA/B,IAEGA,IAEb,MAAOrN,GACL,MAAM,IAAI0B,MAAJ,6DA2CP,SAAS8L,EAAkB3J,GAC9B,IAAI4J,EAAQ,GAGZ,SAASC,IAAgE,QAAAC,EAAAvO,UAAAC,OAArC6E,EAAqC,IAAAyF,MAAAgE,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAArC1J,EAAqC0J,GAAAxO,UAAAwO,GACrE,IAAInP,EAAe0O,EAAcjJ,GAEjC,OAAIuJ,EAAM3O,eAAeL,GACdgP,EAAMhP,IAGjBgP,EAAMhP,GAAOoF,EAAOtE,MAAMzC,KAAMsC,WAC3BsD,QAAQ,kBACE+K,EAAMhP,KAGdgP,EAAMhP,IAOjB,OAJAiP,EAAwBG,MAAQ,WAC5BJ,EAAQ,IAGLC,EAiBJ,SAASI,EAAiBjK,EAAsCkK,EAAqC7J,QAA4B,IAA5BA,MAAoB,IAC5H,IAAIuJ,EAAQ5J,EAAOmK,yBAA2BnK,EAAOmK,0BAA4B,GAC7EvP,EAAM0O,EAAcjJ,GAExB,OAAIuJ,EAAM3O,eAAeL,GACdgP,EAAMhP,GAGJgP,EAAMhP,GAAOsP,EAAKxO,WAAL,EAAS2E,GAKhC,SAAS+J,MAIT,SAASC,GAAKrK,GACjB,IAAIsK,GAAS,EAEb,OAAO,WACH,IAAKA,EAED,OADAA,GAAS,EACFtK,EAAOtE,MAAMzC,KAAMsC,YAkE/B,SAASgP,GAAepO,EAAaqO,GAExC,QAFqE,IAA7BA,MAAiB,GAErDA,GAAS,EACT,MAAO,gCAGX,IACI,IAAKrO,EACD,yBAA2BpC,GAAiBkC,SAASzC,KAAK2C,GAA1D,IAGJ,GAAmB,iBAARA,EACP,OAAOA,EAGX,GAAIA,aAAe0B,MAAO,CACtB,IAAIP,EAAQnB,GAAOA,EAAImB,MACnBuG,EAAU1H,GAAOA,EAAI0H,QAEzB,GAAIvG,GAASuG,EACT,OAAgC,IAA5BvG,EAAMW,QAAQ4F,GACPvG,EAEIuG,EAAX,KAAyBvG,EAE1B,GAAIA,EACP,OAAOA,EACJ,GAAIuG,EACP,OAAOA,EAIf,MAA4B,mBAAjB1H,EAAIF,SACJE,EAAIF,WAGRlC,GAAiBkC,SAASzC,KAAK2C,GAExC,MAAOsO,GACL,yCAA2CF,GAAeE,EAAQD,EAAQ,IAuB3E,SAASrE,GAAUvK,GACtB,MAAoB,iBAATA,EACAA,EAGPA,GAAiC,mBAAlBA,EAAKK,SACbL,EAAKK,WAGTlC,GAAiBkC,SAASzC,KAAKoC,GAsBnC,SAAS8O,GAA8BzD,EAASxL,GACnD,IAAKA,EACD,OAAOwL,EAGX,GAAIlN,OAAOsB,OACP,OAAOtB,OAAOsB,OAAO4L,EAAKxL,GAG9B,IAAK,IAAIb,KAAOa,EACRA,EAAOR,eAAeL,KACtBqM,EAAIrM,GAAOa,EAAOb,IAI1B,OAAOqM,EA8FJ,SAAS0D,GAAa3K,EAAmBf,GAE5C,IAAID,EAWJ,OATA,SAAS4L,IACL5L,EAAUhB,WAAW,WACjBgC,IACA4K,KACD3L,GAGP2L,GAEO,CACH1K,OADG,WAECf,aAAaH,KA8MlB,SAAS6L,GAAkB5D,EAA6BrM,EAAuBf,GAClF,GAAIiM,MAAMC,QAAQkB,IACd,GAAmB,iBAARrM,EACP,MAAM,IAAIyE,UAAJ,iCAEP,GAAmB,iBAAR4H,GAA4B,OAARA,GACf,iBAARrM,EACP,MAAM,IAAIyE,UAAJ,6BAIdtF,OAAOC,eAAeiN,EAAKrM,EAAK,CAC5BkQ,cAAc,EACd7Q,YAAc,EACdC,IAAc,kBAEH+M,EAAIrM,GACX,IAAIN,EAAQT,IAGZ,OADAoN,EAAIrM,GAAON,EACJA,GAEX0N,IAAK,SAAC1N,UAEK2M,EAAIrM,GAEXqM,EAAIrM,GAAON,KAShB,SAASyQ,GAAe9D,GAC3B,MAJwB,iBADHrL,EAKLqL,IAJ6B,OAATrL,GAI4B,oBAAxC7B,GAAiBkC,SAASzC,KAAKyN,GALpD,IAAkBrL,EAQlB,SAASoP,GAAc/D,GAC1B,IAAK8D,GAAe9D,GAChB,OAAO,EAIX,IAAIjL,EAAciL,EAAIjL,YAEtB,GAA2B,mBAAhBA,EACP,OAAO,EAGX,IAAI4B,EAAY5B,EAAY4B,UAE5B,QAAKmN,GAAenN,MAIfA,EAAU3C,eAAe,iBAO3B,SAASgQ,GAA0CrP,EAAUsP,EAAsDC,GAEtH,QAFiJ,IAA3BA,MAAmB,IAErIrF,MAAMC,QAAQnK,GAAO,CAIrB,IAHA,IAAIJ,EAASI,EAAKJ,OACd+B,EAAS,GAFQmC,EAAA,SAIZrG,GAGLwR,GAAetN,EAAQlE,EAAG,WACtB,IAAI+R,EAAUD,EAAcA,EAAP,IAAoB9R,EAApB,GAA+BA,EAGhDiJ,EAAQ4I,EAFHtP,EAAKvC,GAEWA,EAAG+R,GAO5B,OALIJ,GAAc1I,IAAUwD,MAAMC,QAAQzD,MAEtCA,EAAQ2I,GAAc3I,EAAO4I,EAAUE,IAGpC9I,KAdNjJ,EAAI,EAAGA,EAAImC,EAAQnC,IAAKqG,EAAxBrG,GAmBT,OAAOkE,EACJ,GAAIyN,GAAcpP,GAAO,CAC5B,IAAI2B,EAAS,GADe8N,EAAA,SAGnBzQ,GACL,IAAKgB,EAAKX,eAAeL,GACrB,iBAGJiQ,GAAetN,EAAQ3C,EAAK,WACxB,IAAIwQ,EAAUD,EAAcA,EAAP,IAAoBvQ,EAApB,GAAiCA,EAIlD0H,EAAQ4I,EAFHtP,EAAKhB,GAEWA,EAAKwQ,GAO9B,OALIJ,GAAc1I,IAAUwD,MAAMC,QAAQzD,MAEtCA,EAAQ2I,GAAc3I,EAAO4I,EAAUE,IAGpC9I,KAjBf,IAAK,IAAI1H,KAAOgB,EAAMyP,EAAbzQ,GAsBT,OAAO2C,EAEP,MAAM,IAAIM,MAAJ,2BAgFP,SAASyN,GAAUhR,GACtB,OAAOA,QAoBJ,SAASkG,GAAQ5E,GACpB,MAAgD,oBAAzC7B,GAAiBkC,SAASzC,KAAKoC,GAiCnC,SAAS6M,GAAgCxB,EAASrM,EAAcf,GACnE,GAAIoN,EAAIhM,eAAeL,GACnB,OAAOqM,EAAIrM,GAGf,IAAM4O,EAAM3P,IAEZ,OADAoN,EAAIrM,GAAO4O,EACJA,EASJ,SAAS+B,GAAQtE,GAEpB,IAAMuE,EAAQ,GACVC,GAAU,EAEd,MAAO,CACHzD,IADG,SACYpO,EAAegC,GAO1B,OANK6P,IACDxE,EAAIrN,GAAQgC,EACZ3C,KAAKyS,SAAS,kBACHzE,EAAIrN,MAGZgC,GAGX8P,SAXG,SAWM1L,GACDyL,EACAzL,IAEAwL,EAAMtN,KAAKmM,GAAKrK,KAIxBV,IAnBG,WAoBC,IAAMG,EAAU,GAGhB,IAFAgM,GAAU,EAEHD,EAAMhQ,QAAQ,CACjB,IAAMmQ,EAAOH,EAAMI,MACnBnM,EAAQvB,KAAKyN,KAGjB,OAAO9O,EAAayC,IAAIG,GAASvD,KAAKkO,MA0B3C,SAASyB,GAAgBjS,EAAekS,GAC3C,GAAIA,QACA,MAAM,IAAIjO,MAAJ,YAAuBjE,EAAvB,kBAGV,OAAOkS,ECt+BJ,SAASC,KACZ,OAAO/F,QAAQgG,SAASC,OAAiC,aAAxBD,SAASE,WAGvC,SAASC,GAAUxD,GACtB,OAAOA,EAAIM,QAAQ,MAAO,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,MAAO,OAevF,SAASmD,KACZ,OAAOnC,EAAcmC,GAAsB,WACvC,OAAO,IAAIvP,EAAa,SAAAH,GAEpB,GAAIqP,KACA,OAAOrP,IAGX,IAAI2P,EAAWC,YAAY,WACvB,GAAIP,KAEA,OADAQ,cAAcF,GACP3P,KAEZ,QAeR,SAAS8P,GAAWC,GACvB,OAAOxC,EAAcuC,GAAY,WAC7B,IAAIE,EAAS,GAEb,IAAKD,EACD,OAAOC,EAGX,IAAkC,IAA9BD,EAAYxO,QAAQ,KACpB,OAAOyO,EARiC,QAAAC,EAAA,EAAAC,EAW3BH,EAAYjG,MAAM,KAXSmG,EAAAC,EAAApR,OAAAmR,IAWH,CAApC,IAAIE,EAAID,EAAAD,IACTE,EAAOA,EAAKrG,MAAM,MAET,IAAMqG,EAAK,KAChBH,EAAOI,mBAAmBD,EAAK,KAAOC,mBAAmBD,EAAK,KAItE,OAAOH,GACR,CAAED,IAkCF,SAASM,GAAYC,EAAwBC,GAEhD,YAF+F,IAA/CA,MAAkC,IAE7EA,GAAUlT,OAAO8F,KAAKoN,GAAOzR,aAXmC,KAA7CyL,EAeL7L,EAAA,GACZoR,GAAWQ,GACXC,MAjBiBhG,EAAgC,IAEjDlN,OAAO8F,KAAKoH,GAAKiG,OAAO,SAAAtS,GAC3B,MAA2B,iBAAbqM,EAAIrM,KACnBkF,IAAI,SAAAlF,GACH,OAAWuR,GAAUvR,GAArB,IAA+BuR,GAAUlF,EAAIrM,MAC9C8L,KAAK,MAMGsG,EAZR,IAAqB/F,EA6MrB,SAASkG,GAAYC,EAAyB9K,GACjD8K,EAAUD,YAAY7K,GAGnB,SAAS+K,GAAUC,GAEtB,OAAIA,aAAmBxR,OAAOyR,SAId,OAAZD,GAAuC,iBAAZA,GAA6C,IAArBA,EAAQE,UAA2C,iBAAlBF,EAAQG,OAAuD,iBAA1BH,EAAQjJ,cAOlI,SAASqJ,GAAeC,EAAqBvJ,GAEhD,YAFwG,IAAxDA,MAA+B4H,UAE3EqB,GAAUM,GAEHA,EAGO,iBAAPA,EACAvJ,EAAIwJ,cAAcD,QAD7B,EAgBG,SAASE,GAAaF,GACzB,OAAO,IAAI9Q,EAAa,SAACH,EAASgB,GAE9B,IAAI9D,EAAOuM,GAAUwH,GACjBG,EAAKJ,GAAeC,GAExB,GAAIG,EACA,OAAOpR,EAAQoR,GAGnB,GAAI/B,KACA,OAAOrO,EAAO,IAAIG,MAAJ,iCAA4CjE,EAA5C,oBAGlB,IAAIyS,EAAWC,YAAY,WAIvB,OAFAwB,EAAKJ,GAAeC,KAGhBpB,cAAcF,GACP3P,EAAQoR,IAGf/B,MACAQ,cAAcF,GACP3O,EAAO,IAAIG,MAAJ,iCAA4CjE,EAA5C,0BAFlB,GAID,MAIJ,SAASmU,GAAelK,GAC3B5K,KAAK4K,QAAUA,EA6IZ,SAASmK,GAAepL,GAG3B,IAFAuE,EAAyBA,GAA0B,IAAIS,GAE5BY,IAAI5F,GAAQ,CACnC,IAAInG,EAAU0K,EAAuBjN,IAAI0I,GACzC,GAAInG,EACA,OAAOA,EAIf,IAAIA,EAAU,IAAII,EAAa,SAACH,EAASgB,GACrCkF,EAAMqL,iBAAiB,OAAQ,YJYhC,SAAyBrL,GAI5B,GArBJ,WACI,IAAK,IAAIvJ,EAAI,EAAGA,EAAImK,EAAchI,OAAQnC,IAAK,CAC3C,IAAIuK,GAAS,EAEb,IACIA,EAASJ,EAAcnK,GAAGuK,OAC5B,MAAOzH,IAILyH,IACAH,EAAatD,OAAO9G,EAAG,GACvBmK,EAAcrD,OAAO9G,EAAG,KAOhC6U,GAEItL,GAASA,EAAMsB,cACf,IACIV,EAActF,KAAK0E,EAAMsB,eACzBT,EAAavF,KAAK0E,GACpB,MAAOzG,MInBLgS,CAAgBvL,GAChBlG,EAAQkG,KAGZA,EAAMqL,iBAAiB,QAAS,SAAC9R,GACzByG,EAAMsB,cACNxH,EAAQkG,GAERlF,EAAOvB,OAOnB,OAFAgL,EAAuBa,IAAIpF,EAAOnG,GAE3BA,EAGJ,SAAS2R,GAAiBxL,GAC7B,OAAOoL,GAAepL,GAAO1G,KAAK,SAAAmS,GAE9B,IAAKA,EAAYnK,cACb,MAAM,IAAIrG,MAAJ,mCAGV,OAAOwQ,EAAYnK,gBA+DpB,SAASoK,GAAOC,EAAyCnB,QAA8C,IAAvFmB,MAAqC,IAExD,IACId,EAAQc,EAAQd,OAAS,GAEzB7K,EAhED,SAAuB4L,EAAsBD,EAAmCnB,QAAwC,IAAjGoB,MAAe,YAAkF,IAA3ED,MAA+B,IAE/EC,EAAMA,EAAInF,cACV,IAjEqByE,EAAkBW,EAAoBrK,EAiEvDkJ,EAAUtB,SAAS0C,cAAcF,GAcrC,GAZID,EAAQd,OACR/C,GAAO4C,EAAQG,MAAOc,EAAQd,OAG9Bc,EAAQI,QACRrB,EAAQsB,UAAYL,EAAQI,MAAMjI,KAAK,MAGvC6H,EAAQZ,IACRL,EAAQuB,aAAa,KAAMN,EAAQZ,IAGnCY,EAAQO,WAAY,QAAAC,EAAA,EAAAC,EACJjV,OAAO8F,KAAK0O,EAAQO,YADhBC,EAAAC,EAAAxT,OAAAuT,IAC6B,CAA5C,IAAInU,EAAGoU,EAAAD,GACRzB,EAAQuB,aAAajU,EAAK2T,EAAQO,WAAWlU,IAYrD,GARI2T,EAAQU,aArFSnB,EAsFRR,EAtF0BmB,EAsFjBF,EAAQU,gBAtF+D,IAAlC7K,MAAiBtI,OAAOkQ,UAE/E8B,EAAGmB,WAEHnB,EAAGmB,WAAWC,QAAUT,EAExBX,EAAGX,YAAY/I,EAAI+K,eAAeV,KAuFlCF,EAAQa,KACR,IAAY,WAARZ,EAGI,MAAM,IAAI3Q,MAAJ,8EAOVyP,EAAQ+B,UAAYd,EAAQa,KAIpC,OAAO9B,EAkBKoB,CAAc,SAAU,CAChCI,WAAY1T,EAAA,CACRkU,kBAAmB,QALVf,EAAQO,YAAc,IAQnCrB,MAAOrS,EAAA,CACHmU,gBAAiB,cACjBC,OAAiB,QACd/B,GAEP2B,KAAOb,EAAQa,KACfT,MAAOJ,EAAQI,QAGbc,EAAO3T,OAAO4T,UAAUC,UAAU1J,MAAM,cAmB9C,OAjBKrD,EAAMgN,aAAa,OACpBhN,EAAMiM,aAAa,KAAM9F,KAI7BiF,GAAepL,GAEXwK,GAxTD,SAAoBO,EAAqBvJ,QAAuD,IAAvDA,MAA+B4H,UAE3E,IAAIsB,EAAUI,GAAeC,EAAIvJ,GAEjC,GAAIkJ,EACA,OAAOA,EAGX,MAAM,IAAIzP,MAAJ,yBAAoCsI,GAAUwH,IAiTvCkC,CAAWzC,GACjBD,YAAYvK,IAGf2L,EAAQhI,KAAOkJ,IACf7M,EAAMiM,aAAa,MAAON,EAAQhI,KAAO,eAItC3D,EAGJ,SAASqL,GAAiBhH,EAAmB6I,EAAgBhT,GAEhE,OADAmK,EAAIgH,iBAAiB6B,EAAOhT,GACrB,CACHoD,OADG,WAEC+G,EAAI8I,oBAAoBD,EAAOhT,KAmJpC,SAASkT,GAAe1C,GACvBA,GAAWA,EAAQnJ,YACnBmJ,EAAQnJ,WAAW8L,YAAY3C,GAwBhC,SAAS4C,GAAgBpC,GAC5B,OAAKA,IAAOA,EAAG3J,WAoDZ,SAASgM,GAASrC,EAAkBhR,EAApCsT,GAAwL,IAAAC,OAAA,IAAAD,EAAT,GAASA,EAAAE,EAAAD,EAAzFE,aAAyF,IAAAD,KAAAE,EAAAH,EAA3EI,cAA2E,IAAAD,KAAAE,EAAAL,EAA5DhE,gBAA4D,IAAAqE,EAAjD,IAAiDA,EAAAC,EAAAN,EAA5ClP,WAA4C,IAAAwP,EAAtC7U,OAAsC6U,EACvLC,EAAe9C,EAAG+C,YAClBC,EAAgBhD,EAAGiD,aAEvBjU,EAAQ,CAAEyT,MAAOK,EAAcH,OAAQK,IAEvC,IAYIE,EACAhS,EAbA+H,EAAQ,WACR,IAAIkK,EAAWnD,EAAG+C,YACdK,EAAYpD,EAAGiD,cAEdR,GAASU,IAAaL,GAAkBH,GAAUS,IAAcJ,IACjEhU,EAAQ,CAAEyT,MAAOU,EAAUR,OAAQS,IAGvCN,EAAeK,EACfH,EAAgBI,GA2BpB,YArBkC,IAAvB/P,EAAIgQ,gBACXH,EAAW,IAAI7P,EAAIgQ,eAAepK,IACzBqK,QAAQtD,QAEsB,IAAzB3M,EAAIkQ,mBAClBL,EAAW,IAAI7P,EAAIkQ,iBAAiBtK,IAC3BqK,QAAQtD,EAAI,CACjBgB,YAAe,EACfwC,WAAe,EACfC,SAAe,EACfC,eAAe,IAEnBrQ,EAAI8M,iBAAiB,SAAUlH,IAEpB,SAAP6D,IACA7D,IACA/H,EAAUhB,WAAW4M,EAAMyB,GAE/BzB,GAGG,CACH1K,OAAQ,WACJ8Q,EAASS,aACT3V,OAAOiU,oBAAoB,SAAUhJ,GACrC5H,aAAaH,KE/6BlB,SAAS0S,GAAO/I,GACnB,MAAsB,iBAARA,GAAqB,YAAagJ,KAAKhJ,GAGlD,SAASiJ,GAAKjJ,GACjB,MAAsB,iBAARA,GAAqB,aAAcgJ,KAAKhJ,GAkBnD,SAASkJ,GAAKrI,GACjB,OAhBG,SAAeA,GAElB,GAAmB,iBAARA,EACP,OAAOA,EAGX,IAAIvD,EAAQuD,EAAIvD,MAAM,oBAEtB,IAAKA,EACD,MAAM,IAAIpI,MAAJ,kCAA6C2L,GAGvD,OAAOsI,SAAS7L,EAAM,GAAI,IAIf8L,CAAMvI,GAAjB,KAGG,SAASwI,GAAMxI,GAElB,MAAmB,iBAARA,EACAqI,GAAKrI,GAGTkI,GAAOlI,GAAOA,EAAMqI,GAAKrI,GFmWpCuE,GAAenQ,UAAY7D,OAAOY,OAAOkD,MAAMD,WGpYxC,ICWMqU,GAAe,CACxBC,OAAc,mBACdC,MAAc,kBACdC,YAAc,yBAYLvR,GAAW,IAEXwR,GAAqB,CAC9BC,2BAA6B,6BAC7BC,sBAA6B,wBAC7BC,oBAA6B,uBC3B1B,SAASC,GAAUtR,GACtB,YADoE,IAA9CA,MAA6BrF,QAC/CqF,IAAQrF,OACDqF,EAAG,uBAEUA,EAAG,uBAAkCA,EAAG,wBAAmC,GASvG,IAAMuR,GAAwB,iBAAO,IAe9B,SAASC,GAAuB/X,EAAyBgY,GAC5D,YADgH,IAA7EhY,MAAgB,cAA6D,IAApDgY,MAA2BF,IAChFjK,GAASgK,KAAa7X,EAAK,WAC9B,IAAIiY,EAAQD,IAEZ,MAAO,CACHpK,IAAK,SAACsK,GACF,OAAOD,EAAM5X,eAAe6X,IAEhC5Y,IAAK,SAAC4Y,EAAUC,GAEZ,OAAOF,EAAM5X,eAAe6X,GAAYD,EAAMC,GAAYC,GAE9D/K,IAAK,SAAC8K,EAAUtJ,GAEZ,OADAqJ,EAAMC,GAAYtJ,EACXA,GAEXwJ,IAAK,SAACF,UACKD,EAAMC,IAEjBrK,SAAU,SAACqK,EAAUjZ,GAEjB,OAAO4O,GAASoK,EAAOC,EAAUjZ,IAErCmQ,MAAO,WACH6I,EAAQD,KAEZ/S,KAAM,WACF,OAAO9F,OAAO8F,KAAKgT,OAM5B,IAAMI,GAAb,aAEO,SAASC,KACZ,IAAMC,EAASV,KAEf,OADAU,EAAOC,gBAAkBD,EAAOC,iBAAmB,IAAIH,GAChDE,EAAOC,gBAYX,SAASC,GAAezY,EAAyBgY,GACpD,YADwG,IAA7EhY,MAAgB,cAA6D,IAApDgY,MAA2BF,IACxEC,GAAY,eAAelK,SAAS7N,EAAK,WAC5C,IAAM0Y,EAAW,IAAI1L,EAEf2L,EAAW,SAACpS,GACd,OAAOmS,EAAS7K,SAAStH,EAAKyR,IAGlC,MAAO,CACHpK,IAAK,SAACrH,GAEF,OADcoS,EAASpS,GACVlG,eAAeL,IAEhCV,IAAK,SAACiH,EAAK4R,GACP,IAAMF,EAAQU,EAASpS,GAEvB,OAAO0R,EAAM5X,eAAeL,GAAOiY,EAAMjY,GAAOmY,GAEpD/K,IAAK,SAAC7G,EAAKqI,GAGP,OAFc+J,EAASpS,GACjBvG,GAAO4O,EACNA,GAEXwJ,IAAK,SAAC7R,UACYoS,EAASpS,GACVvG,IAEjB6N,SAAU,SAACtH,EAAKtH,GAEZ,OAAO4O,GADO8K,EAASpS,GACAvG,EAAKf,OCvG5C,SAAS2Z,KACL,OAAOb,GAAY,YAAYlK,SAAS,aAAcM,GAG1D,SAAS0K,GAAgBtS,GAErB,OADsBkS,GAAY,iBACb5K,SAAStH,EAAK,kBAAM,IAAItE,IAU1C,SAAS6W,GAASvS,EAAlBwS,GACH,OAAOC,EADiKD,EAApHC,MACxCzS,EAAK8Q,GAAaE,MAAO,CAAE0B,WAAYL,MAAmB,CAAE1R,OAAQjB,GAAU7B,SAAU,IAC/F9C,KAAK,SAAA4X,GAAsC,IAAnCjO,EAAmCiO,EAAnCjO,OAAgBgO,EAAmBC,EAA3BC,KAAQF,WAErB,OADAJ,GAAgBtS,GAAKzE,QAAQ,CAAEyE,MAAKW,OAAQ+D,IACrC,CAAE1E,MAAKW,OAAQ+D,EAAQgO,gBAInC,SAASG,GAAoB7S,EAA7B8S,GAAiH,IAArDL,EAAqDK,EAArDL,KAC/D,OAAOP,GAAY,4BAA4B5K,SAAStH,EAAK,WACzD,OAAOuS,GAASvS,EAAK,CAAEyS,SAAQ1X,KAAK,SAAAgY,GAAA,OAAAA,EAAGL,eC9BxC,SAASM,GAAgBhT,GACPkS,GAAY,gBACpBrL,IAAI7G,GAAK,GCNnB,OAAMiT,GAAO,CAChBC,SAAY,WACZC,MAAY,QACZC,QAAY,UACZC,MAAY,QACZC,KAAY,OACZC,MAAY,QACZC,OAAY,SACZC,OAAY,SACZC,OAAY,SACZC,QAAY,UACZC,KAAY,OACZC,UAAY,aCTT,SAASC,GAAiBrZ,GAC7B,MAAwB,iBAATA,GAA8B,OAATA,GAA0C,iBAAlBA,EAAKsZ,SAG9D,SAASC,GAAc3L,GAC1B,YAAmB,IAARA,EACA4K,GAAKY,UAGJ,OAARxL,EACO4K,GAAKW,KAGZjP,MAAMC,QAAQyD,GACP4K,GAAKM,MAGG,mBAARlL,EACA4K,GAAKC,SAGG,iBAAR7K,EAEHA,aAAe3L,MACRuW,GAAKE,MAGQ,mBAAb9K,EAAItN,KACJkY,GAAKG,QAG4B,oBAAxCxa,GAAiBkC,SAASzC,KAAKgQ,GACxB4K,GAAKI,MAG4B,kBAAxCza,GAAiBkC,SAASzC,KAAKgQ,GACxB4K,GAAKK,KAGTL,GAAKO,OAGG,iBAARnL,EACA4K,GAAKQ,OAGG,iBAARpL,EACA4K,GAAKS,OAGG,kBAARrL,EACA4K,GAAKU,aADhB,EAKG,SAASM,GAAqCC,EAAU7L,GAC3D,MAAO,CACH0L,SAAUG,EACVC,QAAU9L,GCxBlB,OAAM+L,KAAwBC,GAAA,IACxBpB,GAAKC,UCpCJ,aDmCuBmB,GAExBpB,GAAKE,OE5BJ,SAAAmB,GACH,OAAOL,GAAchB,GAAKE,MAAO,CAAEzQ,QADqF4R,EAA3F5R,QACevG,MAD4EmY,EAAlFnY,MACaoY,KADqED,EAA3EC,QF0BnBF,GAGxBpB,GAAKG,SGtCJ,aHmCuBiB,GAIxBpB,GAAKI,OInCJ,SAAwBhL,GAC3B,OAAO4L,GAAchB,GAAKI,MAAOhL,EAAI/N,SJ8BX+Z,GAKxBpB,GAAKK,MKpCJ,SAAuBjL,GAC1B,OAAO4L,GAAchB,GAAKK,KAAMjL,EAAImM,WL8BVH,GAMxBpB,GAAKM,OMzCJ,SAAmClL,GACtC,OAAOA,GNkCmBgM,GAOxBpB,GAAKO,QO1CJ,SAAyBnL,GAC5B,OAAOA,GPkCmBgM,GAQxBpB,GAAKQ,QQ3CJ,SAAyBpL,GAC5B,OAAOA,GRkCmBgM,GASxBpB,GAAKS,QS5CJ,SAAyBrL,GAC5B,OAAOA,GTkCmBgM,GAUxBpB,GAAKU,SU7CJ,SAA0BtL,GAC7B,OAAOA,GVkCmBgM,GAWxBpB,GAAKW,MW9CJ,SAAuBvL,GAC1B,OAAOA,GXkCmBgM,IAexBI,GAAmC,GYhBnCC,KAA4BC,GAAA,IAC5B1B,GAAKC,UX/BJ,WACH,MAAM,IAAIxW,MAAJ,sEW6BwBiY,GAE5B1B,GAAKE,OVvBJ,SAAAjE,GAA8E,IAAzC/S,EAAyC+S,EAAzC/S,MAAOoY,EAAkCrF,EAAlCqF,KACzCvY,EAAQ,IAAIU,MAD+DwS,EAAlDxM,SAK/B,OAFA1G,EAAMuY,KAAOA,EACbvY,EAAMG,MAAYA,EAAlB,OAAgCH,EAAMG,MAC/BH,GUgBuB2Y,GAG5B1B,GAAKG,STjCJ,WACH,MAAM,IAAI1W,MAAJ,qES6BwBiY,GAI5B1B,GAAKI,OR9BJ,SAA0BhL,GAE7B,OAAO,IAAIuM,OAAOvM,IQwBYsM,GAK5B1B,GAAKK,MP/BJ,SAAyBjL,GAC5B,OAAO,IAAInC,KAAKmC,IOyBcsM,GAM5B1B,GAAKM,ONpCJ,SAAqClL,GACxC,OAAOA,GM6BuBsM,GAO5B1B,GAAKO,QLrCJ,SAA2BnL,GAC9B,OAAOA,GK6BuBsM,GAQ5B1B,GAAKQ,QJtCJ,SAA2BpL,GAC9B,OAAOA,GI6BuBsM,GAS5B1B,GAAKS,QHvCJ,SAA2BrL,GAC9B,OAAOA,GG6BuBsM,GAU5B1B,GAAKU,SFxCJ,SAA4BtL,GAC/B,OAAOA,GE6BuBsM,GAW5B1B,GAAKW,MDzCJ,SAAyBvL,GAC5B,OAAOA,GC6BuBsM,IAe5BE,GAAuC,GCvC7C,SAASC,KAAsB,IAC3B,IAAMC,EAAkBvD,GAAY,mBADThG,EAAA,EAAAwJ,EAEVD,EAAgBrW,OAFN8M,EAAAwJ,EAAA3a,OAAAmR,IAEc,CAApC,IAAMgB,EAAEwI,EAAAxJ,GAELuJ,EAAgBhc,IAAIyT,GAAIyI,eACxBF,EAAgBlD,IAAIrF,IAiBhC,SAAS0I,GAAoB1I,EAAaxM,EAA1CsU,GAA+H,IACvHa,EADiE1C,EAAsD6B,EAAtD7B,KAGrE,MAAO,CACHjG,KACA0H,KAAe7T,EAAUL,GAAOL,EAAYE,MAAQF,EAAYC,OAChEyS,cAAe7J,EAAe,kBAAMqK,GAAoB7S,EAAK,CAAEyS,WAC/D2C,MAAe,kBAAM1Z,EAAakC,IAAI,WAClCoC,EAAIoV,WAERC,QAAS,kBAAM3Z,EAAakC,IAAI,WAC5B,IAAI2E,EAAevC,GAInB,OAAOmV,KAEXG,MAAS,kBAAM5Z,EAAakC,IAAI,WAC5BoC,EAAIsV,WAERC,SAAU,kBAAM7Z,EAAakC,IAAI,WAC7B,OAAO2E,EAAevC,MAE1BwV,YAAa,SAACC,GAAD,OAAU/Z,EAAakC,IAAI,WACpC,GAAIiD,EAAab,GACb,IACI,GAAIA,EAAIC,UAA4C,mBAAzBD,EAAIC,SAAS6H,QAGpC,YADA9H,EAAIC,SAAS6H,QAAQ2N,GAG3B,MAAOza,IAKbgF,EAAIC,SAAWwV,KAEnBC,QAAS,SAACjd,GAAD,OAAUiD,EAAakC,IAAI,YAKhCoC,EAAMiB,EAAiBjB,IAEnBvH,KAAOA,EAEPuH,EAAI2V,cACJ3V,EAAI2V,aAAajI,aAAa,OAAQjV,GAG1C0c,EAAa1c,MCbQ,IAAIiD,EAAa,SAAAH,GAE9C,GAAIZ,OAAOkQ,UAAYlQ,OAAOkQ,SAASC,KACnC,OAAOvP,EAAQZ,OAAOkQ,SAASC,MAGnC,IAAMI,EAAWC,YAAY,WACzB,GAAIxQ,OAAOkQ,UAAYlQ,OAAOkQ,SAASC,KAEnC,OADAM,cAAcF,GACP3P,EAAQZ,OAAOkQ,SAASC,OAEpC,MDOA,IAAM8K,GAAb,WASI,SAAAA,EAAYC,EAA0CC,EAAtD5G,GAA8H,IAA9BuD,EAA8BvD,EAA9BuD,KAA8B3a,KAP9Hie,eAAuB,EAOuGje,KAN9H+d,sBAM8H,EAAA/d,KAL9Hge,kBAK8H,EAAAhe,KAJ9Hke,yBAI8H,EAAAle,KAH9H2a,UAG8H,EAAA3a,KAF9HW,UAE8H,EAC1HX,KAAK+d,iBAAmBA,EACxB/d,KAAKke,oBAAsB,IAAIta,EAC/B5D,KAAK2a,KAAOA,EACRqD,GACAhe,KAAKme,UAAUH,GAd3B,IAAAtZ,EAAAoZ,EAAAnZ,UAAA,OAAAD,EAkBI0Z,QAAA,WACI,OAAOpe,KAAK+d,iBAAiB3B,MAnBrC1X,EAsBI2Z,QAAA,WACI,OAAOre,KAAKoe,YAAcvW,EAAYE,OAvB9CrD,EA0BI4Z,SAAA,WACI,OAAOte,KAAKoe,YAAcvW,EAAYC,QA3B9CpD,EA8BIgZ,YAAA,SAAYC,GAA2C,IAAA7Z,EAAA9D,KACnD,OAAOA,KAAK+d,iBAAiBL,YAAYC,GAAM1a,KAAK,kBAAMa,KA/BlEY,EAkCIkZ,QAAA,SAAQjd,GAA2C,IAAAmE,EAAA9E,KAC/C,OAAOA,KAAK+d,iBAAiBH,QAAQjd,GAAMsC,KAAK,kBAAM6B,KAnC9DJ,EAsCI4Y,MAAA,WAAoC,IAAAjY,EAAArF,KAChC,OAAOA,KAAK+d,iBAAiBT,QAAQra,KAAK,kBAAMoC,KAvCxDX,EA0CI8Y,MAAA,WAAoC,IAAAvX,EAAAjG,KAChC,OAAO4D,EAAakC,IAAI,WACpB,OAAOlC,EAAayC,IAAI,CACpBJ,EAAKoY,WAAapY,EAAK8X,iBAAiBR,UAAUta,KAAK,SAAAtC,GAC/CA,GACAkC,OAAO0b,KAAK,GAAI5d,KAGxBsF,EAAK8X,iBAAiBP,YAE3Bva,KAAK,kBAAMgD,KApDtBvB,EAuDI+Y,SAAA,WACI,OAAOzd,KAAK+d,iBAAiBN,YAxDrC/Y,EA2DI8Z,UAAA,WACI,OAAOxe,KAAKge,cA5DpBtZ,EA+DIyZ,UAAA,SAAUjW,GACNlI,KAAKge,aAAe9V,EACpBlI,KAAK+d,iBAAmBX,GAAoBpd,KAAK+d,iBAAiBrJ,GAAIxM,EAAK,CAAEyS,KAAM3a,KAAK2a,OACxF3a,KAAKke,oBAAoBza,QAAQyE,IAlEzCxD,EAqEI+Z,YAAA,WACI,OAAOze,KAAKke,qBAtEpBxZ,EAyEIga,YAAA,SAAYxW,GAAqD,IAAAyW,EAAA3e,KAC7D,OAAO4D,EAAakC,IAAI,WACpB,OAAI6Y,EAAKX,aACE9V,IAAQyW,EAAKX,aAGjBpa,EAAayC,IAAI,CACpBsY,EAAKpE,gBACLQ,GAAoB7S,EAAK,CAAEyS,KAAMgE,EAAKhE,SACvC1X,KAAK,SAAAyX,GAAgD,IAC9C1N,EAD8C0N,EAAA,KAAAA,EAAA,GAOpD,OAJI1N,GACA2R,EAAKR,UAAUjW,GAGZ8E,OAzFvBtI,EA8FIka,OAAA,WACI,OAAO5e,KAAKge,cAAgBhe,MA/FpC0E,EAkGI6V,cAAA,WACI,OAAOva,KAAK+d,iBAAiBxD,iBAnGrC7V,EAsGIma,UAAA,WACI,OAAO7e,KAAK+d,kBAvGpBrZ,EA0GIyY,YAAA,WACI,OAAOnd,KAAKge,cAAgBvT,EAAezK,KAAKge,eA3GxDF,EA8GWc,OAAP,SAAc1W,GACV,OAAO4V,EAAYG,cAAc/V,GAE3BA,EAAI0W,SACJ1W,GAlHd4V,EAqHWe,UAAP,SAAiB3W,EAAjB2S,GAAoH,IAAtDF,EAAsDE,EAAtDF,KAG1D,OAFAqC,KAEOc,EAAYgB,cAAc5W,EAAK,CAAEyS,SAAQkE,aAxHxDf,EA2HWiB,YAAP,SAAmBhB,EAAnB/C,GAA4H,IAA7DgE,EAA6DhE,EAA7DgE,GAAIrE,EAAyDK,EAAzDL,KAG/D,OAFAqC,KAEOtD,GAAY,mBAAmBlK,SAASuO,EAAiBrJ,GAAI,WAChE,OAAO,IAAIoJ,EAAYC,EAAkB,KAAM,CAAEiB,KAAIrE,YA/HjEmD,EAmIWG,cAAP,SAAqBjQ,GAEjB,OAAOjB,QAAQiB,IAAQD,EAASC,IAAQA,EAAIiQ,gBArIpDH,EAwIWgB,cAAP,SAAqB5W,EAArB+S,GAA8G,IAA5CN,EAA4CM,EAA5CN,KAG9D,GAFAqC,KAEIc,EAAYG,cAAc/V,GAE1B,OAAOA,EAIX,IAAM+W,EAAkC/W,EAGxC,OAAOkS,GAAY,oBAAoB5K,SAAStH,EAAK,WACjD,IAAMwM,EAAK5E,IAELoP,EAAc,IAAIpB,EADCV,GAAoB1I,EAAIuK,EAAS,CAAEtE,SACNsE,EAAS,CAAEtE,SAEjE,OAAOjB,GAAY,mBAAmB3K,IAAI2F,EAAIwK,MAzJ1DpB,EAAA,GExEA,SAASqB,GAAUzK,EAAanE,EAAgB5P,EAAe6B,EAA8CqG,GACzG,IAAMuW,EAAchF,GAAY,eAC1BiF,EAAqB3F,GAAY,sBAEnCoE,GAAYG,cAAczb,GAC1B6c,EAAmBtQ,IAAI2F,EAAI,CAAEnE,MAAK5P,OAAMkI,SAAQrG,YAEhD6c,EAAmBtF,IAAIrF,GAEP0K,EAAY5P,SAAShN,EAAQ,iBAAO,KAC5CkS,GAAM,CAAE7L,SAAQlI,OAAM4P,MAAK/N,WAI3C,SAAS8c,GAAa9c,EAAgCkS,GAClD,IAAM0K,EAAchF,GAAY,eAC1BiF,EAAqB3F,GAAY,sBAEvC,OADgB0F,EAAY5P,SAAShN,EAAQ,iBAAO,KACrCkS,IAAO2K,EAAmBpe,IAAIyT,GA0D1C,SAAS6K,GAAqBC,EAAmD3W,EAAwB0H,EAAiC5O,EAA1I+Y,IAvDP,SAAA8B,GAA2E,IAAzCwC,EAuD4KtE,EAA7CsE,GAtDtJtF,GAAY,oBAAoBlK,SAAS,gBAAiB,WAC7D,OAAOwP,EAAGhG,GAAaC,OAAQ,CAAEpQ,OAAQjB,IAAY,SAAAwP,GAAmG,IAAhG5U,EAAgG4U,EAAhG5U,OAAQoK,EAAwFwK,EAAxFxK,OAAQkO,EAAgF1D,EAAhF0D,KAC5DpG,EAAaoG,EAAbpG,GAAI/T,EAASma,EAATna,KAEN8e,EAAOH,GAAa9c,EAAQkS,GAElC,IAAK+K,EACD,MAAM,IAAI7a,MAAJ,0BAAqCkW,EAAKna,KAA1C,cAA8Dma,EAAKpG,GAAnE,OAA8E9L,EAAU/F,SANkD,IASpI6c,EAA8BD,EAAtCjd,OAAsBqG,EAAgB4W,EAAhB5W,OAAQ0H,EAAQkP,EAARlP,IAEtC,OAAO3M,EAAakC,IAAI,WACpB,IAAK4G,EAAY7D,EAAQ+D,GAErB,MAAM,IAAIhI,MAAJ,WAAsBkW,EAAKna,KAA3B,YAA6CsM,KAAKC,UAAU3F,GAAQkY,EAAK5W,QAAU4W,EAAK5W,OAAOrG,OAASid,EAAK5W,QAA7G,0BAAgJ+D,EAAhJ,OAA+JhE,EAAU/F,SAGnL,GAAIib,GAAYG,cAAcyB,GAE1B,OAAOA,EAAahB,YAAYlc,GAAQS,KAAK,SAAA+J,GACzC,IAAKA,EACD,MAAM,IAAIpI,MAAJ,gBAA2BkW,EAAKna,KAAhC,oDAA0FiI,EAAU/F,aAIvHI,KAAK,WACJ,OAAOsN,EAAI9N,MAAM,CAAED,SAAQoK,UAAUkO,EAAK1T,OAC3C,SAAAlE,GACC,OAAOU,EAAakC,IAAI,WACpB,GAAIyK,EAAI9K,QACJ,OAAO8K,EAAI9K,QAAQvC,KAExBD,KAAK,WAOJ,MALIC,EAAImB,QAEJnB,EAAImB,MAAJ,kBAA+B1D,EAA/B,SAA8CuC,EAAImB,OAGhDnB,MAEXD,KAAK,SAAAqB,GACJ,MAAO,CAAEA,SAAQoQ,KAAI/T,cAYjCgf,GAEA,IAAMjL,EAAKnE,EAAIqP,QAAU9P,IACzB0P,EAAc1B,GAAYc,OAAOY,GACjC,IAAM7e,EAAO4P,EAAIsP,UAAYtP,EAAI5P,MAAQgB,EAazC,OAXImc,GAAYG,cAAcuB,IAC1BL,GAAUzK,EAAInE,EAAK5P,EAAM6e,EAAa3W,GAGtC2W,EAAYf,cAAcxb,KAAK,SAAAiF,GAC3BiX,GAAUzK,EAAInE,EAAK5P,EAAMuH,EAAKW,MAGlCsW,GAAUzK,EAAInE,EAAK5P,EAAM6e,EAAa3W,GAGnCsT,GAAc/C,GAAmBE,sBAAuB,CAAE5E,KAAI/T,SCtGlE,SAASmf,GAA4BN,EAAmD3W,EAAwBmF,EAAhHwO,GAAmL,IAAAuD,EAAxDf,EAAwDxC,EAAxDwC,GAAIrE,EAAoD6B,EAApD7B,KAClI,OhB2CG,SAA8B3M,EAASgS,QAAyD,IAAzDA,MAA4BrD,IAyBtE,IAAMrY,EAAS2I,KAAKC,UAAUc,EAvB9B,SAAkBrM,GACd,IAAM4O,EAAMvQ,KAAK2B,GAEjB,GAAIqa,GAAiBhc,MACjB,OAAOuQ,EAGX,IAAM6L,EAAOF,GAAc3L,GAE3B,IAAK6L,EACD,OAAO7L,EAIX,IAAM0P,EAAaD,EAAY5D,IAASE,GAAWF,GAEnD,OAAK6D,EAIEA,EAAW1P,EAAK5O,GAHZ4O,IAQf,YAAsB,IAAXjM,EACA6W,GAAKY,UAGTzX,EgB1EAua,CAAU7Q,IAAD+R,EAAA,IACV5E,GAAKG,SAAY,SAAC/K,EAAgB5O,GAAjB,OCEpB,SAA0B6d,EAAmD3W,EAAwB0H,EAAgB5O,EAArH6a,GACH,OAAOL,GAAc/C,GAAmBC,2BAA4B,CAChEpW,KAAMsc,GAAkBC,EAAa3W,EAAQ,SAACpF,EAASgB,GAAV,OAAqB8L,EAAItN,KAAKQ,EAASgB,IAAS9C,EAAK,CAAEqd,GAFmGxC,EAAnEwC,GAE5BrE,KAF+F6B,EAA/D7B,SDF/DuF,CAAiBV,EAAa3W,EAAQ0H,EAAK5O,EAAK,CAAEqd,KAAIrE,UADnHoF,EAEV5E,GAAKC,UAAY,SAAC7K,EAAgB5O,GAAjB,OAAuD4d,GAAkBC,EAAa3W,EAAQ0H,EAAK5O,EAAK,CAAEqd,KAAIrE,UAFrHoF,EAGV5E,GAAKO,QAAY,SAACnL,GAChB,OAAQxC,EAASwC,IAAQuN,GAAYG,cAAc1N,GH4OpD4L,GAAc/C,GAAmBG,oBAAqBuE,GAAYe,UG5O+BtO,EH4OhB,CAAEoK,KG5OyBA,KAAUpK,GAJ7GwP,IASb,SAASI,GAA8B3d,EAA8CoK,EAAiBhC,EAAtGwM,GAA6K,IAAAgJ,EAAnDpB,EAAmD5H,EAAnD4H,GAAIrE,EAA+CvD,EAA/CuD,KACjI,OJgCG,SAA8CjL,EAAc2Q,GAC/D,QADyH,IAA1DA,MAAgCtD,IAC3FrN,IAAQyL,GAAKY,UAmCjB,OAAO9O,KAAKqT,MAAM5Q,EA9BlB,SAAkB/N,EAAK4O,GACnB,GAAIyL,GAAiBhc,MACjB,OAAOuQ,EAGX,IAAI6L,EACA/a,EAUJ,GARI2a,GAAiBzL,IACjB6L,EAAO7L,EAAI0L,SACX5a,EAAQkP,EAAI8L,UAEZD,EAAOF,GAAc3L,GACrBlP,EAAQkP,IAGP6L,EACD,OAAO/a,EAIX,IAAMkf,EAAeF,EAAcjE,IAASQ,GAAaR,GAEzD,OAAKmE,EAIEA,EAAalf,EAAOM,GAHhBN,II9DR0d,CAAYnU,IAADwV,EAAA,IACZhH,GAAmBC,4BAA8B,SAACmH,GAAD,OCDhD,IAAI5c,EDCuG4c,ECFfvd,ODCjFmd,EAEZhH,GAAmBE,uBAA8B,SAACmH,GAAD,OD4FpD,SAAgCje,EAA8CoK,EAA9EiO,EAAAG,GAAqO,IAApItG,EC5Fe+L,ED4Ff/L,GAAI/T,EC5FW8f,ED4FX9f,KAA2Cga,EAAqFK,EAArFL,KAC7I+F,EAA0B,SAACC,GAC7B,SAASC,IAA0D,IAAAC,EAAAve,UAO/D,OAAOwb,GAAYgB,cAActc,EAAQ,CAAEmY,SAAQ8D,cAAcxb,KAAK,SAAAiF,GAClE,IAAMuX,EAAOH,GAAapX,EAAKwM,GAE/B,GAAI+K,GAAQA,EAAKlP,MAAQqQ,EACrB,OAAOnB,EAAKlP,IAAI9N,MAAM,CAAED,OAAQK,OAAQ+J,OAAQhE,KAAetG,GAG/D,IAAMgT,EAAU,CAAEzM,OAAQ+D,EAAQkU,cAAeH,EAAKG,eAChD1Z,EAAOyF,GAAgBW,MAAMjN,KAAK+B,GAExC,OAAOqY,EAAKzS,EAAK8Q,GAAaC,OAAQ,CAAEvE,KAAI/T,OAAMyG,QAAQkO,GACrDrS,KAAK,SAAAuB,GACF,IAAKmc,EAAKG,cACN,OAAOtc,EAAIsW,KAAKxW,WAKjCoB,MAAM,SAAAxC,GAML,MAAMA,IAWd,YA3CqD,IAAxByd,MAAiB,IAoC9CC,EAA2Bf,SAAWlf,EACtCigB,EAA2BG,WAAanU,EACxCgU,EAA2BI,WAAaxe,EACxCoe,EAA2BhB,OAASlL,EAEpCkM,EAA2BhU,OAASA,EAE7BgU,GAGLA,EAA6BF,IAGnC,OAFAE,EAA2BE,cAAgBJ,EAAwB,CAAEI,eAAe,IAE7EF,EC9IwEK,CAAoBze,EAAQoK,EAAQ6T,EAAoB,CAAEzB,KAAIrE,UAF3HyF,EAGZhH,GAAmBG,qBAA8B,SAACwE,GAAD,OHuOhDD,GAAYiB,YGvO8FhB,EHuO7E,CAAEiB,IADnCkC,EGtOgI,CAAElC,KAAIrE,SHsObqE,GAClFrE,KAD+IuG,EAAzDvG,OAA7H,IAAAuG,GGzOed,IEbf,IAAMe,GAA0B,GCChC,SAASC,GAAYlZ,EAA6BW,EAAwB+B,EAA1E4R,GAA8I,IAAA6E,EAA/CrC,EAA+CxC,EAA/CwC,GAAIrE,EAA2C6B,EAA3C7B,KACtG,GAAIlQ,EAAevC,GACf,MAAM,IAAItD,MAAM,oBAF6H,IAKjJ,IAAM0c,EAAoBxB,GAAiB5X,EAAKW,IAANwY,EAAA,2BAAAlf,EAAA,CAElCuS,GAAQ5E,IACRlD,OAAQhE,EAAU/F,SACf+H,GAJ+ByW,GAMvC,CAAErC,KAAIrE,SAEH4G,EAAazgB,OAAO8F,KAAKua,IACzBK,EAAS,GAdkI9N,EAAA,EAAAA,EAgBtH6N,EAhBsHhf,OAAAmR,IAgB1G,CAAlC,IAAM+N,EAAgBF,EAAJ7N,GACnB,IACIyN,GAAwBM,GAAcvZ,EAAKoZ,EAAmBzY,GAChE,MAAO3F,GACLse,EAAOvc,KAAK/B,IAIpB,GAAIse,EAAOjf,SAAWgf,EAAWhf,OAC7B,MAAM,IAAIqC,MAAJ,kDAA6D4c,EAAO3a,IAAIyK,IAAgB7D,KAAK,SDxB3G0T,GAAuB,uBAA+B,SAACjZ,EAA6BoZ,EAA4BzY,IAUxGgE,MAAMC,QAAQjE,GACJA,EACe,iBAAXA,EACJ,CAAEA,GAEF,CAAEjB,KAGEf,IAAI,SAAA6a,GAkBlB,OAAmC,IAA/BA,EAAI1c,QAAQwC,EAASE,MACdE,GAGJ8Z,IAGHC,QAAQ,SAAAD,GACZxZ,EAAI0Z,YAAYN,EAAmBI,MA0BvCP,GAAuB,iBAAyB,SAACjZ,EAA6BoZ,GAE1E,GhCieD,SAAsBpZ,GAEzB,OADAA,EAAMA,GAAOrF,QACF4T,UAAUoL,eAAiB3Z,EAAIuO,UAAUC,UkCjjBhDoL,CAAajf,QAAQmK,MAAM,yCF8E3B,CAIA,IAAKjE,EAAab,GACd,MAAM,IAAItD,MAAJ,yEAGV,IAAqC,IAAjCqH,EAAgBpJ,OAAQqF,GACxB,MAAM,IAAItD,MAAJ,wFAIV,IAAMmd,EAAgBvI,GAAUtR,GAEhC,IAAK6Z,EACD,MAAM,IAAInd,MAAJ,mDAGVmd,EAAcC,eAAe,CACzBxf,OAAQK,OACR+J,OAAQhE,IACRkS,KAAQwG,MG1FpB,OAAMW,GAAmB,mBAwBlB,SAASC,GAAoBvb,GAEhC,OAD0B+S,GAAY,qBACbzY,IAAI0F,GAG1B,SAASwb,GAAuBxb,GACT+S,GAAY,qBACpBK,IAAIpT,GAmBnB,SAASyb,GAA0Bzb,GAEtC,OADiC+S,GAAY,4BACbnK,IAAI5I,GAGjC,SAAS0b,GAAT7F,GAAsK,IAAxI7b,EAAwI6b,EAAxI7b,KAAMuH,EAAkIsU,EAAlItU,IAAKW,EAA6H2T,EAA7H3T,OACtCyZ,EAAmBlI,GAAY,oBAUrC,GARIlS,IAAQN,KACRM,EAAM,MAGNW,IAAWjB,KACXiB,EAAS,OAGRlI,EACD,MAAM,IAAIiE,MAAJ,yCAZ+J,QAAA2d,EAAA,EAAA7H,EAe9I,CAAExS,EAAK+R,MAfuIsI,EAAA7H,EAAAnY,OAAAggB,IAetH,CAA9C,IAAMC,EAAY9H,EAAA6H,GACnB,GAAKC,EAAL,CAIA,IAAMC,EAAgBH,EAAiBrhB,IAAIuhB,GAE3C,GAAKC,EAAL,CAIA,IAAMC,EAAkBD,EAAc9hB,GAEtC,GAAK+hB,EAAL,CAIA,GAAI7Z,GAA4B,iBAAXA,EAAqB,CACtC,GAAI6Z,EAAgB7Z,GAChB,OAAO6Z,EAAgB7Z,GAG3B,GAAI6Z,EAAgBT,IAAmB,QAAAnM,EAAA,EAAA6M,EACDD,EAAgBT,IADfnM,EAAA6M,EAAApgB,OAAAuT,IACkC,KAAA8M,EAAAD,EAAA7M,GAAjD+M,EAAiDD,EAAjDC,SAChB,GAAInW,EAD6DkW,EAAxDE,MACcja,GACnB,OAAOga,GAMvB,GAAIH,EAAgB9a,IAChB,OAAO8a,EAAgB9a,QC1G5B,IAAMmb,KAAqBC,GAAA,uCAELxgB,EAAgCoK,EAAiBhC,EAF5C4R,GAE4I,IAApEwC,EAAoExC,EAApEwC,GAAIrE,EAAgE6B,EAAhE7B,KAEhGrF,EAAU+M,GAAmB,CAAE1hB,KAAMiK,EAAQjK,KAAMuH,IAAK1F,EAAQqG,OAAQ+D,IAS9E,SAASqW,EAAa7G,EAAqC8G,EAAoCC,QAAe,IAAfA,MAAW,IAElGvY,EAAQkW,eAAiBrW,EAAejI,IAe5C4e,GAAY5e,EAAQoK,EAATzK,EAAA,CACPia,OACA8G,MACAvc,KAAQiE,EAAQjE,KAChBhG,KAAQiK,EAAQjK,MACbwiB,GACJ,CAAEnE,KAAIrE,SAGb,OAAO/W,EAAayC,IAAI,CAEpB4c,E5BhDG,yB4BkDHrf,EAAakC,IAAI,WAEb,IAAKwP,EACD,MAAM,IAAI1Q,MAAJ,sCAAiDgG,EAAQjK,KAAzD,SAAwEiM,EAAxE,OAAuF/J,OAAOsF,SAASC,SAAvG,KAAsHvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAGzK,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,kBAA6BgI,EAA7B,0BAA+D0I,EAAQzM,OAAO7F,YAKxF,OAAOsS,EAAQzR,QAAQ,CAAErB,SAAQoK,SAAQkO,KAF5BlQ,EAAQkQ,SAItB7X,KAAK,SAAA6X,GACJ,OAAOmI,E5BlER,6BAKD,U4B6DkE,CAAEnI,UAEnE,SAAA5W,GACC,OAAO+e,E5BrER,6BAMD,Q4B+DgE,CAAE/e,cAGrEjB,KAAKkO,IAAMzL,MAAM,SAAAxC,GAChB,GAAIoS,GAAWA,EAAQ+N,YACnB,OAAO/N,EAAQ+N,YAAYngB,GAE3B,MAAMA,KApEY8f,GAAA,+BAyETxgB,EAAgCoK,EAAiBhC,GAElE,IAAIwX,GAA0BxX,EAAQjE,MAAtC,CAIA,IAAM2O,EAAU4M,GAAoBtX,EAAQjE,MAE5C,IAAK2O,EACD,MAAM,IAAI1Q,MAAJ,sDAAiEgG,EAAQjK,KAAzE,SAAwFiM,EAAxF,OAAuG/J,OAAOsF,SAASC,SAAvH,KAAsIvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAGzL,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,cAAyBgI,EAAzB,0BAA2D0I,EAAQzM,OAAO7F,YAGpF,GAAIR,IAAW8S,EAAQpN,IACnB,MAAM,IAAItD,MAAJ,+CAGV0Q,EAAQ4N,KAAM,IA7FYF,GAAA,oCAgGJxgB,EAAgCoK,EAAiBhC,GAEvE,IAAIwX,GAA0BxX,EAAQjE,MAAtC,CAIA,IpC6uB+BgG,EoC7uBzB2I,EAAU4M,GAAoBtX,EAAQjE,MAE5C,IAAK2O,EACD,MAAM,IAAI1Q,MAAJ,2DAAsEgG,EAAQjK,KAA9E,SAA6FiM,EAA7F,OAA4G/J,OAAOsF,SAASC,SAA5H,KAA2IvF,OAAOsF,SAASQ,KAAS9F,OAAOsF,SAASib,UAG9L,IAAK1W,EAAY4I,EAAQzM,OAAQ+D,GAC7B,MAAM,IAAIhI,MAAJ,mBAA8BgI,EAA9B,2BpCsuBqBD,EoCtuBkE2I,EAAQzM,OpCuuBzGgE,MAAMC,QAAQH,GACd,IAAYA,EAAQc,KAAK,OAAzB,IACOlG,EAAQoF,GACf,UAAkBA,EAAQ3J,WAEnB2J,EAAQ3J,aoCzuBf,GAAIR,IAAW8S,EAAQpN,IACnB,MAAM,IAAItD,MAAJ,oDAGVud,GAAuBvX,EAAQjE,M5BtHzB,U4B0HFiE,EAAQsY,IAKR5N,EAAQ9R,QAAQiB,OAAOmG,EAAQ1G,O5BhI7B,Y4BkIK0G,EAAQsY,KAKf5N,EAAQ9R,QAAQC,QAAQ,CAAEjB,SAAQoK,SAAQkO,KAAMlQ,EAAQkQ,SApIlCkI,ICkC3B,SAAShB,GAAenL,EAAxBO,GAA+F,IAA/C4H,EAA+C5H,EAA/C4H,GAAIrE,EAA2CvD,EAA3CuD,KACjD2I,EAAmB5J,GAAY,oBAErC,IAAK7W,QAAUA,OAAO8H,OAClB,MAAM,IAAI/F,MAAJ,qCAGV,IACI,IAAKiS,EAAMrU,OACP,OAEN,MAAOU,GACL,OAZ8F,IAe5FV,EAAyBqU,EAAzBrU,OAAQoK,EAAiBiK,EAAjBjK,OAORhC,EAxDV,SAAsBA,EAAkBpI,EAAgCoK,EAAxE4P,GAAoJ,IAC5I+G,EADmFvE,EAAyDxC,EAAzDwC,GAAIrE,EAAqD6B,EAArD7B,KAG3F,IACI4I,EAAgBpD,GAAmB3d,EAAQoK,EAAQhC,EAAS,CAAEoU,KAAIrE,SACpE,MAAOzX,GACL,OAGJ,GAAKqgB,GAIwB,iBAAlBA,GAAgD,OAAlBA,IAIzCA,EAAgBA,EAAa,yBAEkB,iBAAlBA,GAAgD,OAAlBA,GAItDA,EAAcnH,MAAsC,iBAAvBmH,EAAcnH,MAI3C2G,GAAsBQ,EAAcnH,MAIzC,OAAOmH,EAyBSC,CAPe3M,EAATiE,KAOatY,EAAQoK,EAAQ,CAAEoS,KAAIrE,SAEpD/P,IAILsQ,GAAgB1Y,GAEZ8gB,EAAiB/T,IAAI3E,EAAQ8J,MAIjC4O,EAAiBvU,IAAInE,EAAQ8J,IAAI,GAE7BjK,EAAejI,KAAYoI,EAAQkW,gBAIO,IAA1ClW,EAAQgC,OAAO5H,QAAQwC,EAASE,QAChCkF,EAAapF,EAASE,KAAhB,MAGVqb,GAAsBnY,EAAQwR,MAAM5Z,EAAQoK,EAAQhC,EAAS,CAAEoU,KAAIrE,YClFhE,SAASqE,GAAGre,EAAe2U,EAA2CzR,GAEzE,IAAKlD,EACD,MAAM,IAAIiE,MAAM,iBASpB,GANuB,mBAAZ0Q,IACPzR,EAAUyR,EAEVA,EAAU,KAGTzR,EACD,MAAM,IAAIe,MAAM,qBAGpB0Q,EAAUA,GAAW,IACb3U,KAAOA,EACf2U,EAAQzR,QAAUA,GAAWyR,EAAQzR,QAErC,IAAMqE,EAAMoN,EAAQzS,OACdgG,EAASyM,EAAQzM,OAYjB4a,EHkFH,SAASC,EAAT7I,EAA2IgI,GAA0D,IAAvKliB,EAAuKka,EAAvKla,KAAMuH,EAAiK2S,EAAjK3S,IAAKW,EAA4JgS,EAA5JhS,OACtCyZ,EAAmBlI,GAAY,oBAErC,IAAKzZ,GAAwB,iBAATA,EAChB,MAAM,IAAIiE,MAAJ,yCAGV,GAAIiI,MAAMC,QAAQ5E,GAAM,KACpB,IAAMyb,EAAsB,GADRC,EAAA,EAAAC,EAGD3b,EAHC0b,EAAAC,EAAAthB,OAAAqhB,IAIhBD,EAAoB1e,KAAKye,EAAmB,CAAE/iB,OAAMkI,SAAQX,IADjD2b,EAAAD,IAC8Df,IAG7E,MAAO,CACH5b,OADG,WACM,QAAA6c,EAAA,EAAAA,EACwBH,EADxBphB,OAAAuhB,IACwBH,EAAJG,GACN7c,WAM/B,GAAI4F,MAAMC,QAAQjE,GAAS,KACvB,IAAM8a,EAAsB,GADLI,EAAA,EAAAC,EAGJnb,EAHIkb,EAAAC,EAAAzhB,OAAAwhB,IAInBJ,EAAoB1e,KAAKye,EAAmB,CAAE/iB,OAAMuH,MAAKW,OAD9Cmb,EAAAD,IAC8DlB,IAG7E,MAAO,CACH5b,OADG,WACM,QAAAgd,EAAA,EAAAA,EACwBN,EADxBphB,OAAA0hB,IACwBN,EAAJM,GACNhd,WAM/B,IAAMid,EAAmB7B,GAAmB,CAAE1hB,OAAMuH,MAAKW,WAQzD,GANKX,GAAOA,IAAQN,KAChBM,EAAM+R,MAGVpR,EAASA,GAAUjB,GAEfsc,EACA,MAAIhc,GAAOW,EACD,IAAIjE,MAAJ,uCAAkDjE,EAAlD,cAAsEkI,EAAO7F,WAA7E,SAAiGkF,IAAQ+R,KAAgB,WAAa,aAAtI,WACC/R,EACD,IAAItD,MAAJ,uCAAkDjE,EAAlD,SAAgEuH,IAAQ+R,KAAgB,WAAa,aAArG,WACCpR,EACD,IAAIjE,MAAJ,uCAAkDjE,EAAlD,cAAsEkI,EAAO7F,YAE7E,IAAI4B,MAAJ,uCAAkDjE,GAIhE,IAMIwjB,EACAC,EAPE3B,EAAgBH,EAAiB9S,SAAStH,EAAK,iBAAO,KAEtDwa,EAAkBlT,GAASiT,EAAe9hB,EAAM,iBAAO,KAEvD0jB,EAAYxb,EAAO7F,WAazB,OARIuE,GAAQsB,IACRsb,EAAiB3U,GAASkT,EAAiBT,GAAkB,iBAAM,MAEpDhd,KADfmf,EAAgB,CAAEtB,MAAOja,EAAQga,aAGjCH,EAAgB2B,GAAaxB,EAG1B,CACH5b,OADG,kBAEQyb,EAAgB2B,GAEnBD,IACAD,EAAejd,OAAOid,EAAenf,QAAQof,EAAe,IAEvDD,EAAe5hB,eACTmgB,EAAgBT,KAI1BnhB,OAAO8F,KAAK8b,GAAiBngB,eAEvBkgB,EAAc9hB,GAIrBuH,IAAQpH,OAAO8F,KAAK6b,GAAelgB,QACnC+f,EAAiBvI,IAAI7R,KGjLTwb,CAAmB,CAAE/iB,OAAMuH,MAAKW,UAVV,CAC1ChF,QAAayR,EAAQzR,QACrBwf,YAAa/N,EAAQgP,cAAiB,SAAAphB,GAClC,MAAMA,GAEVL,OAAQqF,EACRW,OAAQA,GAAUjB,GAClBjH,SAKJ,MAAO,CACHsG,OADG,WAECwc,EAAgBxc,WCIrB,ICnCIsd,GDmCE5J,GAAkB,SAAlBA,EAAmBzS,EAAKvH,EAAMma,EAAMxF,GAI7C,IAAIzM,GADJyM,EAAUA,GAAW,IACAzM,QAAUjB,GACzB4c,EAAkBlP,EAAQvP,UhC/CS,EgCgDnC0e,EAAenP,EAAQvP,ShCpDG,IgCqD1B+a,EAAgBxL,EAAQwL,gBAAiB,EAG/C,OAAOld,EAAakC,IAAI,WAEpB,OA9CR,SAAyBnF,EAAeuH,EAA6BW,GACjE,IAAKlI,EACD,MAAM,IAAIiE,MAAM,iBAGpB,GAAIiE,GACsB,iBAAXA,IAAwBgE,MAAMC,QAAQjE,KAAYtB,GAAQsB,GACjE,MAAM,IAAIzC,UAAJ,mDAId,GAAIqE,EAAevC,GACf,MAAM,IAAItD,MAAM,2BAiChB8f,CAAgB/jB,EAAMuH,EAAKW,GA7BnC,SAAyBX,EAA6BW,EAAwB4b,EAA9EjI,GAAqL,IAA9E7B,EAA8E6B,EAA9E7B,KACnG,OAAO/W,EAAakC,IAAI,WACpB,OvCmpBD,SAAoBwC,EAAgCe,GAEvD,IAAIsb,EAAenZ,EAAYnC,GAE/B,GAAIsb,EACA,OAAIA,IAAiBrc,EAOzB,GAAIe,IAAUf,EACV,OAAO,EAGX,GAAI2B,EAAOZ,KAAWA,EAClB,OAAO,EAjBqF,QAAAub,EAAA,EAAAC,EAoB9Erb,EAAUlB,GApBoEsc,EAAAC,EAAAtiB,OAAAqiB,IAqB5F,GADUC,EAAAD,KACIvb,EACV,OAAO,EAIf,OAAO,EuC7qBCyb,CAAWjiB,OAAQqF,G7BoBxB,SAA0BA,EAA6BnC,EAAyBpF,QAA2F,IAApHoF,MAAmB,UAAiG,IAA3FpF,MAAgB,UACnG,IAAI6C,EAAUgX,GAAgBtS,GAM9B,OAJiB,IAAbnC,IACAvC,EAAUA,EAAQuC,QAAQA,EAAS,IAAInB,MAAUjE,EAAd,uBAA2CoF,EAA3C,QAGhCvC,E6B1BQuhB,CAAiB7c,EAAKuc,GACtBld,GAAQsB,GAER4R,GAASvS,EAAK,CAAEyS,SAEhB,CAAE9R,YAGd5F,KAAK,SAAAmU,GAGJ,OAHsCA,EAA/BvO,SAmBAmc,CAAgB9c,EAAKW,EAAQ4b,EAAc,CAAE9J,WACrD1X,KAAK,SAAAgiB,GAEJ,IAAKvY,EAAY7D,EAAQoc,GACrB,MAAM,IAAIrgB,MAAJ,UAAqBsI,GAAUrE,GAA/B,mBAA2DqE,GAAU+X,IAG/Epc,EAASoc,EAET,IAAMC,EAAWvkB,IAASqY,GAAaC,QAAU6B,GAA6B,iBAAdA,EAAKna,KAAyBma,EAAKna,KAAnF,KAA+FA,EAMzG6C,EAAU,IAAII,EACd+C,EAAWhG,EAAP,IAAiBmP,IAE3B,IAAKgR,EAAe,CAChB,IAAMqE,EAA0C,CAAExkB,OAAMuH,MAAKW,SAAQrF,YJ7C1E,SAA6BmD,EAAekc,GACrBnJ,GAAY,qBACpB3K,IAAIpI,EAAMkc,GI4CpBuC,CAAoBze,EAAMwe,GAE1B,IAAME,EAAcjL,GAAY,mBAAmB5K,SAAStH,EAAK,iBAAM,KACvEmd,EAAYpgB,KAAKzB,GAEjBA,EAAQkC,MAAM,YJzBnB,SAAqCiB,GACP+S,GAAY,4BACpB3K,IAAIpI,GAAM,GIwBvB2e,CAA4B3e,GAC5Bwb,GAAuBxb,KAG3B,IAAM4e,E5BhFX,SAAuBrd,GAE1B,OADqBkS,GAAY,gBACbnZ,IAAIiH,GAAK,G4B8EGsd,CAActd,GhCrFjB,IADN,IgCuFTud,EAAkBjB,EAEpBkB,EAAaH,EACbI,EAAaF,EAEXrS,EAAW1B,GAAa,WAC1B,OAAIjH,EAAevC,GACR1E,EAAQiB,OAAO,IAAIG,MAAJ,qBAAgCjE,EAAhC,YAAiDwkB,EAAiBjC,IAAM,WAAa,SAG3GiC,EAAiBS,UACVpiB,EAAQiB,OAAO,IAAIG,MAAJ,uCAAkDjE,KAG5E+kB,EAAajX,KAAKoX,IAAIH,EhClGH,IgCkGqC,IACpC,IAAhBC,IACAA,EAAalX,KAAKoX,IAAIF,EhCpGP,IgCoGyC,IAGvDR,EAAiBjC,KAAsB,IAAfwC,EAGH,IAAfC,EACAniB,EAAQiB,OAAO,IAAIG,MAAJ,+BAA0CsgB,EAA1C,OAA0Dtc,IAA1D,OAA8E6c,EAA9E,YADnB,EAFIjiB,EAAQiB,OAAO,IAAIG,MAAJ,0BAAqCsgB,EAArC,OAAqDtc,IAArD,OAAyE2c,EAAzE,ShCxGP,KgC+GvB/hB,EAAQoC,QAAQ,WACZwN,EAASnM,SACToe,EAAYne,OAAOme,EAAYrgB,QAAQxB,EAAS,MACjDkC,MAAMyL,IAWb,OARAiQ,GAAYlZ,EAAKW,EAAQ,CACrBuT,K/B3HG,4B+B4HHzV,OACAhG,OACAma,OACAgG,iBACD,CAAE9B,MAAIrE,SAEFmG,EAAgBtd,EAAQC,UAAYD,KE1H5C,SAASsc,GAAoBN,EAAmD3W,EAAwBmF,GAC3G,OAAO8X,GAAyBtG,EAAa3W,EAAQmF,EAAK,CAAEgR,MAAIrE,UAG7D,SAASwF,GAA8B3d,EAA8CoK,EAAiBhC,GACzG,OAAOmb,GAA2BvjB,EAAQoK,EAAQhC,EAAS,CAAEoU,MAAIrE,UAG9D,SAASmE,GAAc5W,GAC1B,OAAO4V,GAAYgB,cAAc5W,EAAK,CAAEyS,UChBrC,SAASnB,GAAUtR,GAEtB,QAFsE,IAAhDA,MAA+BrF,SAEhDkG,EAAab,GACd,MAAM,IAAItD,MAAJ,qDAOV,OAJKsD,EAAG,kBACJA,EAAG,gBAA4B,IAG5BA,EAAG,gBCNP,SAAS8d,GAAkBhY,GAC9B,MAAO,CACH/M,IADG,WACqB,IAAA6C,EAAA9D,KACpB,OAAO4D,EAAakC,IAAI,WACpB,GAAIhC,EAAKtB,QAAUsB,EAAKtB,SAAWK,OAC/B,MAAM,IAAI+B,MAAJ,yDAGV,OAAOoJ,MCZhB,IAAMiY,GAAI,OAEJC,GACWD,GAAZ,YADCC,GAEWD,GAAN,kBAGLE,GAAY,CACrBxK,OAAM,SACND,OAAM,SACNN,SAAQ,WACRS,QAAO,UACPD,OAAM,SACNH,MAAK,SAeI2K,GAAqB,CAC9BnZ,KAAS,OACToZ,OAAS,SACTC,OAAS,UAGAC,GAAU1e,EAEVD,GAAW,IAEX4e,GAAqB,CAC9BC,MAAQ,QACRC,OAAQ,SAGCC,GAAQ,CACjBC,OAAU,cACVC,SAAU,gBACVC,QAAU,eACVzL,MAAU,aACV0L,MAAU,aACVC,MAAU,aACVC,OAAU,eC7CP,SAASC,GAAyBC,EAA0BnT,EAAwBrS,EAAcN,EAAW+lB,GAGhH,IAAMC,EAAoCF,EAAUG,kBAAkB3lB,GAEtE,OAAK0lB,GAI6B,mBAAvBA,EAAKE,cACLF,EAAKE,cAALplB,EAAA,CAAqBd,SAAU+lB,IAJ/B/lB,ECRf,SAASmmB,GAAqBnK,GAC1B,OAAOrM,EAAcwW,GAAsB,WACvC,IAAKnK,EACD,MAAM,IAAIzY,MAAJ,kBAFmC,IAAA6iB,EAKApK,EAAW9P,MAAM,MAApDma,EALmCD,EAAA,GAKzB9mB,EALyB8mB,EAAA,GAKnBE,EALmBF,EAAA,GAO7C,GAAIC,IAAazB,GACb,MAAM,IAAIrhB,MAAJ,qCAAgD8iB,GAG1D,IAAK/mB,EACD,MAAM,IAAIiE,MAAJ,2BAGV,IAAK+iB,EACD,MAAM,IAAI/iB,MAAJ,4BAGV,IACI,OAAOqI,KAAKqT,M3CVjB,SAAsB5Q,GACzB,GAAsB,oBAAX7M,QAAiD,mBAAhBA,OAAO+kB,KAC/C,OAAO/kB,OAAO+kB,KAAKlY,GAGvB,GAAsB,oBAAXE,OACP,OAAOA,OAAOC,KAAKH,EAAK,UAAU1M,SAAS,QAG/C,MAAM,IAAI4B,MAAJ,sC2CCoBijB,CAAaF,IACjC,MAAOzkB,GACL,MAAM,IAAI0B,MAAJ,uCAAkD+iB,EAAlD,KAAuErW,GAAepO,MAEjG,CAAEma,IAGF,SAASyK,KACZ,IACI,OAAON,GAAqB3kB,OAAOlC,MACrC,MAAOuC,KCQN,IAAM6kB,GAAb,WAYI,SAAAA,EAAYZ,GAA0B,IAAArjB,EAAA9D,UAVtCmnB,eAUsC,EAAAnnB,KATtCgU,WASsC,EAAAhU,KARtCmH,aAQsC,EAAAnH,KAPtCsI,YAOsC,EAAAtI,KANtCgoB,kBAMsC,EAAAhoB,KALtCioB,2BAKsC,EAAAjoB,KAHtCkoB,oBAGsC,EAAAloB,KAFtCmoB,gBAEsC,EAClCvkB,EAAakC,IAAI,WACbhC,EAAKqjB,UAAYA,EACjBrjB,EAAKokB,eAAiB,GAEtB,IAAME,EAAeN,KAErB,IAAKM,EACD,MAAM,IAAIxjB,MAAJ,0BAGmByjB,WAAzBD,EAAaE,SAIbC,QAAQC,IAHC,kCAAsCJ,EAAaE,QAAnD,qCAXM,IAiBXhgB,EAA4C8f,EAA5C9f,OAAQO,EAAoCuf,EAApCvf,OAAQlJ,EAA4ByoB,EAA5BzoB,QAAkBqU,EAAUoU,EAAVpU,MAE1ClQ,EAAKqD,QAF+CihB,EAAnBjhB,QAGjCrD,EAAKmkB,sBAAwBnkB,EAAK2kB,yBAAyBngB,GAC3DxE,EAAKkkB,aAAenf,EACpB/E,EAAKwE,OAAS6X,GAAmBrc,EAAKmkB,sBAAuBpf,EAAQlJ,GAErEmE,EAAK4kB,kBAAkB7f,GAEvB,IAAM8f,EAAe7kB,EAAK8kB,cAAc9kB,EAAKmkB,sBAAuBpf,EAAQmL,GAM5E,OALAlQ,EAAK+kB,SAASF,EAAc9f,GAC5BqS,GAAgBpX,EAAKmkB,uBAErBnkB,EAAKglB,gBAEEhlB,EAAKwE,OAAOygB,KAAKjlB,EAAKklB,kBAE9B/lB,KAAK,WACJ,OAAOa,EAAKmlB,mBAEbvjB,MAAM,SAAAxC,GACLY,EAAK2B,QAAQvC,KAnDzB,IAAAwB,EAAAqjB,EAAApjB,UAAA,OAAAD,EAuDIwkB,WAAA,WAA+B,IAAApkB,EAAA9E,KAC3B,MAAO,CACHwd,MAAiB,kBAAM1Y,EAAK0Y,SAC5BF,MAAiB,kBAAMxY,EAAKwY,SAC5B6L,OAAiB,SAAA3M,GAAA,OAAuB1X,EAAKqkB,OAAO,CAAE7R,MAArCkF,EAAGlF,MAAyCE,OAA5CgF,EAAUhF,UAC3B/R,QAAiB,SAACvC,GAAD,OAAS4B,EAAKW,QAAQvC,IACvCkmB,QAAiB,SAACvlB,GAAD,OAAaiB,EAAKskB,QAAQvlB,IAC3CwE,UAAiB,kBAAMvD,EAAKmjB,uBAC5BoB,gBAAiB,kBAAMvkB,EAAKkjB,gBA/DxCtjB,EAmEIgkB,kBAAA,SAAkB7f,GACd,IAAK6D,EAAY1M,KAAKmnB,UAAUmC,qBAAsBzgB,GAClD,MAAM,IAAIjE,MAAJ,kCAA6CiE,IArE/DnE,EAyEI0kB,QAAA,SAAQvlB,GACJ7D,KAAKkoB,eAAejjB,KAAKpB,IA1EjCa,EA6EIkkB,cAAA,SAAcX,EAA+Cpf,EAA7DuO,GAA+H,IACvHpD,EADwEoI,EAA+ChF,EAA/CgF,KAAa5L,EAAkC4G,EAAlC5G,IAGzF,GHzGC,QGyGG4L,EACApI,EAJuHoD,EAAzC/V,WAK3E,GH1GN,QG0GU+a,EAA4B,CACnC,IAAKrT,EAAakf,GACd,MAAM,IAAIrjB,MAAJ,+DAA0EgE,IAA1E,6BAGV,IAAMsR,EAASV,GAAUyO,GACzBjU,EAAQpB,GAAa,QAASsH,GAAUA,EAAOlG,MAAMxD,IAGzD,IAAKwD,EACD,MAAM,IAAIpP,MAAJ,wBAGV,OAAOub,GAAmB8H,EAAuBpf,EAAQmL,IA/FjEtP,EAkGI+jB,yBAAA,SAAyBc,GAAyC,I/CsnBlCrhB,EAA6BrG,E+CrnBjDua,EAASmN,EAATnN,KAER,GHzHE,WGyHEA,EACA,OAAOxJ,GAAa,SAAUrK,EAAU1F,SAErC,GH1HL,WG0HSuZ,EAGP,OAAOxJ,GAAa,U/C6mBI1K,E+C7mB0BrF,Y/C6mB4C,KAAzChB,E+C9mBpC0nB,EAAIvd,Y/C8mBgCnK,EAAa,GAdvE,SAAsBqG,EAA6BrG,QAAyC,IAAzCA,MAAa,GAGnE,IAFA,IAAIyG,EAASJ,EAEJ9H,EAAI,EAAGA,EAAIyB,EAAGzB,IAAK,CACxB,IAAKkI,EACD,OAGJA,EAASD,EAAUC,GAGvB,OAAOA,EAIAkhB,CAAathB,EAAK6D,EAAmB7D,GAAOrG,K+C5mBxC,GH9HL,WG8HSua,EAAmC,KAElC5L,EAAQ+Y,EAAR/Y,IACFiZ,EAAWje,EAAY3I,QAE7B,IAAK4mB,EACD,MAAM,IAAI7kB,MAAJ,gCANgC,QAAA8O,EAAA,EAAAgW,EAStBrf,EAAqBof,GATC/V,EAAAgW,EAAAnnB,OAAAmR,IASU,CAA/C,IAAM/J,EAAK+f,EAAAhW,GACZ,GAAI3K,EAAaY,GAAQ,CACrB,IAAMuQ,EAASV,GAAU7P,GAEzB,GAAIuQ,GAAUA,EAAOyP,SAAWzP,EAAOyP,QAAQnZ,GAC3C,OAAO0J,EAAOyP,QAAQnZ,KAMtC,MAAM,IAAI5L,MAAJ,kBAA6BwX,EAA7B,6BAjId1X,EAoIIklB,SAAA,WAGI,OADA5pB,KAAKgU,MAAQhU,KAAKgU,OAAS,GACpBhU,KAAKgU,OAvIpBtP,EA2IImkB,SAAA,SAAS7U,EAAsBpH,EAAiBid,QAA4B,IAA5BA,OAAqB,GACjE,IAAMzC,EAAUpnB,KAAKkpB,aACfY,EAAgB9pB,KAAK4pB,WAG3BnY,GAAOqY,EFpKR,SAAgC7B,EAA+Cd,EAA0BnT,EAAwBpH,EAAiBwa,EAA2ByC,QAA6C,IAA7CA,OAAqB,GAAwB,IAE7N,IAAMvlB,EAAS,GAF8MoP,EAAA,EAAAqC,EAK3MjV,OAAO8F,KAAKoN,GAL+LN,EAAAqC,EAAAxT,OAAAmR,IAKvL,CAAjC,IAAM/R,EAAGoU,EAAArC,GACJ2T,EAAOF,EAAUG,kBAAkB3lB,GAEzC,IAAI0lB,IAAQA,EAAK0C,YAAend,IAAWhE,EAAU/F,SAAYkG,EAAakf,GAA9E,CAIA,IAAM5mB,EAAQ6lB,GAAmBC,EAAWnT,EAAOrS,EAAKqS,EAAMrS,GAAMylB,GAEpE9iB,EAAO3C,GAAON,EACVgmB,GAAQA,EAAK2C,QAAU1lB,EAAO+iB,EAAK2C,SACnC1lB,EAAO+iB,EAAK2C,OAAS3oB,IAI7B,IAAKwoB,EAAU,QAAAtH,EAAA,EAAA0H,EACO9C,EAAU+C,eADjB3H,EAAA0H,EAAA1nB,OAAAggB,IACiC,CAAvC,IAAM5gB,EAAGsoB,EAAA1H,GACLvO,EAAMhS,eAAeL,KACtB2C,EAAO3C,GAAOulB,GAAmBC,EAAWnT,EAAOrS,EAAKqS,EAAMrS,GAAMylB,IAMhF,OAAO9iB,EEqIqB6lB,CAAoBnqB,KAAKioB,sBAAuBjoB,KAAKmnB,UAAWnT,EAAOpH,EAAQwa,EAASyC,IAHxC,QAAAtH,EAAA,EAAA6H,EAOlDpqB,KAAKkoB,eAP6C3F,EAAA6H,EAAA7nB,OAAAggB,IAOtD6H,EAAA7H,GACNhiB,KAAKP,KAAM8pB,IAnJ/BplB,EAuJIokB,cAAA,WAAgB,IAAAzjB,EAAArF,KACZ6C,OAAOmS,iBAAiB,eAAgB,WACpC3P,EAAKiD,OAAO+hB,WAAWvJ,kBAG3Bje,OAAOmS,iBAAiB,SAAU,WAC9B3P,EAAKiD,OAAO+hB,WAAWvJ,kBAG3BpT,EAAc1N,KAAKioB,sBAAuB,WACtC5iB,EAAKilB,aAjKjB5lB,EAqKI6lB,cAAA,WAAgF,IAAA7P,EAClB1a,KAAKmoB,YAAcnoB,KAAKmnB,UAAUgB,YAAc,GAD9BqC,EAAA9P,EACtEpD,MADsEmT,EAAA/P,EACvDlD,OADuDkT,EAAAhQ,EACvCrG,eADuC,IAAAqW,EAC7B,OAD6BA,EAG5E,MAAO,CAAEpT,WAHmE,IAAAkT,KAG5DhT,YAH4D,IAAAiT,KAGpDpW,QADxBA,EAAUI,GAAeJ,KAvKjC3P,EA2KIukB,eAAA,WAAuC,IAAAhjB,EAAAjG,KACnC,O3CnKGmT,KAAuBlQ,KAAK,WAC/B,GAAI8P,SAASC,KACT,OAAOD,SAASC,KAGpB,MAAM,IAAIpO,MAAM,kD2C8Ja3B,KAAK,WAAM,IAAA0nB,EACD1kB,EAAKskB,gBAAhCjT,EAD4BqT,EAC5BrT,MAAOE,EADqBmT,EACrBnT,OAAQnD,EADasW,EACbtW,QAElBA,IAAaiD,GAAUE,IAAWvR,EAAKkB,UAAYof,GAAQxe,OAIhEmP,GAAS7C,EAAS,SAAAwG,GACd5U,EAAKkjB,OAAO,CACR7R,MAAQA,EAF8CuD,EAAzCvD,WAEc3R,EAC3B6R,OAAQA,EAH8CqD,EAAxBrD,YAGD7R,KAElC,CAAE2R,QAAOE,cAxLxB9S,EA4LIskB,aAAA,WAEI,IAAMjpB,EAAOC,KAEb,MAAO,CACH4qB,YADG,SACS5W,GAA6C,IAAA2K,EAAA3e,KACrD,OAAO4D,EAAakC,IAAI,kBAAM/F,EAAK8oB,SAAS7U,EAAO2K,EAAKoC,YAAY,MAGxEzD,MALG,WAMC,OAAO1Z,EAAakC,IAAI,kBAAM/F,EAAKuqB,eAtMnD5lB,EA2MIykB,OAAA,SAAAnO,GACI,OAAOhb,KAAKsI,OAAO6gB,OAAOrI,cAAc,CAAExJ,MADyC0D,EAA9E1D,MAC4CE,OADkCwD,EAAvExD,UA3MpB9S,EA+MI4Y,MAAA,WACI,OAAOtd,KAAKsI,OAAOgV,SAhN3B5Y,EAmNI4lB,QAAA,WACI,OAAO1mB,EAAakC,IAAI,WACpBjD,OAAOya,WArNnB5Y,EAyNI8Y,MAAA,WACI,OAAO5Z,EAAakC,IAAI,WACpBjD,OAAO2a,WA3NnB9Y,EA+NIe,QAAA,SAAQvC,GAAkC,IAAA2nB,EAAA7qB,KACtC,OAAO4D,EAAakC,IAAI,WACpB,GAAI+kB,EAAKviB,QAAUuiB,EAAKviB,OAAO7C,QAC3B,OAAOolB,EAAKviB,OAAO7C,QAAQvC,GAE3B,MAAMA,KApOtB6kB,EAAA,GCxBa+C,GAAoD,GCoFjE,SAASC,GAAoB1D,EAAmC1lB,EAAcN,GAC1E,OAAOuC,EAAakC,IAAI,WACpB,MAA+B,mBAApBuhB,EAAK2D,WACL3D,EAAK2D,WAAW,CAAE3pB,UACS,iBAApBgmB,EAAK2D,WACZ3D,EAAK2D,WAELrpB,IAMnB,SAASspB,GAAoB5D,EAAmC1lB,EAAcN,GAC1E,OAAOuC,EAAakC,IAAI,WACpB,MAA+B,mBAApBuhB,EAAK6D,YAA6B7Y,GAAUhR,GAC5CgmB,EAAK6D,WAAW,CAAE7pB,UAElBA,IDpGnBypB,GAAevE,GAAQze,QAAU,CAC7BqjB,aAAa,EAEbC,UAH6B,WAIzB,OAAOpF,GAAe3Q,GAAO,CACzBQ,WAAY1T,EAAA,CACRkpB,MAAOrrB,KAAKmnB,UAAUxmB,MACnBX,KAAKmnB,UAAUtR,WAAWR,YAKzCkJ,KAZ6B,SAYxB+M,GAA0E,IAAAxnB,EAAA9D,KAC3E,IAAKsrB,EACD,MAAM,IAAI1mB,MAAJ,qCAGV,OAAO0mB,EAAWrqB,MAAMgC,KAAK,SAAA0G,GACzB,OAAOwL,GAAiBxL,GAAO1G,KAAK,SAAAiF,GAEhC,I5CyyBqBmM,EAAuBxQ,EAGpDuP,E4C5yBcmY,G5CyyBelX,E4CzyBqB1K,E5C0yBtD9F,EAAUuN,GAD8CvN,E4CzyBK,kBAAMC,EAAKwZ,U5C8yBpErG,GAAgB5C,GAChBxQ,IAEAuP,EAAW1B,GAAa,WAChBuF,GAAgB5C,KAChBjB,EAASnM,SACTpD,MAEL,IAGA,CACHoD,OADG,WAEKmM,GACAA,EAASnM,Y4CvzBT,OAJAnD,EAAK0nB,MAAM/Y,SAAS,kBAAM8Y,EAAatkB,WACvCnD,EAAK0nB,MAAM/Y,SAAS,kBAAMsE,GAAepN,KACzC7F,EAAK0nB,MAAM/Y,SAAS,kBExC7B,SAAuBvK,GAA6B,IACvD,IADuDwL,EAAA,EAAA+X,EAC/BrR,GAAY,mBACEnZ,IAAIiH,EAAK,IAFQwL,EAAA+X,EAAAlpB,OAAAmR,IAErC+X,EAAA/X,GACNjP,OAAO,IAAIG,MAAJ,sCAAgDc,MAAMyL,IFqCnCua,CAAcxjB,KAEjC4W,GAAc5W,QAKjCyjB,mBA9B6B,WA+BzB,OAAO3F,GAAe3Q,GAAO,CACzBQ,WAAY1T,EAAA,CACRxB,KAAI,2BAA+BX,KAAKmnB,UAAUxmB,KAA9C,IAAwDmP,IAAxD,KACJub,MAAK,cAAiBrrB,KAAKmnB,UAAUxmB,MAClCX,KAAKmnB,UAAUtR,WAAWR,YAKzCuW,cAxC6B,SAwCfC,EAAwBC,GAAmF,IAAAhnB,EAAA9E,KACrH,IAAK8rB,EACD,MAAM,IAAIlnB,MAAJ,qCAGV,OAAOknB,EAAoB7qB,MAAMgC,KAAK,SAAA8oB,GAGlC,OAFAjnB,EAAK0mB,MAAM/Y,SAAS,kBAAMsE,GAAegV,KAElC5W,GAAiB4W,GAAgB9oB,KAAK,SAAA+oB,GACzC,OAAO7iB,EAAiB6iB,KACzB/oB,KAAK,SAAAiF,GACJ,OAAO4W,GAAc5W,QAKjC+jB,SAAU,CACN,oBACA,kBACA,YACA,qBACA,YACA,OACA,kBGTD,IAAMC,GAAb,WAgBI,SAAAA,EAAY/E,EAA0BnT,GAA2B,IAAAlQ,EAAA9D,UAdjEmnB,eAciE,EAAAnnB,KAbjEmsB,YAaiE,EAAAnsB,KAZjEwrB,WAYiE,EAAAxrB,KAXjE6W,WAWiE,EAAA7W,KATjEosB,iBASiE,EAAApsB,KARjEqsB,mBAQiE,EAAArsB,KANjEgU,WAMiE,EAAAhU,KALjEssB,WAKiE,EAAAtsB,KAJjEqJ,WAIiE,EAAArJ,KAFjE6rB,cAEiE,EAC7D7rB,KAAKosB,YAAc,IAAIxoB,EACvB5D,KAAKqsB,cAAgB,GAGrBrsB,KAAKgU,MAAQ,GAEbhU,KAAKwrB,MAAQlZ,GAAQtS,MACrBA,KAAKssB,MAAQ,GAEbtsB,KAAKmnB,UAAYA,EAEjBnnB,KAAKusB,YAAYvY,EAAMvO,SACvBzF,KAAK6oB,SAAS7U,GACdhU,KAAKmnB,UAAUqF,wBAAwBxsB,MACvCA,KAAKwrB,MAAM/Y,SAAS,kBAAM3O,EAAKqjB,UAAUsF,uBAAuB3oB,KAChE9D,KAAK0sB,iBAhCb,IAAAhoB,EAAAwnB,EAAAvnB,UAAA,OAAAD,EAmCI6nB,YAAA,SAAY9mB,GAA4B,IhDwcpCknB,EACAxoB,EgDzcoCW,EAAA9E,KACpCA,KAAK6W,OhDucL8V,EAAY,GACZxoB,EAAW,GAER,CAEH6a,GAFG,SAEA4N,EAAoB/oB,GACnB,IAAIgpB,EAAc1oB,EAASyoB,GAAazoB,EAASyoB,IAAc,GAE/DC,EAAY5nB,KAAKpB,GAEjB,IAAI+hB,GAAY,EAEhB,MAAO,CACH3e,OADG,WAEM2e,IACDA,GAAY,EACZiH,EAAY3lB,OAAO2lB,EAAY7nB,QAAQnB,GAAU,OAOjEuN,KApBG,SAoBEwb,EAAoB/oB,GAErB,IAAIgf,EAAW7iB,KAAKgf,GAAG4N,EAAW,WAC9B/J,EAAS5b,SACTpD,MAGJ,OAAOgf,GAGXiK,QA9BG,SA8BKF,GAA0E,QAAAG,EAAAzqB,UAAAC,OAAnD6E,EAAmD,IAAAyF,MAAAkgB,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAnD5lB,EAAmD4lB,EAAA,GAAA1qB,UAAA0qB,GAE9E,IAAIH,EAAc1oB,EAASyoB,GACvBtmB,EAAW,GAEf,GAAIumB,EAAa,QAAAvnB,EAAA,SAAAoO,GACR,IAAI7P,EAAWgpB,EAAJnZ,GACZpN,EAASrB,KAAKrB,EAAakC,IAAI,kBAAMjC,EAAOpB,WAAP,EAAW2E,OAFvCsM,EAAA,EAAAA,EACOmZ,EADPtqB,OAAAmR,IACoBpO,EAAAoO,GAKrC,OAAO9P,EAAayC,IAAIC,GAAUrD,KAAKkO,KAG3C8b,YA5CG,SA4CSL,GAER,GAAID,EAAUC,GACV,OAAOhpB,EAAaH,UAGxBkpB,EAAUC,IAAa,EAN2D,QAAAM,EAAA5qB,UAAAC,OAAnD6E,EAAmD,IAAAyF,MAAAqgB,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAnD/lB,EAAmD+lB,EAAA,GAAA7qB,UAAA6qB,GAOlF,OAAOntB,KAAK8sB,QAALrqB,MAAAzC,KAAA,CAAa4sB,GAAbtiB,OAA2BlD,OgD3ftCpH,KAAK6W,MAAMmI,GAAG2H,GAAMC,OAAU,kBAAM9hB,EAAKkP,MAAMoZ,aAC/CptB,KAAK6W,MAAMmI,GAAG2H,GAAMG,QAAU,kBAAMhiB,EAAKkP,MAAMqZ,cAC/CrtB,KAAK6W,MAAMmI,GAAG2H,GAAME,SAAU,kBAAM/hB,EAAKkP,MAAMsZ,eAC/CttB,KAAK6W,MAAMmI,GAAG2H,GAAMI,MAAU,kBAAMjiB,EAAKkP,MAAMuZ,YAC/CvtB,KAAK6W,MAAMmI,GAAG2H,GAAMK,MAAU,SAAChT,GAAD,OAAWlP,EAAKkP,MAAMoV,QAAQpV,KAE5DhU,KAAK6W,MAAMmI,GAAG2H,GAAMtL,MAAO,SAAAnY,GACvB,OAAI4B,EAAKkP,OAASlP,EAAKkP,MAAMvO,QAClBX,EAAKkP,MAAMvO,QAAQvC,GACnBuC,EACAA,EAAQvC,GAER4B,EAAKsnB,YAAY3nB,OAAOvB,GAAKD,KAAK,WACrC8B,WAAW,WACP,MAAM7B,GACP,QArDvBwB,EA2DI8oB,OAAA,SAAOnrB,EAAgC8R,EAAkChN,GAAwD,IAAA9B,EAAArF,KAC7H,OAAO4D,EAAakC,IAAI,WACpBT,EAAK8hB,UAAUqB,IAAf,UAEAnjB,EAAK8mB,OAASrB,GAAe3jB,GAC7B,IAAMqJ,EAAUyV,GAAP,IAAiB5gB,EAAK8hB,UAAU5R,IAAhC,IAAyCzF,IAC5CjH,EAASxD,EAAKuD,YACd6kB,EAAgBpoB,EAAKqoB,mBAE3BroB,EAAK8hB,UAAUwG,iBAAiBtrB,EAAQwG,EAAQsL,GAE5C9R,IAAWQ,QACXwC,EAAK4mB,SAAS9kB,EAAS9E,GAG3B,IAAMkQ,EAAQ,GAkEd,OAhEAA,EAAMwW,KAAO1jB,EAAK+mB,YAClB7Z,EAAMqb,SAAWvoB,EAAKuoB,WACtBrb,EAAM6a,SAAW/nB,EAAKwR,MAAMiW,QAAQnG,GAAMC,QAE1CrU,EAAMsb,kBAAoBxoB,EAAKwoB,kBAAkB1Z,GAEjD5B,EAAM6Y,UAAY/lB,EAAK+lB,YACvB7Y,EAAMoZ,mBAAqBtmB,EAAKsmB,qBAEhCpZ,EAAMub,gBAAkBlqB,EAAayC,IAAI,CAAEkM,EAAMsb,kBAAmBtb,EAAM6Y,UAAW7Y,EAAMoZ,qBAAsB1oB,KAAK,SAAAuZ,GAClH,OAAOnX,EAAKyoB,gBAD+JtR,EAAA,GAC/H,CAAErV,UAASqJ,MAAK8a,WAD+G9O,EAAA,GACnGsP,oBADmGtP,EAAA,OAI/KjK,EAAMgM,KAAOlZ,EAAK8mB,OAAOhB,YACnB9lB,EAAKkZ,OACLhM,EAAM6Y,UAAUnoB,KAAK,SAAAqoB,GAAU,OAAIjmB,EAAKkZ,KAAK+M,KAEnD/Y,EAAMqZ,cAAgBhoB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAMoZ,qBAAsB1oB,KAAK,SAAAmU,GAClF,OAAO/R,EAAKumB,cAD6GxU,EAAA,GAAAA,EAAA,MAI7H7E,EAAMwb,SAAWnqB,EAAayC,IAAI,CAC9BkM,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAEZ,OADAxmB,EAAKwmB,SAAWA,EACTxmB,EAAK2oB,YAAYnC,OAIhCtZ,EAAM0b,UAAYrqB,EAAayC,IAAI,CAAEkM,EAAMqZ,cAAerZ,EAAMwb,WAAY9qB,KAAK,SAAAyX,GAC7E,OAAOrV,EAAK4oB,UAD4FvT,EAAA,GAC/D,CAAEvT,UAASqJ,UAGxD+B,EAAM2b,QAAUtqB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAMqb,SAAUrb,EAAM4b,cAAe5b,EAAM0b,YAAahrB,KAAK,SAAA4X,GACxG,OAD+HA,EAAA,GAC/G6C,YAD+G7C,EAAA,MAInItI,EAAM6b,gBAAkB7b,EAAMgM,KAAKtb,KAAK,SAAA4oB,GACpC,OAAOxmB,EAAK+oB,gBAAgB,CAAEvC,WAAU4B,gBAAe5kB,SAAQxG,SAAQ8E,UAASqJ,UAGpF+B,EAAM4b,cAAiBvqB,EAAayC,IAAI,CAAEkM,EAAMgM,KAAMhM,EAAM6b,kBAAmBnrB,KAAK,SAAA+X,GAChF,OAD8GA,EAAA,GAC9F4C,QAD8F5C,EAAA,MAIlHzI,EAAMuW,cAAgBvW,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAClCxmB,EAAKyjB,cAAc+C,KAGvBtZ,EAAM8a,UAAYzpB,EAAayC,IAAI,CAAEkM,EAAMub,gBAAiBvb,EAAM0b,YAAahrB,KAAK,WAChF,OAAOoC,EAAKwR,MAAMiW,QAAQnG,GAAMG,WAGpCvU,EAAM8b,WAAa9b,EAAMgM,KAAKtb,KAAK,SAAA4oB,GAC/B,OAAOxmB,EAAKgpB,WAAWxC,EAAU4B,EAAetmB,KAGpDoL,EAAM+b,WAAa/b,EAAM2b,QAAQjrB,KAAK,WAClC,OAAOoC,EAAKipB,eAGhB/b,EAAM6a,SAAW7a,EAAMwW,KAAK9lB,KAAK,WAC7B,OAAOoC,EAAKwR,MAAMiW,QAAQnG,GAAME,YAG7BjjB,EAAa+C,KAAK4L,KAE1B7M,MAAM,SAAAxC,GACL,OAAOU,EAAayC,IAAI,CACpBhB,EAAKI,QAAQvC,GACbmC,EAAKilB,QAAQpnB,KACdD,KAAK,WACJ,MAAMC,MAEXD,KAAKkO,KArJhBzM,EAwJImpB,kBAAA,SAAkB1Z,GACd,OAAOvQ,EAAakC,IAAI,WACpB,OAAO8O,GAAaT,KACrBlR,KAAK,SAAAsrB,GACJ,OAAOvI,GAAeuI,MA5JlC7pB,EAgKI0pB,gBAAA,SAAAnT,GAAoP,IAC1OmN,EAAepoB,KAAKwuB,kBAAkB,CAAE3C,SADkM5Q,EAAlO4Q,SAC0C4B,cADwLxS,EAAxNwS,cAC+C5kB,OADyKoS,EAAzMpS,OACwCxG,OADiK4Y,EAAjM5Y,OACwC8E,QADyJ8T,EAApL9T,QACoCqJ,IADgJyK,EAAzLzK,MAEvD,WAAayV,GAAb,KAAwBjmB,KAAKmnB,UAAUxmB,KAAvC,KAAkD8O,EAAaxC,KAAKC,UAAUkb,IAA9E,MAlKR1jB,EAqKI+pB,YAAA,SAAY5C,EAAwB4B,EAAwB5kB,EAA0B2H,GAClF,IAAMnP,EAAQye,GAAiB+L,EAAUhjB,EAAQ7I,KAAK0uB,iBAAiB7lB,IAEjE8lB,EAAWlB,IAAkB7kB,IAC7B,CAAEwT,KPjOP,MOiOgC5L,OAC3B,CAAE4L,KPnOP,MOmOgC/a,SAEjC,GPpOC,QOoOGstB,EAAQvS,KAA4B,CACpC,IAAMlC,EAASV,GAAU3W,QACzBqX,EAAOlG,MAAQkG,EAAOlG,OAAS,GAC/BkG,EAAOlG,MAAMxD,GAAOnP,EAEpBrB,KAAKwrB,MAAM/Y,SAAS,kBACTyH,EAAOlG,MAAMxD,KAI5B,OAAOme,GAtLfjqB,EAyLI8pB,kBAAA,SAAArX,GAA0Q,IAAAyX,OAAA,IAAAzX,EAAnB,GAAmBA,EAAtP0U,EAAsP+C,EAAtP/C,SAAU4B,EAA4OmB,EAA5OnB,cAAe5kB,EAA6N+lB,EAA7N/lB,OAA6NgmB,EAAAD,EAArNvsB,cAAqN,IAAAwsB,EAA5MhsB,OAA4MgsB,EAApM1nB,EAAoMynB,EAApMznB,QAASqJ,EAA2Loe,EAA3Lpe,IAC3E,MAAO,CACHA,MACArJ,UACAmhB,QAASD,SACTxf,OAASD,EAAU/F,QACnB0S,IAASvV,KAAKmnB,UAAU5R,IACxBjN,OAAStI,KAAK8uB,aAAazsB,EAAQorB,EAAejd,EAAKrJ,GACvD6M,MAAShU,KAAKyuB,YAAY5C,EAAU4B,EAAe5kB,EAAQ2H,GAC3D7Q,QAASmgB,GAAiB+L,EAAUhjB,EAAQ7I,KAAK+uB,mBAAmBlD,MAlMhFnnB,EAsMIspB,YAAA,SAAYnC,GAA6C,IAAA5lB,EAAAjG,KACrD,OAAO4D,EAAakC,IAAI,WACpBG,EAAK4lB,SAAWA,KAxM5BnnB,EA4MIwkB,WAAA,WAAgC,IAAAvK,EAAA3e,KAC5B,MAAO,CACHssB,MAAatsB,KAAKssB,MAClBzV,MAAa7W,KAAK6W,MAClByG,MAAa,kBAAMqB,EAAKrB,SACxBE,MAAa,kBAAMmB,EAAKnB,SACxB2L,OAAa,SAAAjI,GAAA,OAAuBvC,EAAKwK,OAAO,CAAE7R,MAArC4J,EAAG5J,MAAyCE,OAA5C0J,EAAU1J,UACvB/R,QAAa,SAACvC,GAAD,OAASyb,EAAKlZ,QAAQvC,IACnC0nB,YAAa,SAAC5W,GAAD,OAAW2K,EAAKiM,YAAY5W,MApNrDtP,EAwNImkB,SAAA,SAAS7U,EAA2B6V,QAA4B,IAA5BA,OAAqB,GACjD7pB,KAAKmnB,UAAU6H,UACfhvB,KAAKmnB,UAAU6H,SAAS,CAAEhb,UAG9B,IAAMoT,EAAUpnB,KAAKkpB,cF1RtB,SAAwB/B,EAA0BnT,EAAsBib,EAAgC7H,EAA4ByC,QAA4B,IAA5BA,OAAqB,GAI5JpY,GAAOuC,EADPib,EAAaA,GAAc,IAHwI,IAMnK,IAAMC,EAAYrF,EAAW,GAAH,GAAAvf,OAAa6c,EAAU+C,gBANkHxW,EAAA,EAAAqC,EASjJjV,OAAO8F,KAAKqoB,GATqIvb,EAAAqC,EAAAxT,OAAAmR,IASxH,CAAtC,IAAM/R,EAAGoU,EAAArC,IACsB,IAA5Bwb,EAAUlqB,QAAQrD,IAClButB,EAAUjqB,KAAKtD,GAX4I,IAenK,IAAMwtB,EAAU,GAER7C,EAAiClF,EAAjCkF,MAAOhP,EAA0B8J,EAA1B9J,MAAOE,EAAmB4J,EAAnB5J,MAAO/X,EAAY2hB,EAAZ3hB,QAjBsI8c,EAAA,EAAAA,EAmBjJ2M,EAnBiJ3sB,OAAAggB,IAmBtI,CAAxB,IAAM5gB,EAAOutB,EAAJ3M,GACJ6M,EAAUjI,EAAUG,kBAAkB3lB,GAExCN,EAAQ4tB,EAAWttB,GAEvB,GAAKytB,EAAL,CAIA,IAAMpF,EAAQoF,EAAQpF,MAgBtB,GAfIA,KACK3X,GAAUhR,IAAUgR,GAAU4c,EAAWjF,MAC1C3oB,EAAQ4tB,EAAWjF,IAEvBmF,EAAQlqB,KAAK+kB,IAGboF,EAAQ/tB,QACRA,EAAQ+tB,EAAQ/tB,MAAM,CAAE2S,QAAOsY,QAAOhP,QAAOE,QAAO/X,cAGnD4M,GAAUhR,IAAU+tB,EAAQC,UAC7BhuB,EAAQ+tB,EAAQC,QAAQ,CAAErb,QAAOsY,QAAOhP,QAAOE,QAAO/X,aAGtD4M,GAAUhR,KACW,UAAjB+tB,EAAQhT,MAAoBvP,MAAMC,QAAQzL,UAAiBA,IAAU+tB,EAAQhT,MAC7E,MAAM,IAAIhW,UAAJ,uBAAsCgpB,EAAQhT,KAA9C,KAAyDza,GAKvEqS,EAAMrS,GAAON,GAnDkJ,QAAAyU,EAAA,EAAAA,EAsD/IqZ,EAtD+I5sB,OAAAuT,WAwDxJ9B,EAFSmb,EAAJrZ,IAtDmJ,QAAA8N,EAAA,EAAA0L,EA4DjJxuB,OAAO8F,KAAKoN,GA5DqI4P,EAAA0L,EAAA/sB,OAAAqhB,IA4D7H,CAAjC,IAAMjiB,EAAG2tB,EAAA1L,GACJwL,EAAUjI,EAAUG,kBAAkB3lB,GAEtCN,EAAQ2S,EAAMrS,GAEfytB,IAID/c,GAAUhR,IAAU+tB,EAAQJ,UAE5BI,EAAQJ,SAAS,CAAE3tB,QAAO2S,UAG1B3B,GAAUhR,IAAU+tB,EAAQG,WAE5Bvb,EAAMrS,GAAOytB,EAAQG,SAAS,CAAEluB,QAAO2S,QAAOsY,QAAOhP,QAAOE,QAAO/X,cA5EwF,QAAAqe,EAAA,EAAAmG,EAgFjJ9C,EAAU+C,eAhFuIpG,EAAAmG,EAAA1nB,OAAAuhB,IAgFvH,CAAvC,IAAMniB,EAAGsoB,EAAAnG,GAEV,IAAyB,IADTqD,EAAUG,kBAAkB3lB,GAChC6tB,WAAuBnd,GAAU2B,EAAMrS,IAC/C,MAAM,IAAIiD,MAAJ,kBAA6BjD,EAA7B,oBEwMV8tB,CAAYzvB,KAAKmnB,UAAWnnB,KAAKgU,MAAOA,EAAOoT,EAASyC,IA9NhEnlB,EAiOIkpB,SAAA,WAAkC,IF9KN8B,EAA0C1b,EAEhEP,EE4K4BoX,EAAA7qB,KAC9B,OF/KwB0vB,EE+KJvtB,EAAA,GAAKnC,KAAKmnB,UAAUnT,MAAUhU,KAAKmnB,UAAUwI,cF/KC3b,EE+KehU,KAAKgU,MF7KpFP,EAAS,GAGR7P,EAAayC,IAAIvF,OAAO8F,KAAKoN,GAAOnN,IAAI,SAAAlF,GAE3C,IAAM0lB,EAAOqI,EAAS/tB,GAEtB,GAAK0lB,EAIL,OAAOzjB,EAAaH,UAAUR,KAAK,WAE/B,IAAM5B,EAAQ2S,EAAMrS,GAEpB,GAAKN,GAIAgmB,EAAK2D,WAIV,OAAO3pB,IAER4B,KAAK,SAAA5B,GAEJ,GAAIA,QAIJ,OAAOuC,EAAayC,IAAI,CAEpB0kB,GAAc1D,EAAM1lB,EAAKN,GAEzB4pB,GAAc5D,EAAM1lB,EAAKN,KAC1B4B,KAAK,SAAAuZ,GAAgC,IAEhClY,EAFG0mB,EAA6BxO,EAAA,GAAjB0O,EAAiB1O,EAAA,GAIpC,GAA0B,kBAAf0O,EACP5mB,EAAS4mB,EAAWloB,gBACjB,GAA0B,iBAAfkoB,EACd5mB,EAAS4mB,EAAWloB,gBACjB,GAA0B,iBAAfkoB,GAA0C,OAAfA,GAEzC,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBnZ,KAC1C3I,EAAS2I,KAAKC,UAAUge,QACrB,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBE,OACjDhiB,EAASqL,KAAK1C,KAAKC,UAAUge,SAC1B,GAAI7D,EAAKuI,gBAAkBxJ,GAAmBC,SAAWgB,EAAKuI,cAAe,CAChFtrB,E9CqUjB,SAASurB,EAAO7hB,EAAc8hB,EAAsBC,GAEvD,IAAK,IAAIpuB,UAF4F,IAApEmuB,MAAkB,SAAkD,IAA9CC,MAAkB,IACzED,EAASA,EAAaA,EAAP,IAAoBA,EACnB9hB,EACPA,EAAIhM,eAAeL,IAApB,MAA4BqM,EAAIrM,IAA+D,mBAAbqM,EAAIrM,KAE/EqM,EAAIrM,IAAQkL,MAAMC,QAAQkB,EAAIrM,KAASqM,EAAIrM,GAAKY,QAAUyL,EAAIrM,GAAKquB,MAAM,SAAAzf,GAAG,MAAmB,iBAARA,IAC9Fwf,EAAM,GAAKD,EAAWnuB,EAAhB,MAA4BqM,EAAIrM,GAAK8L,KAAK,KACzCO,EAAIrM,IAA4B,iBAAbqM,EAAIrM,GAC9BouB,EAASF,EAAO7hB,EAAIrM,GAAL,GAAemuB,EAAWnuB,EAAQouB,GAEjDA,EAAM,GAAKD,EAAWnuB,GAA6BqM,EAAIrM,GA3BlDqB,YA8Bb,OAAO+sB,E8ClVsBF,CAAO3E,EAAYvpB,GADoD,QAAAoiB,EAAA,EAAAkM,EAG3DnvB,OAAO8F,KAAKtC,GAH+Cyf,EAAAkM,EAAA1tB,OAAAwhB,IAGtC,CAArC,IAAMmM,EAAMD,EAAAlM,GACbtQ,EAAOyc,GAAU5rB,EAAO4rB,GAG5B,YAGyB,iBAAfhF,IACd5mB,EAAS4mB,EAAWloB,YAGxByQ,EAAOuX,GAAc1mB,SAI7BrB,KAAK,WACL,OAAOwQ,KEwGsFxQ,KAAK,SAAAktB,GAC9F,O/C9KL,SAAmB7iB,EAAcgI,QAA2F,IAA3FA,MAA8E,IAElH,IAGI8a,EAEAC,EALAF,EAAQ7a,EAAQ6a,OAAS,GACzBxpB,EAAO2O,EAAQ3O,MAAQ,GAHoG2pB,EAS/FhjB,EAAIC,MAAM,KAA3B8iB,EATgHC,EAAA,OAAAC,GAS7HH,EAT6HE,EAAA,IAUlF/iB,MAAM,KAAjD6iB,EAV6HG,EAAA,GAY/H,IAAI/c,EAAcM,GAZ6Gyc,EAAA,GAYlFJ,GACzCK,EAAa1c,GAAYuc,EAAc1pB,GAU3C,OARI6M,IACA4c,EAAkBA,EAAP,IAAwB5c,GAGnCgd,IACAJ,EAAkBA,EAAP,IAAwBI,GAGhCJ,E+CuJQK,CnDysBZ,SAA0BnjB,GAC7B,GAJyC,IAIvBD,EAAiBC,GAJrBtI,QAAQwC,EAASC,MAK3B,OAAO6F,EAIP,MAAM,IAAI1I,MAAJ,4CmD/sBe8rB,CAAiB7F,EAAK1D,UAAUwJ,OAAO9F,EAAK7W,QAAS,CAAEmc,aAnOpFzrB,EAuOIkE,UAAA,WACI,OAAO5I,KAAKmnB,UAAUve,UAAU5I,KAAKgU,QAxO7CtP,EA2OIgpB,iBAAA,WACI,OAAO1tB,KAAKmnB,UAAUuG,iBAAiB1tB,KAAKgU,QA5OpDtP,EA+OIgqB,iBAAA,SAAiB7lB,GAA2C,IACxD,IAAMvE,EAAS,GADyCoP,EAAA,EAAAqC,EAGtCjV,OAAO8F,KAAK5G,KAAKgU,OAHqBN,EAAAqC,EAAAxT,OAAAmR,IAGb,CAAtC,IAAM/R,EAAGoU,EAAArC,GACJ2T,EAAOrnB,KAAKmnB,UAAUG,kBAAkB3lB,GAE1C0lB,IAA6B,IAArBA,EAAKuJ,aAIbvJ,GAAQA,EAAK0C,aAAerd,EAAY7D,EAAQD,EAAU/F,WAK9DyB,EAAO3C,GAAO3B,KAAKgU,MAAMrS,IAI7B,OAAO2C,GAlQfI,EAqQIkmB,YAAA,SAAY5W,GAAgD,IAAA6c,EAAA7wB,KAGxD,OAFAA,KAAK6oB,SAAS7U,GAAO,GAEdhU,KAAKosB,YAAYnpB,KAAK,WACzB,GAAI4tB,EAAKxnB,MACL,OAAOwnB,EAAKxnB,MAAMuhB,YAAYiG,EAAKnC,iBAAiBmC,EAAKjoB,cAAclD,MAAM,SAAAxC,GACzE,GAAK2tB,EAAKxnB,OAAUwnB,EAAKhF,SAIzB,OAAOgF,EAAKxG,WAAWwG,EAAKhF,UAAU5oB,KAAK,WACvC,GAAI4tB,EAAKxnB,MACL,MAAMnG,SAjRlCwB,EAyRI0mB,UAAA,WAA4D,IAAA0F,EAAA9wB,KACxD,OAAO4D,EAAakC,IAAI,WACpB,GAAIgrB,EAAK3E,OAAOf,UACZ,OAAO0F,EAAK3E,OAAOf,UAAU7qB,KAAKuwB,MA5RlDpsB,EAiSIinB,mBAAA,WAAqE,IAAAoF,EAAA/wB,KACjE,OAAO4D,EAAakC,IAAI,WACpB,GAAIirB,EAAK5E,OAAOR,mBACZ,OAAOoF,EAAK5E,OAAOR,mBAAmBprB,KAAKwwB,MApS3DrsB,EAySI6Z,KAAA,SAAK+M,GAA0E,IAAA0F,EAAAhxB,KAC3E,OAAO4D,EAAakC,IAAI,WACpBkrB,EAAK7J,UAAUqB,IAAf,QAEA,IAAMyI,EAAaD,EAAKhd,MAAMnR,OAE9B,OAAIouB,GACAD,EAAKxF,MAAM/Y,SAAS,kBAAMwe,EAAW3T,UAC9BwB,GAAcmS,IAGlBD,EAAK7E,OAAO5N,KAAKhe,KAAKywB,EAAM1F,KAEpCroB,KAAK,SAAA4oB,GAEJ,OADAmF,EAAKnF,SAAWA,EACTA,KAxTnBnnB,EA4TIknB,cAAA,SAAcC,EAAwBC,GAAmF,IAAAoF,EAAAlxB,KACrH,OAAO4D,EAAakC,IAAI,WACpB,OAAOorB,EAAK/E,OAAOP,cAAcrrB,KAAK2wB,EAAMrF,EAAUC,MA9TlEpnB,EAkUI8Y,MAAA,WAA6B,IAAA2T,EAAAnxB,KACzB,OAAO4D,EAAakC,IAAI,WACpB,GAAIqrB,EAAKtF,SACL,OAAOsF,EAAKtF,SAASrO,QAAQva,KAAKkO,OArUlDzM,EA0UIunB,SAAA,SAAS9kB,EAAmC9E,GAAgC,IAAA+uB,EAAApxB,KACxEA,KAAKmnB,UAAUqB,IAAf,YADwE,IAGxE,IAAMxU,EAAQ,GAH0DuO,EAAA,EAAA8O,EAIjDrxB,KAAKmnB,UAAU+C,eAJkC3H,EAAA8O,EAAA9uB,OAAAggB,IAIlB,CAAjD,IAAM+O,EAAQD,EAAA9O,GACXviB,KAAKmnB,UAAUG,kBAAkBgK,GAAUC,gBAC3Cvd,EAAMsd,GAAYtxB,KAAKgU,MAAMsd,IANmC,IAUxE,IAAME,EAAmB7W,GAAKtY,EAAY6jB,GAAb,IAAwClmB,KAAKmnB,UAAUxmB,KAAS,CACzFwG,UACA6M,QACAyd,UAAW,CACP5a,MAAS7W,KAAK6W,MACdyG,MAAS,kBAAM8T,EAAK9T,SACpB7X,QAAS,SAACvC,GAAD,OAASkuB,EAAK3rB,QAAQvC,OAGpCD,KAAK,SAAAyuB,GAAc,IAAX5W,EAAW4W,EAAX5W,KAEP,OADAsW,EAAK5F,MAAM/Y,SAASqI,EAAKwP,SAClBxP,EAAK2W,YAEb/rB,MAAM,SAAAxC,GACL,MAAM,IAAI0B,MAAJ,+FAA0G0M,GAAepO,MAxB3DoC,EAAA,SAAAwQ,EAAA6b,GA2BnE,IAAMhwB,EAAGgwB,EAAA7b,GAEVsb,EAAKzvB,GAAO,WAAoD,IAAAiwB,EAAA5xB,KAAA6gB,EAAAve,UAC5D,OAAOkvB,EAAiBvuB,KAAK,SAAAwuB,GACzB,OAAOA,EAAU9vB,GAAKc,MAAMmvB,EAAMtvB,OA/B0BwT,EAAA,EAAA6b,EA2BtD3xB,KAAKmsB,OAAOF,SA3B0CnW,EAAA6b,EAAApvB,OAAAuT,IA2BhCxQ,EAAAwQ,EAAA6b,IArWhDjtB,EA+WIoqB,aAAA,SAAazsB,EAAgCwG,EAAiB2H,EAAcrJ,GAExE,GAAI0B,IAAWD,EAAU/F,QAAS,CAC9B,IAAMqX,EAASV,GAAU3W,QAOzB,OANAqX,EAAOyP,QAAUzP,EAAOyP,SAAW,GACnCzP,EAAOyP,QAAQnZ,GAAO3N,OACtB7C,KAAKwrB,MAAM/Y,SAAS,kBACTyH,EAAOyP,QAAQnZ,KAGnB,CAAE4L,KP1aX,SO0a2C5L,OAG7C,OAAIrJ,IAAYof,GAAQxe,MACb,CAAEqU,KPjbX,UOobK,CAAEA,KPlbP,SOkbuCpQ,SAAUD,EAAmBlJ,UAhY9E6B,EAmYIokB,cAAA,SAAc+C,GAA6C,IAAAgG,EAAA7xB,KACnD4lB,GAAY,EAMhB,OAJA5lB,KAAKwrB,MAAM/Y,SAAS,WAChBmT,GAAY,IAGThiB,EAAayD,MAAM,KAAMpE,KAAK,WACjC,OAAO4oB,EAASpO,aACjBxa,KAAK,SAAAwa,GACJ,OAAIA,GACAoU,EAAK1K,UAAUqB,IAAf,sBACOqJ,EAAKvU,SACJsI,OAAL,EACIiM,EAAK/I,cAAc+C,MAjZ1CnnB,EAsZIgoB,eAAA,WAAiB,IAAAoF,EAAA9xB,KACP+xB,EAAuB/c,GAAiBnS,OAAQ,SAAUuO,GAAK,WACjE0gB,EAAK3K,UAAUqB,IAAf,iBACAsJ,EAAKxH,QAAQ,IAAI1lB,MAAJ,6BAGjB5E,KAAKwrB,MAAM/Y,SAASsf,EAAqB9qB,SA5ZjDvC,EA+ZI4pB,WAAA,WAAkC,IAAA0D,EAAAhyB,KAC9B,OAAO4D,EAAakC,IAAI,WACpB,IAAMC,EAAUisB,EAAKhe,MAAMjO,QAE3B,GAAIA,EACA,OAAOisB,EAAK5F,YAAYrmB,QAAQA,EAAS,IAAInB,MAAJ,qCAAgDmB,EAAhD,qBApazDrB,EAyaIutB,UAAA,SAAU5oB,GAAkD,IAAA6oB,EAAAlyB,KACxD,OAAO4D,EAAakC,IAAI,WACpBosB,EAAK1G,MAAMzc,IAAI,QAAS1F,GACxB6oB,EAAK9F,YAAY3oB,aA5a7BiB,EAgbIqqB,mBAAA,SAAmB7mB,GAA0C,IAAAiqB,EAAAnyB,KACnDyF,EAAa,SAACvC,GAAD,OAASivB,EAAK1sB,QAAQvC,IACnC6lB,EAAa,SAAC1f,GAAD,OAAW8oB,EAAKF,UAAU5oB,IAO7C,OAFA0f,EAAKtjB,QAAUA,EAER,CAAEsjB,OAAMzL,MANI,kBAAM6U,EAAK7U,SAMR+M,WALH,kBAAM8H,EAAK9H,WAAWniB,IAKPihB,OAJf,SAAAiJ,GAAA,OAAuBD,EAAKhJ,OAAO,CAAE7R,MAArC8a,EAAG9a,MAAyCE,OAA5C4a,EAAU5a,UAIa/R,YAzblDf,EA4bIykB,OAAA,SAAAkJ,GAAyF,IAAAC,EAAAtyB,KAAhFsX,EAAgF+a,EAAhF/a,MAAOE,EAAyE6a,EAAzE7a,OACZ,OAAO5T,EAAakC,IAAI,WACpBwsB,EAAKzb,MAAMiW,QAAQnG,GAAMM,OAAQ,CAAE3P,QAAOE,cA9btD9S,EAkcI2lB,WAAA,SAAWniB,GAAwC,IAAAqqB,EAAAvyB,KAC/C,OAAOkI,EAAIuV,WAAWxa,KAAK,SAAA0H,GACvB,OAAIA,EACO4nB,EAAKjV,QAGT1Z,EAAayD,MAAM,KACrBpE,KAAK,kBAAMiF,EAAIuV,aACfxa,KAAK,SAAAuvB,GACF,GAAIA,EACA,OAAOD,EAAKjV,aA5cpC5Y,EAkdI4Y,MAAA,WAA6B,IAAAmV,EAAAzyB,KACzB,OAAO4D,EAAakC,IAAI,WAEpB,OADA2sB,EAAKtL,UAAUqB,IAAf,SACOiK,EAAK5b,MAAMiW,QAAQnG,GAAMI,SAEjC9jB,KAAK,WAKJ,OAJIwvB,EAAKppB,OACLopB,EAAKppB,MAAMiU,MAAMwD,gBAAgBpb,MAAMyL,IAGpCshB,EAAKnI,QAAQ,IAAI1lB,MAAJ,kBAA4B,MA5d5DF,EAgeIupB,UAAA,SAAUyE,EAAVC,GAAwI,IAAAC,EAAA5yB,KAA3FmH,EAA2FwrB,EAA3FxrB,QAASqJ,EAAkFmiB,EAAlFniB,IAClD,OAAO5M,EAAakC,IAAI,WACpB,IAAM+sB,EAAoBD,EAAKzL,UAAU0L,kBAEzC,GAAKA,EAAL,CAIA,IAAIC,EAAkBJ,EAAkBlU,YAExC,GAAKsU,GAAoB/pB,EAAa+pB,InDrc3C,SAAuB5qB,GAC1B,IAEI,IAAKA,EAAIC,SAASwV,KACd,OAAO,EAGX,GAA0B,gBAAtBzV,EAAIC,SAASwV,KACb,OAAO,EAEb,MAAOza,IAIT,OAAO,EmDub4D6vB,CAAcD,GAAzE,CAMA,IAAM3nB,GAFN2nB,EAAkB3pB,EAAiB2pB,IAEP/f,SACtB8B,EAAK+d,EAAKI,eAAeH,EAAmB,CAAE1rB,UAASqJ,MAAKrF,QAElE,GAAK0J,EAAL,CAIA,GAAIA,EAAGzJ,gBAAkBD,EACrB,MAAM,IAAIvG,MAAJ,qF/C9Ff,SAA8BsD,EAA4B2M,GAE7D,IAAIU,EAAMV,EAAGoe,QAAQ7iB,cAErB,GAAY,SAARmF,EACA,MAAM,IAAI3Q,MAAJ,oCAA+C2Q,GAKzD,IAFA,IAAIlK,EAAkBnD,EAAI6K,SAAS1H,gBAE5BA,EAAgB6nB,UAAY7nB,EAAgB6nB,SAAS3wB,QACxD8I,EAAgB2L,YAAY3L,EAAgB6nB,SAAS,IAGzD,KAAOre,EAAGqe,SAAS3wB,QACf8I,EAAgB6I,YAAYW,EAAGqe,SAAS,I+CkFpCC,CAAqBL,EAAiBje,GA1BZ,IAAAue,EA4BgCR,EAAKzL,UAAUgB,YAAc,GA5B7DkL,EAAAD,EA4BpB9b,aA5BoB,IAAA+b,KAAAC,EAAAF,EA4BL5b,cA5BK,IAAA8b,KAAAC,EAAAH,EA4BW/e,eA5BX,IAAAkf,EA4BqB,OA5BrBA,GA6B1Blf,EAAUI,GAAeJ,EAASlJ,MAElBmM,GAASE,IACrBN,GAAS7C,EAAS,SAAAmf,GACdZ,EAAKzJ,OAAO,CACR7R,MAAQA,EAF8Ckc,EAAzClc,WAEc3R,EAC3B6R,OAAQA,EAH8Cgc,EAAxBhc,YAGD7R,KAElC,CAAE2R,QAAOE,SAAQtP,IAAK4qB,UAtgBzCpuB,EA2gBIsuB,eAAA,SAAeS,EAAfC,GAA6S,IAAAC,EAAA3zB,KAEzS,OAAOyzB,EAASlzB,KAAKP,KAAM,CACvBmU,UAHqSuf,EAA3Nvf,UAI1EhN,QAJqSusB,EAAzOvsB,QAK5DqJ,IALqSkjB,EAAhOljB,IAMrErF,IANqSuoB,EAAhNvoB,IAOrFxB,MAPqS+pB,EAA3M/pB,MAQ1FoiB,eARqS2H,EAApM3H,eASjGvO,MAAY,kBAAMmW,EAAKnW,SACvBF,MAAY,kBAAMqW,EAAKrW,SACvBgP,MAAYtsB,KAAKssB,MACjBtY,MAAYhU,KAAKgU,MACjBuB,IAAYvV,KAAKmnB,UAAU5R,IAC3Bqe,WAAY5zB,KAAKmnB,UAAUyM,WAC3B/c,MAAY7W,KAAK6W,SA1hB7BnS,EA8hBIopB,gBAAA,SAAgB+F,EAAhBC,GAAmT,IAAAC,EAAA/zB,KAAtPsrB,EAAsPwI,EAAtPxI,WAAYQ,EAA0OgI,EAA1OhI,oBAAqB3kB,EAAqN2sB,EAArN3sB,QAASqJ,EAA4MsjB,EAA5MtjB,IACnG,OAAO5M,EAAayC,IAAI,CACpBwtB,EAAe5yB,MAAMgC,KAAK2R,IAE1B0W,EAAaA,EAAWrqB,MAAQ,KAEhC6qB,EAAsBA,EAAoB7qB,MAAQ,OACnDgC,KAAK,SAAA+wB,GAA0C,IAAvC7f,EAAuC6f,EAAA,GACxCC,EAAiBF,EAAKf,eAAee,EAAK5M,UAAU+M,kBAAmB,CAAE/sB,UAASqJ,MAAK2D,YAAWxK,MAD1DqqB,EAAA,GACiEjI,eADjEiI,EAAA,GACiF7oB,IAAK4H,WACpI,GAAIkhB,EAGA,OAFA/f,GAAYC,EAAW8f,GACvBF,EAAKvI,MAAM/Y,SAAS,kBAAMsE,GAAekd,KAClCjO,GAAeiO,MA1iBtCvvB,EA+iBI4lB,QAAA,SAAQpnB,EAAc4pB,GAAgD,IAAAqH,EAAAn0B,KAClE,YADkE,IAAhD8sB,OAAqB,GAChClpB,EAAakC,IAAI,WAMpB,OALK5C,IACD4pB,GAAU,EACV5pB,EAAM,IAAI0B,MAAM,wBAEpBuvB,EAAKhN,UAAUqB,IAAf,WACO2L,EAAK1uB,QAAQvC,EAAK4pB,KAC1B7pB,KAAK,WACJ,OAAOkxB,EAAK3I,MAAMnlB,SAxjB9B3B,EA4jBIe,QAAA,SAAQvC,EAAa4pB,GAAgD,IAAAsH,EAAAp0B,KACjE,YADiE,IAAhD8sB,OAAqB,GAC/BlpB,EAAakC,IAAI,WACpB,IAAyC,IAArCsuB,EAAK/H,cAAcrnB,QAAQ9B,GAO/B,OAHAkxB,EAAK/H,cAAcpnB,KAAK/B,GACxBkxB,EAAKhI,YAAYhnB,YAAYlC,GAEzB4pB,EACOsH,EAAKvd,MAAMiW,QAAQnG,GAAMtL,MAAOnY,QAD3C,KArkBZwB,EA2kBI2pB,WAAA,SAAWxC,EAAwBhjB,EAAiB1B,KA3kBxD+kB,EAAA,GC9CamI,GAAb,WAiBI,SAAAA,EAAYlN,EAA0B3kB,EAAgC8S,GAA+B,IAAAxR,EAAA9D,UAfrGmnB,eAeqG,EAAAnnB,KAdrGwC,YAcqG,EAAAxC,KAbrGmH,aAaqG,EAAAnH,KAZrGmsB,YAYqG,EAAAnsB,KAXrGgU,WAWqG,EAAAhU,KAVrGwrB,WAUqG,EAAAxrB,KARrGwd,WAQqG,EAAAxd,KAPrGmpB,YAOqG,EAAAnpB,KANrGgzB,oBAMqG,EAAAhzB,KAJrGsd,WAIqG,EAAAtd,KAHrGyF,aAGqG,EAAAzF,KAFrG6W,WAEqG,EACjG7W,KAAKmnB,UAAYA,EACjBnnB,KAAKmH,QAAUmO,EAAQnO,QACvBnH,KAAKmsB,OAASrB,GAAexV,EAAQnO,SACrCnH,KAAKwrB,MAAQlZ,GAAQtS,MAErBA,KAAKwd,MAAQ0O,GAAgBvnB,UAAU6Y,MACvCxd,KAAKmpB,OAAS+C,GAAgBvnB,UAAUwkB,OACxCnpB,KAAKgzB,eAAiB9G,GAAgBvnB,UAAUquB,eAGhDhzB,KAAKgU,MAAQ,GAXoF,QAAAN,EAAA,EAAAqC,EAY1EjV,OAAO8F,KAAK0O,EAAQtB,OAZsDN,EAAAqC,EAAAxT,OAAAmR,IAY9C,CAA9C,IAAM4d,EAAQvb,EAAArC,GACT0b,EAAUpvB,KAAKmnB,UAAUG,kBAAkBgK,GAC7ClC,GAAWA,EAAQmC,eAAiBjc,EAAQtB,MAAMsd,KAElDtxB,KAAKgU,MAAMsd,GAAYhc,EAAQtB,MAAMsd,IAI7CtxB,KAAKsd,MAAUhI,EAAQmc,UAAUnU,MACjCtd,KAAKyF,QAAU6P,EAAQmc,UAAUhsB,QACjCzF,KAAK6W,MAAUvB,EAAQmc,UAAU5a,MAEjC7W,KAAKmnB,UAAUqF,wBAAwBxsB,MACvCA,KAAKwrB,MAAM/Y,SAAS,kBAAM3O,EAAKqjB,UAAUsF,uBAAuB3oB,KAEhE9D,KAAKs0B,oBAAoB9xB,GA5CjC,IAAAkC,EAAA2vB,EAAA1vB,UAAA,OAAAD,EA+CI6vB,YAAA,WAAmC,IAAAzvB,EAAA9E,KAC/B,MAAO,CACHyxB,UAAWzxB,KAAKw0B,eAChBlK,QAAW,kBAAMxlB,EAAKwlB,aAlDlC5lB,EAsDI4vB,oBAAA,SAAoB9xB,GAAgC,IAAA6C,EAAArF,KAC1Cy0B,EAA4B/mB,EAAclL,EAAQ,kBAAM6C,EAAKilB,WAAW,KAC9EtqB,KAAKwrB,MAAM/Y,SAASgiB,EAA0BxtB,SAxDtDvC,EA2DI8vB,aAAA,WAAsC,IAClC,IAAM/C,EAAY,GACZ1xB,EAAOC,KAFqBsF,EAAA,SAAAid,EAAAoP,GAI7B,IAAMhwB,EAAGgwB,EAAApP,GACVkP,EAAU9vB,GAAO,WAEb,OAAOuqB,GAAgBvnB,UAAUhD,GAAKc,MAAM1C,EAAMuC,YAEtDmvB,EAAU9vB,GAAKke,SAAWle,GATI4gB,EAAA,EAAAoP,EAIhB3xB,KAAKmsB,OAAOF,SAJI1J,EAAAoP,EAAApvB,OAAAggB,IAIMjd,EAAAid,EAAAoP,GAQxC,OAAOF,GAvEf/sB,EA0EI4lB,QAAA,WACI,OAAOtqB,KAAKwrB,MAAMnlB,OA3E1BguB,EAAA,GCGaK,GAAmD,CAE5DjiB,SAF4D,SAEnD0U,EAFmD3K,GAEyC,IAAhEmY,EAAgEnY,EAAhEmY,MAAOC,EAAyDpY,EAAzDoY,SAGxC,gBAAAC,GCxCO,IAAwBC,EAAUC,EDwCzC,SAAAC,IAAA,OAAAH,EAAApyB,MAAAzC,KAAAsC,YAAAtC,KCxCyC+0B,EDwCzCF,GCxC+BC,EDwC/BE,GCvCGrwB,UAAY7D,OAAOY,OAAOqzB,EAAWpwB,WAC9CmwB,EAASnwB,UAAU5B,YAAc+xB,EACjCA,EAASG,UAAYF,EDqCf,IAAArwB,EAAAswB,EAAArwB,UAAA,OAAAD,EACI8oB,OAAA,WACI,OAAOmH,EAAMlf,cAAc,MAAO,OAF1C/Q,EAKIwwB,kBAAA,WACI/N,EAAUqB,IAAV,+BAGA,IAAM3T,EAAK+f,EAASO,YAAYn1B,MAE1BsI,EAAS6e,EAAU4B,KAAKtX,GAAO,GAAIzR,KAAKgU,QAC9C1L,EAAOklB,OAAO3Y,EAAI0R,GAAQze,QAC1B9H,KAAK+tB,SAAS,CAAEzlB,YAbxB5D,EAgBI0wB,mBAAA,WAEQp1B,KAAKssB,OAAStsB,KAAKssB,MAAMhkB,QACzBtI,KAAKssB,MAAMhkB,OAAOsiB,YAAYnZ,GAAO,GAAIzR,KAAKgU,QAAQtO,MAAMyL,KAnBxE6jB,EAAA,CAAqBL,EAAMU,aEbtBC,GAAwC,CAEjD7iB,SAFiD,SAErC0U,EAA0BoO,GAElC,OAAOA,EAAIpO,UAAUA,EAAU5R,IAAK,CAChCiY,OADgC,SACzB/X,GACH,OAAOA,EAAc,QAGzB+f,cAAc,EAEdC,QAPgC,WAQ5B,IAAM5gB,EAAK7U,KAAK01B,IAGhB11B,KAAKsI,OAAS6e,EAAU4B,KAAKtX,GAAO,GAAIzR,KAAK21B,SAC7C31B,KAAKsI,OAAOklB,OAAO3Y,EAAI0R,GAAQze,SAGnC8tB,MAAO,CACHD,OAAQ,CACJ9xB,QAAS,WACD7D,KAAKsI,QAAUtI,KAAK21B,QACpB31B,KAAKsI,OAAOsiB,YAAYnZ,GAAO,GAAIzR,KAAK21B,SAASjwB,MAAMyL,KAG/D0kB,MAAM,QClCbC,GAA4C,CAErDrjB,SAFqD,SAE5C0U,EAA0B4O,GAqD/B,OAnDeA,EAAGn2B,OAAOunB,EAAU5R,IAAK,IAAIygB,UAA2B7O,EAAU5R,IrDomBvEvF,QAAQ,YAAa,SAACimB,GAChC,OAAOA,EAAE,GAAGC,gBqDrmB2E,WAAM,IAEzF,IAAMC,EAAQ,GAF2EziB,EAAA,EAAAuW,EAIvE9C,EAAU+C,eAJ6DxW,EAAAuW,EAAA1nB,OAAAmR,IAKrFyiB,EADUlM,EAAAvW,IACG,IAKjB,OAFAyiB,EAAMniB,MAAQ,IAEP,CACHmiB,QAEAC,SAAU,IAEVC,WAAY,CAAE,SAAU,WAAY,SAACC,EAAQC,GACzCpP,EAAUqB,IAAV,iCAYA,IAAMoB,EAAW,WACb,OAAO5X,GAAcskB,EAAOtiB,MAAO,SAAArR,GAC/B,MAAoB,mBAATA,EACA,WACH,IAAM2B,EAAS3B,EAAKF,MAAMzC,KAAMsC,WAEhC,OAhBhB,WACI,GAA6B,WAAzBg0B,EAAOE,MAAMC,SAAiD,YAAzBH,EAAOE,MAAMC,QAClD,IACIH,EAAOI,SACT,MAAOxzB,KAWDyzB,GACOryB,GAGR3B,KAITi0B,EAAWzP,EAAU4B,KAAKa,KAChCgN,EAASpJ,OAAO+I,EAAS,GAAIhQ,GAAQze,QAErCwuB,EAAOO,OAAO,WACVD,EAAShM,YAAYhB,KAAYlkB,MAAMyL,aCrBlD2lB,GAA8C,CAEvDrkB,SAFuD,SAE9CskB,EAF8Cva,GAEwD,IAAnEwa,EAAmExa,EAA/E6Y,UAA8B4B,EAAiDza,EAAjDya,SAAUC,EAAuC1a,EAAvC0a,WAAYC,EAA2B3a,EAA3B2a,OAEhFJ,EAAKvO,IAAI,mCAET,IAAMoB,EAAW,SAACzC,GACd,OAAOnV,GAAc7P,EAAA,GAAKglB,EAAUiQ,cAAkBjQ,EAAUnT,OAAS,SAAArR,GACrE,MAAoB,mBAATA,EACA,WAAkC,IAAAmB,EAAA9D,KAAA6gB,EAAAve,UACrC,OAAO6kB,EAAUkQ,KAAKC,IAAI,kBAAM30B,EAAKF,MAAMqB,EAAMxB,MAGlDK,KAIT40B,EACFP,EAAiB,CACbQ,SAAUT,EAAKxhB,IACfkiB,SAAU,cACVC,OAAU,CAAE,WACbC,MAAM,CACL50B,YAAa,CAAEm0B,EAAYC,EAAQ,SAA4BS,EAAYP,GACvEr3B,KAAK63B,OAAS,GACd73B,KAAK43B,WAAaA,EAClB53B,KAAKq3B,KAAOA,IAEhBS,SANK,WAOD,IAAMC,EAAgB/3B,KAAK43B,WAAWI,cAEtCh4B,KAAKsI,OAASyuB,EAAKhO,KAAKa,EAAS5pB,OACjCA,KAAKsI,OAAOklB,OAAOuK,EAAexR,GAAQze,SAE9CmwB,UAZK,WAaGj4B,KAAKsI,SAzDd,SAAC4vB,EAAMC,GAClB,IAAMC,EAAU,GAEhB,IAAK,IAAMz2B,KAAOu2B,EACd,GAAIA,EAAKl2B,eAAeL,KACpBy2B,EAAQz2B,IAAO,EAEXu2B,EAAKv2B,KAASw2B,EAAKx2B,IACnB,OAAO,EAKnB,IAAK,IAAMA,KAAOw2B,EACd,IAAKC,EAAQz2B,GACT,OAAO,EAIf,OAAO,EAsC6B02B,CAAOr4B,KAAK63B,OAAQ73B,KAAKgU,SACzChU,KAAK63B,OAAL11B,EAAA,GAAmBnC,KAAKgU,OACxBhU,KAAKsI,OAAOsiB,YAAYhB,EAAS5pB,WAejD,OATuBi3B,EAAS,CAC5BqB,aAAc,CAAEf,GAChB53B,QAAc,CAAE43B,KACjBI,MAAM,CACL50B,YADK,iBCrFXw1B,GAAQ,CACVC,QAAW,UACXC,UAAW,aAGR,SAASC,GAATlc,GAA8J,IAAvHhM,EAAuHgM,EAAvHhM,IAAK7G,EAAkH6S,EAAlH7S,MAAOoiB,EAA2GvP,EAA3GuP,eAAgB5gB,EAA2FqR,EAA3FrR,IAAK6I,EAAsFwI,EAAtFxI,MAAO6C,EAA+E2F,EAA/E3F,MAA+E8hB,EAAAnc,EAAxEoX,WAAetc,EAAyDqhB,EAAzDrhB,MAAOE,EAAkDmhB,EAAlDnhB,OAE3G,GAAK7N,GAAUoiB,EAAf,CAIA,IAAM6M,EAAMztB,EAAIsK,cAAc,OAC9BmjB,EAAIhjB,aAAa,KAAMpF,GACvB,IAAMgE,EAAQrJ,EAAIsK,cAAc,SA6DhC,OA5DIzB,EAAM6kB,UACNrkB,EAAMoB,aAAa,QAAS5B,EAAM6kB,UAGtCrkB,EAAMN,YAAY/I,EAAI+K,eAAJ,kBACV1F,EADU,2GAIA8G,EAJA,8BAKCE,EALD,oCAQVhH,EARU,iSAkBVA,EAlBU,aAkBQ+nB,GAAME,UAlBd,kEAsBVjoB,EAtBU,aAsBQ+nB,GAAMC,QAtBd,yDA2BlBI,EAAI1kB,YAAYvK,GAChBivB,EAAI1kB,YAAY6X,GAChB6M,EAAI1kB,YAAYM,GAEhBuX,EAAe+M,UAAUC,IAAIR,GAAMC,SACnC7uB,EAAMmvB,UAAUC,IAAIR,GAAME,WAE1B5hB,EAAMmI,GAAG2H,GAAME,SAAU,WACrBkF,EAAe+M,UAAUE,OAAOT,GAAMC,SACtCzM,EAAe+M,UAAUC,IAAIR,GAAME,WAEnC9uB,EAAMmvB,UAAUE,OAAOT,GAAME,WAC7B9uB,EAAMmvB,UAAUC,IAAIR,GAAMC,SAE1BzzB,WAAW,WACPgS,GAAegV,IAChB,KAGPlV,EAAMmI,GAAG2H,GAAMM,OAAQ,SAAA7P,GAA4C,IAAlCY,EAAkCZ,EAAzCE,MAAyBW,EAAgBb,EAAxBI,OACf,iBAAbQ,IACP4gB,EAAIpkB,MAAM8C,MAAQyB,GAAMf,IAGH,iBAAdC,IACP2gB,EAAIpkB,MAAMgD,OAASuB,GAAMd,MAI1B2gB,GC7ER,SAASK,GAATzc,GAA2F,IAApDrR,EAAoDqR,EAApDrR,IAAK6I,EAA+CwI,EAA/CxI,MAErCmC,EAAOhL,EAAIsK,cAAc,QACzBzC,EAAO7H,EAAIsK,cAAc,QACzBjB,EAAQrJ,EAAIsK,cAAc,SAC1ByjB,EAAU/tB,EAAIsK,cAAc,OAyClC,OAxCAyjB,EAAQJ,UAAUC,IAAI,WAElB/kB,EAAM6kB,UACNrkB,EAAMoB,aAAa,QAAS5B,EAAM6kB,UAGtC1iB,EAAKjC,YAAYlB,GACjBA,EAAKkB,YAAYglB,GACjBlmB,EAAKkB,YAAYM,GACjBA,EAAMN,YAAY/I,EAAI+K,eAAJ,k6BA+BXC,ECiDf,IAAMgjB,GAAc,kBAAMhoB,IACpBioB,GAAe,SAAA5c,GAAA,OAAepL,GAAfoL,EAAGnb,QChBXg0B,GAAb,WAqCI,SAAAA,EAAY/f,GAAmCtV,KAnC/CuV,SAmC+C,EAAAvV,KAlC/CW,UAkC+C,EAAAX,KAhC/CsN,SAgC+C,EAAAtN,KA/B/C6I,YA+B+C,EAAA7I,KA9B/Cq5B,eA8B+C,EAAAr5B,KA5B/CgU,WA4B+C,EAAAhU,KA3B/C2vB,kBA2B+C,EAAA3vB,KAzB/C4zB,gBAyB+C,EAAA5zB,KAxB/CmoB,gBAwB+C,EAAAnoB,KAtB/CspB,0BAsB+C,EAAAtpB,KApB/Cs5B,oBAoB+C,EAAAt5B,KAlB/C6V,gBAkB+C,EAAA7V,KAb/Ck0B,uBAa+C,EAAAl0B,KAZ/C6yB,uBAY+C,EAAA7yB,KAV/CgvB,cAU+C,EAAAhvB,KAR/Cu5B,iBAQ+C,EAAAv5B,KAN/Cw5B,YAM+C,EAAAx5B,KAJ/Cy5B,YAI+C,EAAAz5B,KAF/CkvB,eAE+C,EC5E5C,SAAqB5Z,GAExB,IAAKA,EACD,MAAM,IAAI1Q,MAAJ,iCAIV,IAAK0Q,EAAQC,MAAQD,EAAQC,IAAIvI,MAAM,4BACnC,MAAM,IAAIpI,MAAJ,wBAAmC0Q,EAAQC,KAKrD,GAnDJ,SAAoCD,GAEhC,GAAIA,EAAQtB,OAAoC,iBAAlBsB,EAAQtB,MAClC,MAAM,IAAIpP,MAAJ,0CAGV,IAAM80B,E3DoWH,SAAmB1rB,GACtB,IAAI1J,EAAS,GACb,IAAK,IAAI3C,KAAOqM,EACRA,EAAIhM,eAAeL,IACnB2C,EAAOW,KAAK+I,EAAIrM,IAGxB,OAAO2C,E2D3WgBkK,CAAO2X,IAE9B,GAAI7Q,EAAQtB,MAAO,QAAAN,EAAA,EAAAqC,EACGjV,OAAO8F,KAAK0O,EAAQtB,OADvBN,EAAAqC,EAAAxT,OAAAmR,IAC+B,CAAzC,IAAM/R,EAAGoU,EAAArC,GAGJ2T,EAAO/R,EAAQtB,MAAMrS,GAE3B,IAAK0lB,GAA0B,iBAATA,EAClB,MAAM,IAAIziB,MAAJ,0BAAqCjD,EAArC,oBAGV,IAAK0lB,EAAKjL,KACN,MAAM,IAAIxX,MAAJ,sBAGV,IAA2C,IAAvC80B,EAAe10B,QAAQqiB,EAAKjL,MAC5B,MAAM,IAAIxX,MAAJ,mCAA8C80B,EAAejsB,KAAK,OAG5E,GAAI4Z,EAAKmI,UAAYnI,EAAKgI,QACtB,MAAM,IAAIzqB,MAAJ,8CAGV,GAAIyiB,EAAKjL,OAAS+J,GAAU/K,UAAYiM,EAAK2D,aAAe3D,EAAK6D,WAC7D,MAAM,IAAItmB,MAAJ,6CAkBlB+0B,CAAwBrkB,GAEpBA,EAAQse,WAAY,CACpB,GAAIte,EAAQse,aAAejb,GAAKrD,EAAQse,WAAWtc,SAAWmB,GAAOnD,EAAQse,WAAWtc,OACpF,MAAM,IAAI1S,MAAJ,kEAGV,GAAI0Q,EAAQse,aAAejb,GAAKrD,EAAQse,WAAWpc,UAAYiB,GAAOnD,EAAQse,WAAWpc,QACrF,MAAM,IAAI5S,MAAJ,mEAId,GAAI0Q,EAAQgkB,gBACJhkB,EAAQgkB,iBAAmB/S,GAAQze,QAAUwN,EAAQgkB,iBAAmB/S,GAAQxe,MAChF,MAAM,IAAInD,MAAJ,8BAAwC0Q,EAAQgkB,gBAAkB,YAIhF,IAAKhkB,EAAQhI,IACT,MAAM,IAAI1I,MAAJ,iBAGV,GAA2B,iBAAhB0Q,EAAQhI,KAA2C,mBAAhBgI,EAAQhI,IAClD,MAAM,IAAIlH,UAAJ,yCAGV,GAAIkP,EAAQud,mBAA0D,mBAA9Bvd,EAAQud,kBAC5C,MAAM,IAAIjuB,MAAJ,uDAGV,GAAK0Q,EAAQ4e,mBAA8F,mBAA9B5e,EAAQ4e,kBACjF,MAAM,IAAItvB,MAAJ,uDDmCNoqB,CAAS1Z,GAKTtV,KAAKuV,IAAMD,EAAQC,IACnBvV,KAAKW,KAAOX,KAAKuV,IAAIvF,QAAQ,KAAM,KAEnChQ,KAAKspB,qBAAuBhU,EAAQgU,sBAAwB1hB,GAE5D,IAAMsS,EAASV,KAGf,GAFAU,EAAO0f,WAAa1f,EAAO0f,YAAc,GAErC1f,EAAO0f,WAAW55B,KAAKuV,KACvB,MAAM,IAAI3Q,MAAJ,2DAAsE5E,KAAKuV,KAMrFvV,KAAK2vB,aDvCF,CACH9sB,OAAQ,CACJuZ,KAAe,SACfwU,aAAe,EACfpB,UAAe,EACf+B,eAAe,EACfvC,SALI,SAAA5X,GAKkE,IAA3D/V,EAA2D+V,EAA3D/V,MACP,IAAK0M,EAAS1M,KAAWyc,GAAYG,cAAc5c,GAC/C,MAAM,IAAIuD,MAAJ,mCAGd2qB,SAVI,SAAA7U,GAWA,OAAOoE,GADyEpE,EAAzErZ,SAKf0E,QAAS,CACLqW,KAAa,SACboT,UAAa,EACboB,aAAa,GAGjBtT,MAAO,CACHlB,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAA1M,GAAA,OAAAA,EAAGyC,QAGtBE,MAAO,CACHpB,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAvM,GAAA,OAAAA,EAAGwC,QAGtB2L,OAAQ,CACJ/M,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAtM,GAAA,OAAAA,EAAGkO,SAGtB0P,SAAU,CACNzc,KAAU,SACVoT,UAAU,GAGdnnB,UAAW,CACP+T,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAqH,GAAA,OAAAA,EAAGvmB,YAGtBghB,gBAAiB,CACbjN,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAArG,GAAA,OAAAA,EAAGmI,kBAGtBgE,UAAW,CACPjR,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfW,eAAe,EACflC,QAAe8J,GACf5J,SAAe6J,IAGnB9L,WAAY,CACRlR,KAAa,WACboT,UAAa,EACboB,aAAa,EACbvB,QAAa8J,GACb5J,SAAa6J,IAGjBhM,SAAU,CACNhR,KAAa,WACboT,UAAa,EACboB,aAAa,EACbvB,QAAa8J,GACb5J,SAAa6J,IAGjB7L,QAAS,CACLnR,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfW,eAAe,EACflC,QAAe8J,GACf5J,SAAe6J,IAGnB3zB,QAAS,CACL2W,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfrJ,cAAe,SAAAmK,GAAA,OAAAA,EAAGjsB,UAGtB2jB,QAAS,CACLhN,KAAe,WACfoT,UAAe,EACfoB,aAAe,EACfvB,QAAe8J,GACf5R,cAAe,SAAA6K,GAAA,OAAAA,EAAGhJ,WCpEtBppB,KAAKgU,MAAQsB,EAAQtB,OAAS,GAtBa,IAAAwI,EA0BsClH,EAAQse,YAAc,GA1B5DiG,EAAArd,EA0BnClF,MA1BmCwiB,EAAAtd,EA0BDhF,OAC1CxX,KAAK4zB,WAAa,CAAEtc,WA3BuB,IAAAuiB,EA0B3BrT,GAAmBC,MA1BQoT,EA2BhBriB,YA3BgB,IAAAsiB,EA0BQtT,GAAmBE,OA1B3BoT,GA6B3C95B,KAAKsN,IAAMgI,EAAQhI,IACnBtN,KAAK6I,OAASyM,EAAQzM,OACtB7I,KAAKq5B,UAAY/jB,EAAQ+jB,UAEzBr5B,KAAK6V,WAAaP,EAAQO,YAAc,GACxC7V,KAAK6V,WAAWR,OAASrV,KAAK6V,WAAWR,QAAU,GACnDrV,KAAK6V,WAAWkkB,MAAQ/5B,KAAK6V,WAAWkkB,OAAS,GAEjD/5B,KAAKs5B,eAAiBhkB,EAAQgkB,gBAAkB/S,GAAQze,OAExD9H,KAAKmoB,WAAa7S,EAAQ6S,WAGtBnoB,KAAKk0B,kBADL5e,EAAQ4e,kBACiB5e,EAAQ4e,kBAERwE,GAIzB14B,KAAK6yB,kBADLvd,EAAQud,kBACiBvd,EAAQud,kBAERoG,GAG7Bj5B,KAAKgvB,SAAW1Z,EAAQ0Z,SAExBhvB,KAAKy5B,OAASnkB,EAAQmkB,QAAU,CAC5BO,MAAO7oB,GACP8oB,KAAO9oB,GACP+oB,KAAO/oB,GACPjN,MAAOiN,IAGXnR,KAAKm6B,gBACLn6B,KAAKo6B,iBAELlgB,EAAO0f,WAAW55B,KAAKuV,KAAOvV,KAtGtC,IAAA0E,EAAA2wB,EAAA1wB,UAAA,OAAAD,EAyGIwlB,aAAA,WACI,GAAIlqB,KAAKkvB,UACL,OAAOlvB,KAAKkvB,UAFoB,IAKpC,IAAMA,EAAYpuB,OAAO8F,KAAK5G,KAAKgU,OALCN,EAAA,EAAAqC,EAMlBjV,OAAO8F,KAAK5G,KAAK2vB,cANCjc,EAAAqC,EAAAxT,OAAAmR,IAMc,CAA7C,IAAM/R,EAAGoU,EAAArC,IACsB,IAA5Bwb,EAAUlqB,QAAQrD,IAClButB,EAAUjqB,KAAKtD,GAKvB,OADA3B,KAAKkvB,UAAYA,EACVA,GAtHfxqB,EA0HI4iB,kBAAA,SAAkB3mB,GAEd,OAAOX,KAAKgU,MAAMrT,IAASX,KAAK2vB,aAAahvB,IA5HrD+D,EA+HIynB,OAAA,SAAOxrB,EAAe05B,GAEd,IAAMC,EAAU,CAAE5F,SAAOoB,WAASR,OAAKwB,aAEvC,IAAKwD,EAAQ35B,GACT,MAAM,IAAIiE,MAAJ,wCAAmDjE,GAS7D,OANAX,KAAKu5B,YAAcv5B,KAAKu5B,aAAe,GAElCv5B,KAAKu5B,YAAY54B,KAClBX,KAAKu5B,YAAY54B,GAAQ25B,EAAQ35B,GAAM8R,SAASzS,KAAMq6B,IAGnDr6B,KAAKu5B,YAAY54B,IA7IpC+D,EAmJIy1B,cAAA,WACI,GAAIn6B,KAAKu6B,UAAW,CAChB,GAAI13B,OAAO22B,OACP,MAAM,IAAI50B,MAAJ,oBAA+B5E,KAAKW,KAApC,qEAGV,IAAM0I,EAAQ,IAAI0e,GAAe/nB,MACjC6C,OAAO22B,OAASx5B,KAAKw5B,OAASnwB,EAAMugB,aA1JhDllB,EA8JI01B,eAAA,WAAiB,IAAAt2B,EAAA9D,KACbgf,GAAOkH,GAAL,IAAsClmB,KAAKW,KAAS,WAClD,OAAO,IAGXqe,GAAOkH,GAAL,IAAgClmB,KAAKW,KAAS,SAAAyW,GAAqD,IAAAojB,EAAApjB,EAA1C0D,KAEvD,OADiB,IAAIuZ,GAAkBvwB,EAD0DsT,EAAlD5U,OACM,CAAE2E,QAD0CqzB,EAAlCrzB,QACC6M,MADiCwmB,EAAzBxmB,MACDyd,UAD0B+I,EAAlB/I,YAE/D8C,iBArK5B7vB,EAyKI+1B,YAAA,SAAYvyB,GACR,OAAOyS,GAAKzS,EAASge,GAAV,IAA2ClmB,KAAKW,MAASsC,KAAK,SAAAyX,GACrE,OADmFA,EAAXI,OAEzEpV,MAAM,WACL,OAAO,KA7KnBhB,EAiLIisB,OAAA,SAAO3c,GACH,MAAwB,mBAAbhU,KAAKsN,IACLtN,KAAKsN,IAAI,CAAE0G,UAGfhU,KAAKsN,KAtLpB5I,EAyLIgpB,iBAAA,SAAiB1Z,GACb,OAAIhU,KAAK6I,QAAiC,iBAAhB7I,KAAK6I,OACpB7I,KAAK6I,OAGTwE,EAAiBrN,KAAK2wB,OAAO3c,KA9L5CtP,EAiMIkE,UAAA,SAAUoL,GACN,OAAIzM,GAAQvH,KAAK6I,QAEN7I,KAAK6I,OAGT7I,KAAK0tB,iBAAiB1Z,IAvMrCtP,EA0MIg2B,aAAA,WACI,GAAI16B,KAAKq5B,UACL,OAAOr5B,KAAKq5B,WA5MxB30B,EAgNI61B,QAAA,WACI,IAAMI,EAAU7S,KAChB,OAAO/a,QAAQ4tB,GAAWA,EAAQplB,MAAQvV,KAAKuV,MAlNvD7Q,EAqNIk2B,oBAAA,SAAgDzzB,EAAmCgN,GAC/E,GAAIA,EAAW,CACX,GAAyB,iBAAdA,IAA2BC,GAAUD,GAC5C,MAAM,IAAI/N,UAAJ,oDAGV,OAAO+N,EAGX,GAAIhN,IAAYof,GAAQxe,MAEpB,MAAO,OAGX,MAAM,IAAInD,MAAJ,mDAnOdF,EAsOIm2B,kBAAA,SAAkB1zB,EAAoC6M,GAClD,GAAIA,EAAMnR,OACN,OAAOic,GAAc9K,EAAMnR,QAAQub,UAGvC,GAAIjX,EAAS,CACT,GAAIA,IAAYof,GAAQze,QAAUX,IAAYof,GAAQxe,MAClD,MAAM,IAAInD,MAAJ,yBAAoCuC,GAG9C,OAAOA,EAGX,OAAOnH,KAAKs5B,gBAnPpB50B,EAsPIqkB,KAAA,SAAK/U,GAAsD,IAAAlP,EAAA9E,KAKjDsI,EAAS,IAAI4jB,GAAgBlsB,KAFnCgU,EAAQA,GAAS,IAIXwZ,EAAS,SAACnrB,EAAQ8R,EAAWhN,GAApB,OAAgCvD,EAAakC,IAAI,WAC5D,IAAKiI,EAAS1L,GACV,MAAM,IAAIuC,MAAJ,gCAKV,OAFAuC,EAAUrC,EAAK+1B,kBAAkB1zB,EAAS6M,GAC1CG,EAAYrP,EAAK81B,oBAAoBzzB,EAASgN,GACvC7L,EAAOklB,OAAOnrB,EAAQ8R,EAAWhN,MAG5C,OAAAhF,EAAA,GACOmG,EAAO4gB,aADd,CAEIsE,OAAU,SAACrZ,EAAWhN,GAAZ,OAAwBqmB,EAAO3qB,OAAQsR,EAAWhN,IAC5D2zB,SAAU,SAACz4B,EAAQ8R,EAAWhN,GAApB,OAAgCqmB,EAAOnrB,EAAQ8R,EAAWhN,OA1QhFzC,EA8QIipB,iBAAA,SAAiBtrB,EAAgCwG,EAA0BsL,GACvE,GAAI9R,IAAWQ,OAAf,CAIA,IAAKoJ,EAAgBpJ,OAAQR,GACzB,MAAM,IAAIuC,MAAJ,uCAGV,IAAMgI,EAAShE,IAEf,IAAK8D,EAAY7D,EAAQ+D,KAAY7D,EAAa1G,GAC9C,MAAM,IAAIuC,MAAJ,8BAAyCiE,EAAO7F,WAAhD,yBAAqF4J,GAG/F,GAAIuH,GAAkC,iBAAdA,EACpB,MAAM,IAAIvP,MAAJ,sEAAiFuP,EAAjF,QA9RlBzP,EAkSI8jB,IAAA,SAAI3R,EAAgB8jB,GAChB36B,KAAKy5B,OAAOQ,KAASj6B,KAAKW,KAA1B,IAAoCkW,EAAU8jB,IAnStDj2B,EAsSI8nB,wBAAA,SAA2BoK,GACvB,IAAM1c,EAASV,KACfU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GACrD7gB,EAAO6gB,iBAAiB91B,KAAK2xB,IAzSrClyB,EA4SI+nB,uBAAA,SAA0BmK,GACtB,IAAM1c,EAASV,KACfU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GACrD7gB,EAAO6gB,iBAAiB7zB,OAAOgT,EAAO6gB,iBAAiB/1B,QAAQ4xB,GAAW,IA/SlFvB,EAAA,GAuTO,SAAS3zB,GAAU4T,GpBrXnB,IJsEAoF,EAAqCsE,EAAIrE,EACtCT,EItEDV,KAAYwhB,cACbxhB,KAAYwhB,aAAc,EJoEUhc,GAArCtE,EIlE2B,CAAEsE,MAAIrE,UJkEIqE,GAAIrE,EAA2CD,EAA3CC,MACtCT,EAASV,MACRwI,eAAiB9H,EAAO8H,gBAAmB,SAAApX,GAAO,OAAIoX,GAAepX,EAAS,CAAEoU,KAAIrE,UA4CxF,SAAAK,GAA6F,IAAhEgE,EAAgEhE,EAAhEgE,GAAIrE,EAA4DK,EAA5DL,KAC7BjB,KAAclK,SAAS,sBAAuB,WAEjD,OAAOwF,GAAiBnS,OAAQ,UAAW,SAAAgU,IApC5C,SAAyBA,EAAzBgE,GAAiG,IAA/CmE,EAA+CnE,EAA/CmE,GAAIrE,EAA2CE,EAA3CF,KAQnDnY,EAASqU,EAAMrU,QAAUqU,EAAMokB,cACjCruB,EAASiK,EAAMjK,QAAWiK,EAAMqkB,eAAiBrkB,EAAMqkB,cAActuB,OACnEkO,EAAOjE,EAAMiE,KAMnB,GAJe,SAAXlO,IACAA,EAAapF,EAASE,KAAhB,MAGLlF,EAAL,CAIA,IAAKoK,EACD,MAAM,IAAIhI,MAAJ,2CASVod,GAAe,CAAExf,SAAQoK,SAAQkO,QAAQ,CAAEkE,KAAIrE,UAQvCwgB,CAAgBtkB,EAAO,CAAEmI,KAAIrE,aIpHjCygB,CAAkB,CAAEpc,MAAIrE,U/BYzB,SAAAiU,GAAqF,IAAhE5P,EAAgE4P,EAAhE5P,GAAIrE,EAA4DiU,EAA5DjU,KACrBjB,GAAY,oBAAoBlK,SAAS,gBAAiB,WAC7D,IAAMqT,EAA4B7D,EAtB5BhG,GAAaE,MAAO,CAAErQ,OAAQjB,IAAY,SAAAwP,GAAwB,IAArB5U,EAAqB4U,EAArB5U,OAAQoK,EAAawK,EAAbxK,OAE3D,OADA4N,GAAgBhY,GAAQiB,QAAQ,CAAEyE,IAAK1F,EAAQqG,OAAQ+D,IAChD,CAAEgO,WAAYL,QAsBfjS,EAASkD,IAKf,OAJIlD,GACAmS,GAASnS,EAAQ,CAAEqS,SAAQjV,MAAMyL,IAG9B0R,I+BfPwY,CAAU,CAAErc,MAAIrE,WoB6WpB,IAAMwM,EAA2B,IAAIkO,GAAU/f,GAEzCyT,EAAO,SAAC/U,GAAD,OAAWmT,EAAU4B,KAAK/U,IAOvC,OANA+U,EAAKoD,OAAS,SAACxrB,EAAM05B,GAAP,OAAelT,EAAUgF,OAAOxrB,EAAM05B,IACpDtR,EAAKwR,QAAU,kBAAMpT,EAAUoT,WAC/BxR,EAAK0R,YAAc,SAACvyB,GAAD,OAASif,EAAUsT,YAAYvyB,IAClD6gB,EAAKyQ,OAASrS,EAAUqS,OAGjBzQ,EAGJ,SAASuS,KACR/W,IACAA,GAAOgX,iBAGX,IAAM/0B,EAAU,GAEV0T,EAASV,KAEf,IADAU,EAAO6gB,iBAAmB7gB,EAAO6gB,kBAAoB,GAC9C7gB,EAAO6gB,iBAAiBx4B,QAC3BiE,EAAQvB,KAAKiV,EAAO6gB,iBAAiB,GAAGzQ,QAAQ,IAAI1lB,MAAJ,sBAAgC,IAGpF,OAAOhB,EAAayC,IAAIG,GAASvD,KAAKkO,IAGnC,IAAMqqB,GAAoBF,GAE1B,SAAShR,KpBvYT,IJgHGzH,EwBwRNyY,YnB5ZOz4B,OAAM,gBPgCV,WAAmC,IACtC,IAAM44B,EAAoB/hB,GAAY,qBADAhG,EAAA,EAAAgoB,EAEnBD,EAAkB70B,OAFC8M,EAAAgoB,EAAAn5B,OAAAmR,IAEO,CAAxC,IAAM/M,EAAI+0B,EAAAhoB,GACLmP,EAAW4Y,EAAkBx6B,IAAI0F,GACnCkc,IACAA,EAAS+C,WAAY,GAEzB6V,EAAkB1hB,IAAIpT,IMlB1Bg1B,IJ+GM9Y,EAAWnJ,KAAczY,IAAI,yBAE/B4hB,EAAS5b,gB5BzINpE,OAAM,uBsDbjB3C,EAAAQ,EAAAk7B,EAAA,mCAAA9mB,KAAA5U,EAAAQ,EAAAk7B,EAAA,2BAAAl6B,KAAAxB,EAAAQ,EAAAk7B,EAAA,4BAAAC,KAAA37B,EAAAQ,EAAAk7B,EAAA,sCAAAJ,KAAAt7B,EAAAQ,EAAAk7B,EAAA,+BAAAN,KAAAp7B,EAAAQ,EAAAk7B,EAAA,8BAAAE,KAAA57B,EAAAQ,EAAAk7B,EAAA,8BAAAzV,KAAAjmB,EAAAQ,EAAAk7B,EAAA,uCAAAxV,KAAAlmB,EAAAQ,EAAAk7B,EAAA,4BAAArV,KAAArmB,EAAAQ,EAAAk7B,EAAA,0BAAAjV","file":"zoid.frameworks.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/no-deprecated: off, react/no-find-dom-node: off, react/display-name: off, react/no-did-mount-set-state: off, react/destructuring-assignment: off, react/prop-types: off */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ndeclare class ReactClassType {\n\n}\n\ntype ReactElementType = {|\n\n|};\n\ndeclare class __ReactComponent {\n\n}\n\ntype ReactType = {|\n Component : __ReactComponent,\n createClass : ({ render : () => ReactElementType, componentDidMount : () => void, componentDidUpdate : () => void }) => (typeof ReactClassType),\n createElement : (string, ?{ [string] : mixed }, ...children : $ReadOnlyArray) => ReactElementType\n|};\n\ntype ReactDomType = {|\n findDOMNode : (typeof ReactClassType) => HTMLElement\n|};\n\ntype ReactLibraryType = {|\n React : ReactType,\n ReactDOM : ReactDomType\n|};\n\nexport const react : ComponentDriverType<*, ReactLibraryType> = {\n\n register(component : Component<*>, { React, ReactDOM } : ReactLibraryType) : (typeof ReactClassType) {\n\n // $FlowFixMe\n return class extends React.Component {\n render() : ReactElementType {\n return React.createElement('div', null);\n }\n\n componentDidMount() {\n component.log(`instantiate_react_component`);\n\n // $FlowFixMe\n const el = ReactDOM.findDOMNode(this);\n\n const parent = component.init(extend({}, this.props));\n parent.render(el, CONTEXT.IFRAME);\n this.setState({ parent });\n }\n\n componentDidUpdate() {\n\n if (this.state && this.state.parent) {\n this.state.parent.updateProps(extend({}, this.props)).catch(noop);\n }\n }\n };\n }\n};\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/* @flow */\n\nimport { extend, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype VueComponent = {|\n render : (Function) => Element,\n inheritAttrs : boolean,\n mounted : () => void,\n watch : {|\n $attrs : {|\n deep : boolean,\n handler : () => void\n |}\n |}\n|};\n\ntype RegisteredVueComponent = {|\n \n|};\n\ntype VueType = {|\n component : (string, VueComponent) => RegisteredVueComponent\n|};\n\nexport const vue : ComponentDriverType<*, VueType> = {\n\n register

(component : Component

, Vue : VueType) : RegisteredVueComponent {\n\n return Vue.component(component.tag, {\n render(createElement) : Element {\n return createElement('div');\n },\n\n inheritAttrs: false,\n\n mounted() {\n const el = this.$el;\n\n // $FlowFixMe\n this.parent = component.init(extend({}, this.$attrs));\n this.parent.render(el, CONTEXT.IFRAME);\n },\n\n watch: {\n $attrs: {\n handler: function handler() {\n if (this.parent && this.$attrs) {\n this.parent.updateProps(extend({}, this.$attrs)).catch(noop);\n }\n },\n deep: true\n }\n }\n });\n }\n};\n","/* @flow */\n\nimport { dasherizeToCamel, replaceObject, noop } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype AngularModule = {|\n directive : (string, () => {\n scope : { [string] : '=' | '@' },\n restrict : string,\n controller : $ReadOnlyArray\n }) => AngularModule\n|};\n\ntype Angular = {|\n module : (string, $ReadOnlyArray) => AngularModule\n|};\n\nexport const angular : ComponentDriverType<*, Angular> = {\n\n register(component : Component<*>, ng : Angular) : AngularModule {\n\n const module = ng.module(component.tag, []).directive(dasherizeToCamel(component.tag), () => {\n\n const scope = {};\n\n for (const key of component.getPropNames()) {\n scope[key] = '=';\n }\n\n scope.props = '=';\n\n return {\n scope,\n\n restrict: 'E',\n\n controller: [ '$scope', '$element', ($scope, $element) => {\n component.log(`instantiate_angular_component`);\n\n function safeApply() {\n if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') {\n try {\n $scope.$apply();\n } catch (err) {\n // pass\n }\n }\n }\n\n const getProps = () => {\n return replaceObject($scope.props, item => {\n if (typeof item === 'function') {\n return function angularWrapped() : mixed {\n const result = item.apply(this, arguments);\n safeApply();\n return result;\n };\n }\n return item;\n });\n };\n\n const instance = component.init(getProps());\n instance.render($element[0], CONTEXT.IFRAME);\n\n $scope.$watch(() => {\n instance.updateProps(getProps()).catch(noop);\n });\n } ]\n };\n });\n\n return module;\n }\n};\n","/* @flow */\n/* eslint new-cap: 0 */\n\nimport { replaceObject } from 'belter/src';\n\nimport type { Component, ComponentDriverType } from '../component';\nimport { CONTEXT } from '../constants';\n\ntype Angular2Injection = {||};\n\ntype Angular2Component = {||};\n\ntype Angular2Module = {||};\n\ntype Angular2 = {|\n Component : ({ selector : string, template : string, inputs : $ReadOnlyArray }) => {\n Class : ({ constructor : $ReadOnlyArray, ngOnInit : () => void, ngDoCheck : () => void }) => Angular2Component\n },\n NgModule : ({ declarations : $ReadOnlyArray, exports : $ReadOnlyArray }) => {\n Class : ({ constructor : () => void }) => Angular2Module\n },\n ElementRef : Angular2Injection,\n NgZone : Angular2Injection\n|};\n\nconst equals = (obj1, obj2) => {\n const checked = {};\n\n for (const key in obj1) {\n if (obj1.hasOwnProperty(key)) {\n checked[key] = true;\n\n if (obj1[key] !== obj2[key]) {\n return false;\n }\n }\n }\n\n for (const key in obj2) {\n if (!checked[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const angular2 : ComponentDriverType<*, Angular2> = {\n\n register(zoid : Component<*>, { Component : AngularComponent, NgModule, ElementRef, NgZone }) : Angular2Module {\n\n zoid.log('initializing angular2 component');\n\n const getProps = (component) => {\n return replaceObject({ ...component.internalProps, ...component.props }, item => {\n if (typeof item === 'function') {\n return function angular2Wrapped() : void {\n return component.zone.run(() => item.apply(this, arguments));\n };\n }\n return item;\n });\n };\n\n const ComponentInstance =\n AngularComponent({\n selector: zoid.tag,\n template: '

',\n inputs: [ 'props' ]\n }).Class({\n constructor: [ ElementRef, NgZone, function angularConstructor(elementRef, zone) {\n this._props = {};\n this.elementRef = elementRef;\n this.zone = zone;\n } ],\n ngOnInit () {\n const targetElement = this.elementRef.nativeElement;\n \n this.parent = zoid.init(getProps(this));\n this.parent.render(targetElement, CONTEXT.IFRAME);\n },\n ngDoCheck() {\n if (this.parent && !equals(this._props, this.props)) {\n this._props = { ...this.props };\n this.parent.updateProps(getProps(this));\n }\n }\n });\n\n\n const ModuleInstance = NgModule({\n declarations: [ ComponentInstance ],\n exports: [ ComponentInstance ]\n }).Class({\n constructor () {\n // pass\n }\n });\n\n return ModuleInstance;\n }\n};\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.js.map b/dist/zoid.js.map index 2cac7500..64279daa 100644 --- a/dist/zoid.js.map +++ b/dist/zoid.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"CAAA,SAAAA,MAAAC;IACA,mBAAAC,WAAA,mBAAAC,SACAA,OAAAD,UAAAD,YACA,qBAAAG,iBAAAC,MACAD,OAAA,YAAAH,WACA,mBAAAC,UACAA,QAAA,OAAAD,YAEAD,KAAA,OAAAC;CARA,CASC,sBAAAK,cAAAC,MAAA;IACD;QCTA,IAAAC,mBAAA;QAGA,SAAAC,oBAAAC;YAGA,IAAAF,iBAAAE,WACA,OAAAF,iBAAAE,UAAAR;YAGA,IAAAC,SAAAK,iBAAAE,YAAA;gBACAC,GAAAD;gBACAE,IAAA;gBACAV,SAAA;;YAUA,OANAW,QAAAH,UAAAI,KAAAX,OAAAD,SAAAC,eAAAD,SAAAO;YAGAN,OAAAS,KAAA,GAGAT,OAAAD;;QA0DA,OArDAO,oBAAAM,IAAAF,SAGAJ,oBAAAO,IAAAR;QAGAC,oBAAAQ,IAAA,SAAAf,SAAAgB,MAAAC;YACAV,oBAAAW,EAAAlB,SAAAgB,SACAG,OAAAC,eAAApB,SAAAgB,MAAA;gBAA0CK,aAAA;gBAAAC,KAAAL;;WAK1CV,oBAAAgB,IAAA,SAAAvB;YACA,sBAAAwB,iBAAAC,eACAN,OAAAC,eAAApB,SAAAwB,OAAAC,aAAA;gBAAwDC,OAAA;gBAExDP,OAAAC,eAAApB,SAAA;gBAAiD0B,QAAA;;WAQjDnB,oBAAAoB,IAAA,SAAAD,OAAAE;YAEA,IADA,IAAAA,SAAAF,QAAAnB,oBAAAmB,SACA,IAAAE,MAAA,OAAAF;YACA,QAAAE,QAAA,mBAAAF,wBAAAG,YAAA,OAAAH;YACA,IAAAI,KAAAX,OAAAY,OAAA;YAGA,IAFAxB,oBAAAgB,EAAAO,KACAX,OAAAC,eAAAU,IAAA;gBAAyCT,aAAA;gBAAAK;gBACzC,IAAAE,QAAA,mBAAAF,OAAA,SAAAM,OAAAN,OAAAnB,oBAAAQ,EAAAe,IAAAE,KAAA,SAAAA;gBAAgH,OAAAN,MAAAM;cAAqBC,KAAA,MAAAD;YACrI,OAAAF;WAIAvB,oBAAA2B,IAAA,SAAAjC;YACA,IAAAgB,SAAAhB,iBAAA4B,aACA;gBAA2B,OAAA5B,OAAA;gBAC3B;gBAAiC,OAAAA;;YAEjC,OADAM,oBAAAQ,EAAAE,QAAA,KAAAA,SACAA;WAIAV,oBAAAW,IAAA,SAAAiB,QAAAC;YAAsD,OAAAjB,GAAAkB,eAAAzB,KAAAuB,QAAAC;WAGtD7B,oBAAA+B,IAAA,IAIA/B,wCAAAgC,IAAA;;;;;QClFe,SAASC;YAetB,QAdAA,WAAWrB,OAAOsB,UAAU,SAAUC;gBACpC,KAAK,IAAIjC,IAAI,GAAGA,IAAIkC,UAAUC,QAAQnC,KAAK;oBACzC,IAAIoC,SAASF,UAAUlC;oBAEvB,KAAK,IAAIuB,OAAOa,SACV1B,IAAiBkB,eAAezB,KAAKiC,QAAQb,SAC/CU,OAAOV,OAAOa,OAAOb;;gBAK3B,OAAOU;eAGOI,MAAMzC,MAAMsC;;QCbvB,SAASI,gBAAUC;YACtB;gBACI,KAAKA,MACD,QAAO;gBAGX,IAAuB,sBAAZC,WAA2BD,gBAAgBC,SAClD,QAAO;gBAGX,IAAsB,sBAAXC,UAA0BA,OAAOC,UAAUH,gBAAgBE,OAAOC,QACzE,QAAO;gBAGX,IAAsB,sBAAXD,UAA0BA,OAAOE,eAAeJ,gBAAgBE,OAAOE,aAC9E,QAAO;gBAGX,IAAIC,YAAY,GAAIA;gBAEpB,IAAIA,WAAU;oBACV,IAAIrC,OAAOqC,UAASzC,KAAKoC;oBAEzB,IAAa,sBAAThC,QAAuC,sBAATA,QAAuC,yBAATA,MAC5D,QAAO;;gBAIf,IAAyB,qBAAdgC,KAAKM,MACZ,QAAO;cAEb,OAAOC;gBACL,QAAO;;YAGX,QAAO;;;;;QCjCX,ICCIC,cDDEC,mBAAmB,IACnBC,mCAAmC,ICDrCC,cAAc;QAGlB,SAASC;YACL,KAAKD,eAAeH,cAAc;gBAC9B,IAAMK,UAAUL;gBAChBA,eAAe,MACfK,QAAQC;;;QAIT,SAASC;YACZJ,eAAe;;QAGZ,SAASK;YACZL,eAAe,GACfC;;QCfG,IAAMK,uBAAb;YAeI,SAAAA,aAAYC;gBAAuF,IAAAC,QAAA9D;gBAQ/F,IAR+FA,KAbnG+D,gBAamG,GAAA/D,KAZnGgE,gBAYmG,GAAAhE,KAXnGiE,oBAWmG;gBAAAjE,KAVnGqB,aAUmG,GAAArB,KATnGkE,aASmG,GAAAlE,KARnGmE,gBAQmG,GAAAnE,KAHnGoE,mBAGmG;gBAAApE,KAFnGqE,aAEmG,GAE/FrE,KAAK+D,YAAW,GAChB/D,KAAKgE,YAAW,GAChBhE,KAAKiE,gBAAe;gBAEpBjE,KAAKmE,WAAW,IAEZN,SAAS;oBAET,IAAIS,SACAJ,QACAH,YAAW,GACXC,YAAW,GACXO,WAAU;oBAEdb;oBAEA;wBACIG,QAAQ,SAAAW;4BACAD,UACAT,MAAKL,QAAQe,QAEbT,YAAW,GACXO,UAASE;2BAGd,SAAAtB;4BACKqB,UACAT,MAAKW,OAAOvB,QAEZc,YAAW,GACXE,SAAQhB;;sBAIlB,OAAOA;wBAGL,OAFAS,kBACA3D,KAAKyE,OAAOvB;;oBAIhBS,aAEAY,WAAU,GAENR,WAEA/D,KAAKyD,QAAQa,WACNN,YACPhE,KAAKyE,OAAOP;;;YAjE5B,IAAAQ,SAAAd,aAAAe;YAAA,OAAAD,OA8EIjB,UAAA,SAAQa;gBACJ,IAAItE,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI0C,gBAAU4B,SACV,MAAM,IAAIM,MAAM;gBAOpB,OAJA5E,KAAK+D,YAAW,GAChB/D,KAAKqB,QAAQiD,QACbtE,KAAK6E,YAEE7E;eA3Ff0E,OA8FID,SAAA,SAAOP;gBAAiC,IAAAY,SAAA9E;gBACpC,IAAIA,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI0C,gBAAUwB,QACV,MAAM,IAAIU,MAAM;gBAGpB,KAAKV,OAAO;oBACR,IAAIhB,OAAOgB,SAAmC,qBAAnBA,MAAMlB,WAA0BkB,MAAMlB,aAAalC,GAAiBkC,SAASzC,KAAK2D;oBAC7GA,QAAQ,IAAIU,MAAJ,kDAA2D1B;;gBAgBvE,OAbAlD,KAAKgE,YAAW,GAChBhE,KAAKkE,QAAQA,OAERlE,KAAKiE,gBACNc,WAAW;oBACFD,OAAKb,gBFhHnB,SAA2Cf,KAAaM;wBAE3D,KAAuC,MAAnCJ,iBAAiB4B,QAAQ9B,MAA7B;4BAIAE,iBAAiB6B,KAAK/B,MAEtB6B,WAAW;gCAMP,MAAM7B;+BACP;4BAEH,KAAK,IAAIgC,IAAI,GAAGA,IAAI7B,iCAAiCd,QAAQ2C,KAEzD7B,iCAAiC6B,GAAGhC,KAAKM;;qBE8F7B2B,CAA+BjB,OAAOY;mBAE3C,IAGP9E,KAAK6E,YAEE7E;eAzHf0E,OA4HIU,cAAA,SAAYlB;gBAGR,OAFAlE,KAAKiE,gBAAe,GACpBjE,KAAKyE,OAAOP,QACLlE;eA/Hf0E,OAkIIG,WAAA;gBAAW,IAAAQ,SAAArF,MAEY+D,WAAiC/D,KAAjC+D,UAAUC,WAAuBhE,KAAvBgE,UAAUG,WAAanE,KAAbmE;gBAEvC,KAFoDnE,KAA9CoE,gBAMDL,YAAaC,WAAlB;oBAIAhE,KAAKoE,eAAc,GACnBV;oBAEA,KAfO,IAAA4B,QAAA,SAeElF;wBAfF,IAAAmF,cAiBmCpB,SAAS/D,IAAzCoF,YAjBHD,YAiBGC,WAAWC,UAjBdF,YAiBcE,SAASjC,UAjBvB+B,YAiBuB/B,SAEtBc,cAAM;wBAEV,IAAIP,UAEA;4BACIO,SAASkB,YAAYA,UAAUH,OAAKhE,SAASgE,OAAKhE;0BACpD,OAAO6B;4BAEL,OADAM,QAAQiB,OAAOvB,MACf;+BAGD,IAAIc,UAAU;4BAEjB,KAAKyB,SAED,OADAjC,QAAQiB,OAAOY,OAAKnB,QACpB;4BAGJ;gCACII,SAASmB,QAAQJ,OAAKnB;8BACxB,OAAOhB;gCAEL,OADAM,QAAQiB,OAAOvB,MACf;;;wBAIJoB,kBAAkBV,iBAAiBU,OAAOP,YAAYO,OAAON,aAEzDM,OAAOP,WACPP,QAAQC,QAAQa,OAAOjD,SAEvBmC,QAAQiB,OAAOH,OAAOJ;wBAG1BI,OAAOL,gBAAe,KAEfvB,gBAAU4B,UAEbA,kBAAkBV,iBAAiBU,OAAOP,YAAYO,OAAON,YACzDM,OAAOP,WACPP,QAAQC,QAAQa,OAAOjD,SAEvBmC,QAAQiB,OAAOH,OAAOJ,SAK1BI,OAAOrB,KAAK,SAAAuB;4BACRhB,QAAQC,QAAQe;2BACjB,SAAAtB;4BACCM,QAAQiB,OAAOvB;6BAMvBM,QAAQC,QAAQa;uBA5DflE,IAAI,GAAGA,IAAI+D,SAAS5B,QAAQnC,KAAKkF,MAAjClF;oBAgET+D,SAAS5B,SAAS,GAClBvC,KAAKoE,eAAc,GACnBT;;eAnNRe,OAsNIzB,OAAA,SAA2BuC,WAA0DC;gBAEjF,IAAID,aAAkC,qBAAdA,cAA6BA,UAAUjF,MAC3D,MAAM,IAAIqE,MAAM;gBAGpB,IAAIa,WAA8B,qBAAZA,YAA2BA,QAAQlF,MACrD,MAAM,IAAIqE,MAAM;gBAGpB,IAAIpB,UAAgC,IAAII;gBAYxC,OAVA5D,KAAKmE,SAASc,KAAK;oBACfzB;oBACAgC;oBACAC;oBAGJzF,KAAKiE,gBAAe,GAEpBjE,KAAK6E,YAEErB;eA5OfkB,OA+OIgB,QAAA,SAA4BD;gBACxB,OAAOzF,KAAKiD,UAAK0C,GAAWF;eAhPpCf,OAmPIkB,UAAA,SAAQC;gBAEJ,IAAIA,aAAkC,qBAAdA,cAA6BA,UAAUtF,MAC3D,MAAM,IAAIqE,MAAM;gBAGpB,OAAO5E,KAAKiD,KAAK,SAACqB;oBACd,OAAOV,aAAakC,IAAID,WACnB5C,KAAK;wBACF,OAAOqB;;mBAEhB,SAACpB;oBACA,OAAOU,aAAakC,IAAID,WACnB5C,KAAK;wBACF,MAAMC;;;eAjQ1BwB,OAsQIqB,UAAA,SAAQC,MAAe9C;gBAAgC,IAAA+C,SAAAjG;gBAEnD,IAAIA,KAAK+D,YAAY/D,KAAKgE,UACtB,OAAOhE;gBAGX,IAAI+F,UAAUhB,WAAW;oBAEjBkB,OAAKlC,YAAYkC,OAAKjC,YAI1BiC,OAAKxB,OAAOvB,OAAO,IAAI0B,MAAJ,6BAAsCoB,OAAtC;mBAEpBA;gBAEH,OAAOhG,KAAKiD,KAAK,SAAAqB;oBAEb,OADA4B,aAAaH,UACNzB;;eAxRnBI,OA6RIyB,YAAA;gBAEI,IAAuB,sBAAZvD,SACP,MAAM,IAAIwD,UAAJ;gBAGV,OAAOxD,QAAQa,QAAQzD;eAnS/B4D,aAsSWH,UAAP,SAA0BpC;gBAEtB,OAAIA,iBAAiBuC,eACVvC,QAGPqB,gBAAUrB,SAEH,IAAIuC,aAAa,SAACH,SAASgB;oBAAV,OAAqBpD,MAAM4B,KAAKQ,SAASgB;qBAG9D,IAAIb,eAAeH,QAAQpC;eAjT1CuC,aAoTWa,SAAP,SAAcP;gBACV,OAAO,IAAIN,eAAea,OAAOP;eArTzCN,aAwTWwB,cAAP,SAAmBlB;gBACf,OAAO,IAAIN,eAAewB,YAAYlB;eAzT9CN,aA4TWyC,MAAP,SAA+LC;gBAE3L,IAAI9C,UAAU,IAAII,gBACd2C,QAAQD,SAAS/D,QACjBiE,UAAU;gBAEd,KAAKD,OAED,OADA/C,QAAQC,QAAQ+C,UACThD;gBAGX,KAXqQ,IAAAiD,SAAA,SAW5PrG;oBACL,IAAIsG,OAAOJ,SAASlG;oBAEpB,IAAIsG,gBAAgB9C;wBAChB,IAAI8C,KAAK3C,UAGL,OAFAyC,QAAQpG,KAAKsG,KAAKrF,OAClBkF,SAAS,GACT;2BAED,KAAK7D,gBAAUgE,OAGlB,OAFAF,QAAQpG,KAAKsG,MACbH,SAAS,GACT;oBAGJ3C,aAAaH,QAAQiD,MAAMzD,KAAK,SAAAqB;wBAC5BkC,QAAQpG,KAAKkE,QAEC,MADdiC,SAAS,MAEL/C,QAAQC,QAAQ+C;uBAErB,SAAAtD;wBACCM,QAAQiB,OAAOvB;;mBAtBd9C,IAAI,GAAGA,IAAIkG,SAAS/D,QAAQnC,KAAKqG,OAAjCrG;gBA8BT,OAJc,MAAVmG,SACA/C,QAAQC,QAAQ+C,UAGbhD;eArWfI,aAwWW+C,OAAP,SAAkCL;gBAC9B,IAAIhC,SAAS;gBAEb,OAAOV,aAAayC,IAAIvF,OAAO8F,KAAKN,UAAUO,IAAI,SAAAlF;oBAC9C,OAAOiC,aAAaH,QAAQ6C,SAAS3E,MAAMsB,KAAK,SAAA5B;wBAC5CiD,OAAO3C,OAAON;;oBAElB4B,KAAK;oBACL,OAAOqB;;eAhXnBV,aAoXWiD,MAAP,SAAiBC,OAAkBC;gBAE/B,OAAOnD,aAAayC,IAAIS,MAAMD,IAAIE;eAtX1CnD,aAyXWoD,+BAAP,SAAoCnD;gBAChC,OFlWD,SAAsCA;oBAGzC,OAFAR,iCAAiC4B,KAAKpB,UAE/B;wBACHoD,QADG;4BAEC5D,iCAAiC6D,OAAO7D,iCAAiC2B,QAAQnB,UAAU;;;iBE6VxFmD,CAA6BnD;eA1X5CD,aA6XWkC,MAAP,SAA8DiB,QAAiDI,SAAcC;gBAEzH,IAAIL,UAA4B,qBAAXA,WAA0BA,OAAOxG,MAClD,MAAM,IAAIqE,MAAM;gBAGpB,IAAIN;gBAEJZ;gBAEA;oBAEIY,SAASyC,OAAOtE,MAAM0E,SAASC,QAAQ;kBACzC,OAAOlE;oBAEL,OADAS,aACOC,aAAaa,OAAOvB;;gBAK/B,OAFAS,aAEOC,aAAaH,QAAQa;eAjZpCV,aAoZWyD,QAAP,SAAaA;gBACT,OAAO,IAAIzD,aAAa,SAAAH;oBACpBsB,WAAWtB,SAAS4D;;eAtZhCzD,aA0ZWlB,YAAP,SAAiBrB;gBAEb,UAAIA,SAASA,iBAAiBuC,iBAIvBlB,gBAAUrB;eAhazBuC,aAmaW0D,QAAP;gBACI,ODjZA9D,UAAUL,eAAeA,gBAAgB,ICiZtBS,gBDhZvBL;gBACOC;gBAHJ,IACCA;eCnBRI;SAAA;QCJO,SAAS2D,QAAQ5E;YACpB,OAAgD,sBAAzC7B,GAAiBkC,SAASzC,KAAKoC;;QCDnC,IAAM6E,WAAW;YACpBC,MAAQ;YACRC,MAAQ;YACRC,OAAQ;WAGCC,WAAW,KAEXC,cAAc;YACvBC,QAAS;YACTC,OAAS;WCLTC,sBAAsB;QAMnB,SAASC,gBAAgBC;YAC5B,YAD2E,MAA/CA,cAA6BrF,SAClDqF,IAAIC,SAASC,aAAaZ,SAASG;;QAGvC,SAASU,UAAUH;YAEtB,IAAKA,KAIL;gBACI,IAAIA,IAAII,UAAUJ,IAAII,WAAWJ,KAC7B,OAAOA,IAAII;cAEjB,OAAOpF;;QAKN,SAASqF,UAAUL;YAEtB,IAAKA,QAKDG,UAAUH,MAId;gBACI,OAAOA,IAAIM;cACb,OAAOtF;;QAKN,SAASuF,kBAAkBP;YAC9B;gBAGI,QAAO;cACT,OAAOhF;YAIT,QAAO;;QAGJ,SAASwF,gBAAgBR;YAI5B,IAAIC,YAFJD,MAAMA,OAAOrF,QAEMsF;YAEnB,KAAKA,UACD,MAAM,IAAIvD,MAAJ;YAGV,IAAIwD,WAAWD,SAASC;YAExB,KAAKA,UACD,MAAM,IAAIxD,MAAJ;YAGV,IAAIwD,aAAaZ,SAASE,MACtB,OAAWF,SAASE,OAApB;YAGJ,IAAIU,aAAaZ,SAASG,OAAO;gBAE7B,IAAIW,SAASD,UAAUH;gBACvB,OAAII,UAAUG,sBAEHC,gBAAgBJ,UAGhBd,SAASG,QAApB;;YAGJ,IAAIgB,OAAOR,SAASQ;YAEpB,KAAKA,MACD,MAAM,IAAI/D,MAAJ;YAGV,OAAWwD,WAAX,OAA0BO;;QAGvB,SAASC,gBAAUV;YAItB,IAAIW,SAASH,gBAFbR,MAAMA,OAAOrF;YAIb,OAAIgG,UAAUX,IAAIY,cAAwD,MAA1CZ,IAAIY,WAAW9D,QAAQwC,SAASC,QACrDS,IAAIY,aAGRD;;QAgEJ,SAASE,aAAab;YAEzB,KA9CG,SAA8BA;gBAEjC;oBACI,IAAIA,QAAQrF,QACR,QAAO;kBAGb,OAAOK;gBAIT;oBACI,IAAI8F,OAAOlI,OAAOmI,yBAAyBf,KAAK;oBAEhD,IAAIc,SAA4B,MAApBA,KAAKhI,YACb,QAAO;kBAGb,OAAOkC;gBAIT;oBAEI,IAAI+E,gBAAgBC,QAAQO,qBACxB,QAAO;kBAEb,OAAOvF;gBAIT;oBAEI,IAAIwF,gBAAgBR,SAASQ,gBAAgB7F,SACzC,QAAO;kBAGb,OAAOK;gBAIT,QAAO;aAKFgG,CAAqBhB,MACtB,QAAO;YAGX;gBAEI,IAAIA,QAAQrF,QACR,QAAO;gBAIX,IAAIoF,gBAAgBC,QAAQO,qBACxB,QAAO;gBAIX,IAAIG,gBAAU/F,YAAY+F,gBAAUV,MAChC,QAAO;cAGb,OAAOhF;YAIT,QAAO;;QAIJ,SAASiG,iBAAiBjB;YAC7B,KAAKa,aAAab,MACd,MAAM,IAAItD,MAAJ;YAIV,OAAOsD;;QAqBJ,SAASkB,iBAAiBd,QAAgCe;YAE7D,KAAKf,WAAWe,OACZ,QAAO;YAGX,IAAIC,cAAcjB,UAAUgB;YAE5B,OAAIC,cACOA,gBAAgBhB,UAGgB,MA9BxC,SAAoBJ;gBAEvB,IAAI5D,SAAS;gBAEb;oBAEI,MAAO4D,IAAII,WAAWJ,OAClB5D,OAAOW,KAAKiD,IAAII,SAChBJ,MAAMA,IAAII;kBAGhB,OAAOpF;gBAIT,OAAOoB;aAeHiF,CAAWF,OAAOrE,QAAQsD;;QAO3B,SAASkB,UAAUtB;YAEtB,IAEIuB,QAQAC,KAVApF,SAAS;YAIb;gBACImF,SAASvB,IAAIuB;cACf,OAAOvG;gBACLuG,SAASvB;;YAKb;gBACIwB,MAAMD,OAAOlH;cACf,OAAOW;YAIT,IAAY,MAARwG,KACA,OAAOpF;YAGX,IAAIoF,KAAK;gBACL,KAAK,IAAItJ,IAAI,GAAGA,IAAIsJ,KAAKtJ,KAAK;oBAE1B,IAAIuJ,aAAK;oBAET;wBACIA,QAAQF,OAAOrJ;sBACjB,OAAO8C;wBACL;;oBAGJoB,OAAOW,KAAK0E;;gBAGhB,OAAOrF;;YAGX,KAAK,IAAIlE,KAAI,GAAGA,KAAI,KAAKA,MAAK;gBAC1B,IAAIuJ,cAAK;gBAET;oBACIA,SAAQF,OAAOrJ;kBACjB,OAAO8C;oBACL,OAAOoB;;gBAGX,KAAKqF,QACD,OAAOrF;gBAGXA,OAAOW,KAAK0E;;YAGhB,OAAOrF;;QAIJ,SAASsF,kBAAkB1B;YAA4D,KAE1F,IAAI5D,SAAS,IAF6EuF,MAAA,GAAAC,cAIxEN,UAAUtB,MAJ8D2B,MAAAC,YAAAvH,QAAAsH,OAIxD;gBAA7B,IAAIF,QAAKG,YAAAD;gBACVvF,OAAOW,KAAK0E;gBADkB,SAAAI,MAAA,GAAAC,sBAGPJ,kBAAkBD,QAHXI,MAAAC,oBAAAzH,QAAAwH,OAI1BzF,OAAOW,KADQ+E,oBAAAD;;YAKvB,OAAOzF;;QAGJ,SAAS2F,OAAO/B;YAEnB,IAAKA,KAAL;gBAIA;oBACI,IAAIA,IAAIgC,KACJ,OAAOhC,IAAIgC;kBAEjB,OAAOhH;gBAIT,IAAImF,UAAUH,SAASA,KACnB,OAAOA;gBAGX;oBACI,IAAIkB,iBAAiBvG,QAAQqF,QAAQrF,OAAOqH,KACxC,OAAOrH,OAAOqH;kBAEpB,OAAOhH;gBAIT;oBACI,IAAIkG,iBAAiBlB,KAAKrF,WAAWA,OAAOqH,KACxC,OAAOrH,OAAOqH;kBAEpB,OAAOhH;gBA9BgE,SAAAiH,MAAA,GAAAC,sBAkCvDR,kBAAkB1B,MAlCqCiC,MAAAC,oBAAA7H,QAAA4H,OAkC/B;oBAArC,IAAIR,QAAKS,oBAAAD;oBACV;wBACI,IAAIR,MAAMO,KACN,OAAOP,MAAMO;sBAEnB,OAAOhH;oBAIT,IAAImF,UAAUsB,WAAWA,OACrB,OAAOA;;;;QAmBZ,SAASU,qBAAqBnC;YACjC,IAAIgC,MAAMD,OAAO/B;YAEjB,KAAKgC,KACD,MAAM,IAAItF,MAAJ;YAGV,UAAA0F,OAAYV,kBAAkBM,MAA9B,EAAoCA;;QAoDxC,IAAIK,gBAAgB,IAChBC,eAAe;QAEZ,SAASC,eAAevC,KAA6BwC;iBAAsC,MAAtCA,2BAAsB;YAE9E;gBACI,IAAIxC,QAAQrF,QACR,QAAO;cAEb,OAAOK;gBACL,QAAO;;YAGX;gBACI,KAAKgF,KACD,QAAO;cAGb,OAAOhF;gBACL,QAAO;;YAGX;gBACI,IAAIgF,IAAIyC,QACJ,QAAO;cAGb,OAAOzH;gBAIL,QAAIA,OAAOA,IAAI0H,YAAY5C;;YAQ/B,IAAI0C,aAAa3B,aAAab,MAC1B;gBAEI,IAAIA,IAAI2C,YACJ,QAAO;cAEb,OAAO3H;YAOb;gBACI,KAAKgF,IAAII,WAAWJ,IAAIgC,KACpB,QAAO;cAEb,OAAOhH;YAeT,IAAI4H,cAtFR,SAAwBC,YAAuBpI;gBAC3C,KAAK,IAAIvC,IAAI,GAAGA,IAAI2K,WAAWxI,QAAQnC,KAEnC;oBACI,IAAI2K,WAAW3K,OAAOuC,MAClB,OAAOvC;kBAEb,OAAO8C;gBAKb,QAAQ;aA0EU8H,CAAYT,eAAerC;YAE7C,KAAqB,MAAjB4C,aAAoB;gBACpB,IAAInB,QAAQa,aAAaM;gBAEzB,IAAInB,SA9GL,SAA6BA;oBAEhC,KAAKA,MAAMsB,eACP,QAAO;oBAGX,KAAKtB,MAAMuB,YACP,QAAO;oBAGX,IAAIC,MAAMxB,MAAMyB;oBAEhB,UAAID,QAAOA,IAAIE,mBAAoBF,IAAIE,gBAAgBC,SAAS3B;iBAkG/C4B,CAAoB5B,QAC7B,QAAO;;YAIf,QAAO;;QAkCJ,SAAS6B,mBAAatD;YAEzB,QADAA,MAAMA,OAAOrF,QACF4I,UAAUC,iBAAiBxD,IAAIuD,UAAUE;;QAIjD,SAASC,eAAe1D,KAA6BvH;YAAwC,KAEhG,IAAIkL,YAAYrC,UAAUtB,MAFsE4D,MAAA,GAAAA,MAIzED,UAJyEtJ,QAAAuJ,OAI9D;gBAA7B,IAAIC,aAAcF,UAAJC;gBACf;oBAEI,IAAI/C,aAAagD,eAAeA,WAAWpL,SAASA,SAA2C,MAAnCkL,UAAU7G,QAAQ+G,aAC1E,OAAOA;kBAEb,OAAO7I;;YAKb;gBAEI,KAA6C,MAAzC2I,UAAU7G,QAAQkD,IAAIuB,OAAO9I,QAE7B,OAAOuH,IAAIuB,OAAO9I;cAExB,OAAOuC;YAIT;gBACI,KAAsC,MAAlC2I,UAAU7G,QAAQkD,IAAIvH,QACtB,OAAOuH,IAAIvH;cAEjB,OAAOuC;;QAsDN,SAAS8I,SAAS1D,QAAgCe;YAErD,OAAOf,WAAWC,UAAUc;;QAGzB,SAAS4C,YAAY/D;YAKxB,OAFaK,UAFbL,MAAMA,OAAOrF,WAQAwF,UAAUH,aAEvB;;QA+DJ,SAASgE,SAASC,aAAaC;YAAuB,SAAAC,OAAA,GAAAA,OAEhCF,YAFgC5J,QAAA8J,QAEnB,KAA1B,IAAIC,QAASH,YAAJE,OAAiBE,OAAA,GAAAA,OACTH,YADS7J,QAAAgK,QAEvB,IAAID,UADUF,YAAJG,OAEN,QAAO;YAKnB,QAAO;;QAGJ,SAASC,mBAAmBtE;iBAA+C,MAA/CA,cAA8BrF;YAI7D,KAHA,IAAI4J,WAAW,GACXnE,SAASJ,KAENI,WACHA,SAASD,UAAUC,aAEfmE,YAAY;YAIpB,OAAOA;;QAqBJ,SAASC,gBAAgBC,MAA8BC;YAE1D,IAAIC,OAAO5C,OAAO0C,SAASA,MACvBG,OAAO7C,OAAO2C,SAASA;YAE3B;gBACI,IAAIC,QAAQC,MACR,OAAID,SAASC;cAMnB,OAAO5J;YAIT,IAAI6J,aAAa1C,qBAAqBsC,OAClCK,aAAa3C,qBAAqBuC;YAEtC,IAAIV,SAASa,YAAYC,aACrB,QAAO;YAGX,IAAIC,UAAU1E,UAAUsE,OACpBK,UAAU3E,UAAUuE;YAExB,SAAIG,WAAWf,SAAS7B,qBAAqB4C,UAAUD,gBAInDE,WAAWhB,SAAS7B,qBAAqB6C,UAAUH;YAC5C;;QAMR,SAASI,YAAYC,SAAyBC;YAEjD,IAAuB,mBAAZD,SAAsB;gBAE7B,IAAsB,mBAAXC,QACP,OAAOD,YAAYxF,YAAYyF,WAAWD;gBAG9C,IAAI7F,QAAQ8F,SACR,QAAO;gBAGX,IAAIC,MAAMC,QAAQF,SACd,QAAO;;YAIf,OAAI9F,QAAQ6F,WAEJ7F,QAAQ8F,UACDD,QAAQpK,eAAeqK,OAAOrK,cAGrCsK,MAAMC,QAAQF,WAKXG,QAAQH,OAAOI,MAAML,cAG5BE,MAAMC,QAAQH,aAEVE,MAAMC,QAAQF,UACPK,KAAKC,UAAUP,aAAaM,KAAKC,UAAUN,WAGlD9F,QAAQ8F,WAILD,QAAQQ,KAAK,SAAAC;gBAAU,OAAIV,YAAYU,YAAYR;;;QAgB3D,SAASS,iBAAiBC;YAI7B,OAAIA,IAAIN,MAAM,8BACDM,IAKGC,MAAM,KAAKC,MAAM,GAAG,GAAGC,KAAK,OAHjCtF;;QAQR,SAASuF,cAAcjG,KAA6BkG,UAAqB/G,OAAuBgH;YAEnG,IAAItI;YAuBJ,YAzB0J,MAA9EsB,kBAAiB,WAA6D,MAAvDgH,sBAAmBC;YAI1G,SAARC;gBAEA,IAAI9D,eAAevC,MAMf,OAJInC,WACAG,aAAaH,UAGVqI;gBAGPC,WAAW,IACXnI,aAAaH,YAEbsI,WAAWhH,OACXtB,UAAUhB,WAAWwJ,OAAOlH;aAIpCkH,IAEO;gBACHtH,QADG;oBAEKlB,WACAG,aAAaH;;;;QAOtB,SAASyI,SAASC;YAErB;gBACI,IAAIA,QAAQ5L,QACR,QAAO;cAEb,OAAOK;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAA4C,sBAAxClH,GAAiBkC,SAASzC,KAAKkO,MAC/B,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAInF,OAAOC,UAAU2L,eAAe5L,OAAOC,QACvC,QAAO;cAEb,OAAOI;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAI1O,SAAS0O,KACpB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAInG,WAAWmG,KACtB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAIf;gBACI,IAAIyG,OAAOA,IAAIvE,QAAQuE,KACnB,QAAO;cAEb,OAAOvL;gBACL,IAAIA,OAAOA,IAAI0H,YAAY5C,qBACvB,QAAO;;YAkBf,QAAO;;QAmBJ,SAAS0G,iBAAiBX;YAC7B,IAJyC,MAIvBD,iBAAiBC,KAJrB/I,QAAQwC,SAASC,OAK3B,OAAOsG;YAIP,MAAM,IAAInJ,MAAJ;;QC9/BP,SAASoG,iBAAeD,YAAuBpI;YAClD,KAAK,IAAIvC,IAAI,GAAGA,IAAI2K,WAAWxI,QAAQnC,KAEnC;gBACI,IAAI2K,WAAW3K,OAAOuC,MAClB,OAAOvC;cAEb,OAAO8C;YAKb,QAAQ;;QCPZ,ICmDIyL,WCodAC,wBFvgBA7N,iBAAiBD,OAAOC,gBACxB8N,UAAUC,KAAKC,QAAQ,KAEdC,iCAAb;YAOI,SAAAA;gBAMI,IANUhP,KALdW,YAKc,GAAAX,KAJdiP,eAIc,GAAAjP,KAHd4G,YAGc,GAAA5G,KAFdkP,cAEc;gBACVL,WAAW,GAGX7O,KAAKW,OAAL,gBAA0C,MAAhBwO,KAAKC,aAAmB,KAAlD,OAA0DP;gBGnB3D;oBAEH,IAAuB,sBAAZQ,SACP,QAAO;oBAGX,SAA6B,MAAlBvO,OAAOwO,QACd,QAAO;oBAGX;wBAEI,IAAIC,cAAc,IAAIF,WAClBG,UAAU;wBAOd,OAJA1O,OAAOwO,OAAOE,UAEdD,YAAYE,IAAID,SAJA,sCAMZD,YAAYtO,IAAIuO;sBAMtB,OAAOtM;wBAEL,QAAO;;iBHPHwM,IACA;oBACI1P,KAAKiP,UAAU,IAAII;kBACrB,OAAOnM;gBAKblD,KAAK4G,OAAQ,IACb5G,KAAKkP,SAAS;;YAtBtB,IAAAxK,SAAAsK,uBAAArK;YAAA,OAAAD,OAyBIiL,wBAAA;gBAKI,KAHA,IAAIV,UAAUjP,KAAKiP,SACfrI,OAAO5G,KAAK4G,MAEPxG,IAAI,GAAGA,IAAIwG,KAAKrE,QAAQnC,KAAK;oBAClC,IAAIiB,QAAQuF,KAAKxG;oBAEjB,IAAIoO,SAASnN,UAAUoJ,eAAepJ,QAAQ;wBAE1C,IAAI4N,SACA;4BACIA,QAAQW,OAAOvO;0BACjB,OAAO6B;wBAKb0D,KAAKM,OAAO9G,GAAG,IACfJ,KAAKkP,OAAOhI,OAAO9G,GAAG,IAEtBA,KAAK;;;eA9CrBsE,OAmDImL,oBAAA,SAAkBlO;gBAEd,QAAI6M,SAAS7M;eArDrB+C,OAmEI+K,MAAA,SAAI9N,KAASN;gBAET,KAAKM,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACIA,QAAQQ,IAAI9N,KAAKN;kBACnB,OAAO6B;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAerB;oBAEH,IAAIhB,OAAOX,KAAKW,MACZmP,QAAQnO,IAAIhB;oBAEZmP,SAASA,MAAM,OAAOnO,MACtBmO,MAAM,KAAKzO,QAEXN,eAAeY,KAAKhB,MAAM;wBACtBU,OAAU,EAAEM,KAAKN;wBACjB0O,WAAU;;uBAzBY;oBAE9B/P,KAAK2P;oBAEL,IAAI/I,OAAO5G,KAAK4G,MACZsI,SAASlP,KAAKkP,QACdc,QAAQhF,iBAAYpE,MAAMjF;qBAEf,MAAXqO,SACApJ,KAAK3B,KAAKtD,MACVuN,OAAOjK,KAAK5D,UAEZ6N,OAAOc,SAAS3O;;eA/FhCqD,OAkHIzD,MAAA,SAAIU;gBAEA,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACI,IAAIA,QAAQgB,IAAItO,MACZ,OAAOsN,QAAQhO,IAAIU;kBAEzB,OAAOuB;2BACElD,KAAKiP;;gBAIpB,KAAKjP,KAAK6P,kBAAkBlO,MAAM;oBAE9B3B,KAAK2P;oBAEL,IACIK,QAAQhF,iBADDhL,KAAK4G,MACcjF;oBAE9B,KAAe,MAAXqO,OACA;oBAGJ,OAAOhQ,KAAKkP,OAAOc;;gBAInB,IAAIF,QAAQnO,IAAI3B,KAAKW;gBAErB,IAAImP,SAASA,MAAM,OAAOnO,KACtB,OAAOmO,MAAM;eAtJ7BpL,OA2JIkL,SAAA,SAAOjO;gBAEH,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACIA,QAAQW,OAAOjO;kBACjB,OAAOuB;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAYrB;oBAEH,IAAImO,QAAQnO,IAAI3B,KAAKW;oBAEjBmP,SAASA,MAAM,OAAOnO,QACtBmO,MAAM,KAAKA,MAAM,UAAKnK;uBAjBI;oBAE9B3F,KAAK2P;oBAEL,IAAI/I,OAAO5G,KAAK4G,MACZoJ,QAAQhF,iBAAYpE,MAAMjF;qBAEf,MAAXqO,UACApJ,KAAKM,OAAO8I,OAAO,IACnBhQ,KAAKkP,OAAOhI,OAAO8I,OAAO;;eApL1CtL,OAiMIuL,MAAA,SAAItO;gBAEA,KAAKA,KACD,MAAM,IAAIiD,MAAJ;gBAGV,IAAIqK,UAAUjP,KAAKiP;gBAEnB,IAAIA,SACA;oBACI,IAAIA,QAAQgB,IAAItO,MACZ,QAAO;kBAEb,OAAOuB;2BACElD,KAAKiP;;gBAIpB,IAAKjP,KAAK6P,kBAAkBlO,MAOrB;oBAEH,IAAImO,QAAQnO,IAAI3B,KAAKW;oBAErB,UAAImP,SAASA,MAAM,OAAOnO;;gBAN1B,OAHA3B,KAAK2P,0BAGa,MADN3E,iBAAYhL,KAAK4G,MAAMjF;eAvN/C+C,OAsOIwL,WAAA,SAASvO,KAASf;gBACd,IAAIZ,KAAKiQ,IAAItO,MAET,OAAO3B,KAAKiB,IAAIU;gBAGpB,IAAIN,QAAQT;gBAEZ,OADAZ,KAAKyP,IAAI9N,KAAKN,QACPA;eA9Of2N;SAAA;QCFO,SAASmB,aAAaC;YACzB,IAAoB,qBAATC,MACP,OAAOA,KAAKD;YACT,IAAsB,sBAAXE,QACd,OAAOA,OAAOC,KAAKH,KAAK,QAAQpN,SAAS;YAG7C,MAAM,IAAI4B,MAAJ;;QAeH,SAAS4L;YAEZ,IAAIC,QAAQ;YAUZ,OARe,aAAaC,QAAQ,MAAM;gBACtC,OAAOD,MAAME,OAAOxB,KAAKyB,MAAMzB,KAAKC,WAAWqB,MAAMlO;iBAOzD,MAJa4N,aACT,IAAIrB,OAAO+B,cAAc5C,MAAM,IAAI,IAAIyC,QAAQ,KAAK,MACtDA,QAAQ,iBAAiB,IAAII;;QAsCnC,SAASC,cAAc3J;YACnB;gBACI,OAAOsG,KAAKC,UAAUL,GAAgBW,MAAM1N,KAAK6G,OAAO,SAAC4J,QAAQC;oBAC7D,OAAmB,qBAARA,MACP,aAtBT,SAAqBxC;wBAIxB,IAFAE,YAAYA,aAAa,IAAIU,kCAEzBZ,eAAqD,mBAARA,OAAmC,qBAARA,KACxE,MAAM,IAAI7J,MAAJ;wBAGV,IAAIsM,MAAMvC,UAAU1N,IAAIwN;wBAOxB,OALKyC,QACDA,aAAiBzC,MAAd,MAAuB+B,YAC1B7B,UAAUc,IAAIhB,KAAKyC,OAGhBA;qBAOwBC,CAAYF,OAA/B,MAEGA;;cAEb,OAAO/N;gBACL,MAAM,IAAI0B,MAAJ;;;QA2CP,SAASwM,eAAkBrK;YAC9B,IAAIsK,QAAQ;YAGZ,SAASC;gBAAgE,SAAAC,QAAAjP,UAAAC,QAArC6E,OAAqC,IAAAkG,MAAAiE,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAArCpK,KAAqCoK,SAAAlP,UAAAkP;gBACrE,IAAI7P,MAAeoP,cAAc3J;gBAEjC,OAAIiK,MAAMrP,eAAeL,OACd0P,MAAM1P,QAGjB0P,MAAM1P,OAAOoF,OAAOtE,MAAMzC,MAAMsC,WAC3BsD,QAAQ;2BACEyL,MAAM1P;oBAGd0P,MAAM1P;;YAOjB,OAJA2P,wBAAwBG,QAAQ;gBAC5BJ,QAAQ;eAGLC;;QAiBJ,SAASI,cAAiB3K,QAAsC4K,OAAqCvK;iBAA4B,MAA5BA,gBAAoB;YAC5H,IAAIiK,QAAQtK,OAAO6K,2BAA2B7K,OAAO6K,4BAA4B,IAC7EjQ,MAAMoP,cAAc3J;YAExB,OAAIiK,MAAMrP,eAAeL,OACd0P,MAAM1P,OAGJ0P,MAAM1P,OAAOgQ,MAAKlP,WAAL,GAAS2E;;QAKhC,SAASyK;QAIT,SAASC,KAAK/K;YACjB,IAAIgL,UAAS;YAEb,OAAO;gBACH,KAAKA,QAED,OADAA,UAAS,GACFhL,OAAOtE,MAAMzC,MAAMsC;;;QAkE/B,SAAS0P,eAAe9O,KAAa+O;YAExC,SAFqE,MAA7BA,kBAAiB,IAErDA,SAAS,GACT,OAAO;YAGX;gBACI,KAAK/O,KACD,4BAA2BpC,GAAiBkC,SAASzC,KAAK2C,OAA1D;gBAGJ,IAAmB,mBAARA,KACP,OAAOA;gBAGX,IAAIA,eAAe0B,OAAO;oBACtB,IAAIP,QAAQnB,OAAOA,IAAImB,OACnBuG,UAAU1H,OAAOA,IAAI0H;oBAEzB,IAAIvG,SAASuG,SACT,QAAgC,MAA5BvG,MAAMW,QAAQ4F,WACPvG,QAEIuG,UAAX,OAAyBvG;oBAE1B,IAAIA,OACP,OAAOA;oBACJ,IAAIuG,SACP,OAAOA;;gBAIf,OAA4B,qBAAjB1H,IAAIF,WACJE,IAAIF,aAGRlC,GAAiBkC,SAASzC,KAAK2C;cAExC,OAAOgP;gBACL,4CAA2CF,eAAeE,QAAQD,QAAQ;;;QAuB3E,SAAStE,UAAUhL;YACtB,OAAoB,mBAATA,OACAA,OAGPA,QAAiC,qBAAlBA,KAAKK,WACbL,KAAKK,aAGTlC,GAAiBkC,SAASzC,KAAKoC;;QAsBnC,SAASwP,OAA8B1D,KAASjM;YACnD,KAAKA,QACD,OAAOiM;YAGX,IAAI3N,OAAOsB,QACP,OAAOtB,OAAOsB,OAAOqM,KAAKjM;YAG9B,KAAK,IAAIb,OAAOa,QACRA,OAAOR,eAAeL,SACtB8M,IAAI9M,OAAOa,OAAOb;YAI1B,OAAO8M;;QA8FJ,SAAS2D,aAAarL,QAAmBf;YAE5C,IAAID;YAWJ,OATA,SAASsM;gBACLtM,UAAUhB,WAAW;oBACjBgC,UACAsL;mBACDrM;aAGPqM,IAEO;gBACHpL,QADG;oBAECf,aAAaH;;;;QAmZlB,SAASuM,UAAUjR;YACtB,OAAOA;;QAoBJ,SAASkG,aAAQ5E;YACpB,OAAgD,sBAAzC7B,GAAiBkC,SAASzC,KAAKoC;;QAiCnC,SAASuN,cAAgCzB,KAAS9M,KAAcf;YACnE,IAAI6N,IAAIzM,eAAeL,MACnB,OAAO8M,IAAI9M;YAGf,IAAMsP,MAAMrQ;YAEZ,OADA6N,IAAI9M,OAAOsP,KACJA;;QASJ,SAASsB,QAAQ9D;YAEpB,IAAM+D,QAAQ,IACVC,WAAU;YAEd,OAAO;gBACHhD,KADG,SACY9O,MAAegC;oBAO1B,OANK8P,YACDhE,IAAI9N,QAAQgC,MACZ3C,KAAK0S,SAAS;+BACHjE,IAAI9N;yBAGZgC;;gBAGX+P,UAXG,SAWM3L;oBACD0L,UACA1L,WAEAyL,MAAMvN,KAAK6M,KAAK/K;;gBAIxBV,KAnBG;oBAoBC,IAAMG,UAAU;oBAGhB,KAFAiM,WAAU,GAEHD,MAAMjQ,UAAQ;wBACjB,IAAMoQ,OAAOH,MAAMI;wBACnBpM,QAAQvB,KAAK0N;;oBAGjB,OAAO/O,qBAAayC,IAAIG,SAASvD,KAAK4O;;;;QA0B3C,SAASgB,aAAgBlS,MAAemS;YAC3C,IAAIA,eACA,MAAM,IAAIlO,MAAJ,cAAuBjE,OAAvB;YAGV,OAAOmS;;QCt+BJ,SAASC;YACZ,OAAOvF,QAAQwF,SAASC,SAAiC,eAAxBD,SAASE;;QAGvC,SAASC,UAAU/C;YACtB,OAAOA,IAAIM,QAAQ,OAAO,OAAOA,QAAQ,MAAM,OAAOA,QAAQ,MAAM,OAAOA,QAAQ,OAAO;;QAevF,SAAS0C;YACZ,OAAO1B,cAAc0B,sBAAsB;gBACvC,OAAO,IAAIxP,qBAAa,SAAAH;oBAEpB,IAAIsP,mBACA,OAAOtP;oBAGX,IAAI4P,WAAWC,YAAY;wBACvB,IAAIP,mBAEA,OADAQ,cAAcF,WACP5P;uBAEZ;;;;QAeR,SAAS+P,WAAWC;YACvB,OAAO/B,cAAc8B,YAAY;gBAC7B,IAAIE,SAAS;gBAEb,KAAKD,aACD,OAAOC;gBAGX,KAAkC,MAA9BD,YAAYzO,QAAQ,MACpB,OAAO0O;gBARiC,SAAAC,MAAA,GAAAC,sBAW3BH,YAAYzF,MAAM,MAXS2F,MAAAC,oBAAArR,QAAAoR,OAWH;oBAApC,IAAIE,OAAID,oBAAAD;qBACTE,OAAOA,KAAK7F,MAAM,MAET,MAAM6F,KAAK,OAChBH,OAAOI,mBAAmBD,KAAK,OAAOC,mBAAmBD,KAAK;;gBAItE,OAAOH;eACR,EAAED;;QAkCF,SAASM,YAAYC,eAAwBC;YAEhD,YAF+F,MAA/CA,kBAAkC,KAE7EA,SAAUnT,OAAO8F,KAAKqN,OAAO1R,eAXmC,OAA7CkM,MAeLtM,SAAA,IACZqR,WAAWQ,gBACXC,YAjBiBxF,MAAgC;YAEjD3N,OAAO8F,KAAK6H,KAAKyF,OAAO,SAAAvS;gBAC3B,OAA2B,mBAAb8M,IAAI9M;eACnBkF,IAAI,SAAAlF;gBACH,OAAWwR,UAAUxR,OAArB,MAA+BwR,UAAU1E,IAAI9M;eAC9CuM,KAAK,QAMG8F;YAZR,IAAqBvF;;QA6MrB,SAAS0F,YAAYC,WAAyB/K;YACjD+K,UAAUD,YAAY9K;;QAGnB,SAASgL,UAAUC;YAEtB,OAAIA,mBAAmBzR,OAAO0R,WAId,SAAZD,WAAuC,mBAAZA,WAA6C,MAArBA,QAAQE,YAA2C,mBAAlBF,QAAQG,SAAuD,mBAA1BH,QAAQlJ;;QAOlI,SAASsJ,eAAeC,IAAqBxJ;YAEhD,YAFwG,MAAxDA,cAA+B6H,WAE3EqB,UAAUM,MAEHA,KAGO,mBAAPA,KACAxJ,IAAIyJ,cAAcD,WAD7B;;QAgBG,SAASE,aAAaF;YACzB,OAAO,IAAI/Q,qBAAa,SAACH,SAASgB;gBAE9B,IAAI9D,OAAOgN,UAAUgH,KACjBG,KAAKJ,eAAeC;gBAExB,IAAIG,IACA,OAAOrR,QAAQqR;gBAGnB,IAAI/B,mBACA,OAAOtO,OAAO,IAAIG,MAAJ,mCAA4CjE,OAA5C;gBAGlB,IAAI0S,WAAWC,YAAY;oBAIvB,QAFAwB,KAAKJ,eAAeC,QAGhBpB,cAAcF,WACP5P,QAAQqR,OAGf/B,qBACAQ,cAAcF;oBACP5O,OAAO,IAAIG,MAAJ,mCAA4CjE,OAA5C,4BAFlB;mBAID;;;QAIJ,SAASoU,eAAenK;YAC3B5K,KAAK4K,UAAUA;;QA6IZ,SAASoK,eAAerL;YAG3B,KAFAiF,yBAAyBA,0BAA0B,IAAIS,kCAE5BY,IAAItG,QAAQ;gBACnC,IAAInG,WAAUoL,uBAAuB3N,IAAI0I;gBACzC,IAAInG,UACA,OAAOA;;YAIf,IAAIA,UAAU,IAAII,qBAAa,SAACH,SAASgB;gBACrCkF,MAAMsL,iBAAiB,QAAQ;qBJYhC,SAAyBtL;wBAI5B,IArBJ;4BACI,KAAK,IAAIvJ,IAAI,GAAGA,IAAImK,cAAchI,QAAQnC,KAAK;gCAC3C,IAAIuK,UAAS;gCAEb;oCACIA,SAASJ,cAAcnK,GAAGuK;kCAC5B,OAAOzH;gCAILyH,WACAH,aAAatD,OAAO9G,GAAG,IACvBmK,cAAcrD,OAAO9G,GAAG;;yBAOhC8U,IAEIvL,SAASA,MAAMsB,eACf;4BACIV,cAActF,KAAK0E,MAAMsB,gBACzBT,aAAavF,KAAK0E;0BACpB,OAAOzG;sBInBLiS,CAAgBxL,QAChBlG,QAAQkG;oBAGZA,MAAMsL,iBAAiB,SAAS,SAAC/R;oBACzByG,MAAMsB,gBACNxH,QAAQkG,SAERlF,OAAOvB;;;YAOnB,OAFA0L,uBAAuBa,IAAI9F,OAAOnG,UAE3BA;;QAGJ,SAAS4R,iBAAiBzL;YAC7B,OAAOqL,eAAerL,OAAO1G,KAAK,SAAAoS;gBAE9B,KAAKA,YAAYpK,eACb,MAAM,IAAIrG,MAAJ;gBAGV,OAAOyQ,YAAYpK;;;QA+DpB,SAASqK,WAAOC,SAAyCnB;iBAA8C,MAAvFmB,sBAAqC;YAExD,IACId,QAAQc,QAAQd,SAAS,IAEzB9K,QAhED,SAAuB6L,KAAsBD,SAAmCnB;qBAAwC,MAAjGoB,cAAe,aAAkF,MAA3ED,sBAA+B,KAE/EC,MAAMA,IAAI1E;gBACV,IAjEqBgE,IAAkBW,WAAoBtK,KAiEvDmJ,UAAUtB,SAAS0C,cAAcF;gBAcrC,IAZID,QAAQd,SACRtC,OAAOmC,QAAQG,OAAOc,QAAQd,QAG9Bc,QAAQI,UACRrB,QAAQsB,YAAYL,QAAQI,MAAMzH,KAAK;gBAGvCqH,QAAQZ,MACRL,QAAQuB,aAAa,MAAMN,QAAQZ,KAGnCY,QAAQO,YAAY,SAAAC,MAAA,GAAAC,gBACJlV,OAAO8F,KAAK2O,QAAQO,aADhBC,MAAAC,cAAAzT,QAAAwT,OAC6B;oBAA5C,IAAIpU,MAAGqU,cAAAD;oBACRzB,QAAQuB,aAAalU,KAAK4T,QAAQO,WAAWnU;;gBAYrD,IARI4T,QAAQU,eArFSnB,KAsFRR,SAtF0BmB,YAsFjBF,QAAQU,iBAtF+D,MAAlC9K,cAAiBtI,OAAOmQ;gBAE/E8B,GAAGmB,aAEHnB,GAAGmB,WAAWC,UAAUT,YAExBX,GAAGX,YAAYhJ,IAAIgL,eAAeV;gBAuFlCF,QAAQa,MACR;oBAAA,IAAY,aAARZ,KAGI,MAAM,IAAI5Q,MAAJ;oBAOV0P,QAAQ+B,YAAYd,QAAQa;;gBAIpC,OAAO9B;aAkBKoB,CAAc,UAAU;gBAChCI,YAAY3T,SAAA;oBACRmU,mBAAmB;mBALVf,QAAQO,cAAc;gBAQnCrB,OAAOtS,SAAA;oBACHoU,iBAAiB;oBACjBC,QAAiB;mBACd/B;gBAEP2B,MAAOb,QAAQa;gBACfT,OAAOJ,QAAQI;gBAGbc,OAAO5T,OAAO4I,UAAUE,UAAU8B,MAAM;YAmB9C,OAjBK9D,MAAM+M,aAAa,SACpB/M,MAAMkM,aAAa,MAAMrF,aAI7BwE,eAAerL;YAEXyK,aAxTD,SAAoBO,IAAqBxJ;qBAAuD,MAAvDA,cAA+B6H;gBAE3E,IAAIsB,UAAUI,eAAeC,IAAIxJ;gBAEjC,IAAImJ,SACA,OAAOA;gBAGX,MAAM,IAAI1P,MAAJ,2BAAoC+I,UAAUgH;aAiTvCgC,CAAWvC,WACjBD,YAAYxK,SAGf4L,QAAQxH,OAAO0I,SACf9M,MAAMkM,aAAa,OAAON,QAAQxH,OAAO;YAItCpE;;QAGJ,SAASsL,iBAAiBxG,KAAmBmI,OAAgB/S;YAEhE,OADA4K,IAAIwG,iBAAiB2B,OAAO/S,UACrB;gBACHoD,QADG;oBAECwH,IAAIoI,oBAAoBD,OAAO/S;;;;QAmJpC,SAASiT,eAAexC;YACvBA,WAAWA,QAAQpJ,cACnBoJ,QAAQpJ,WAAW6L,YAAYzC;;QAwBhC,SAAS0C,gBAAgBlC;YAC5B,QAAKA,OAAOA,GAAG5J;;QAoDZ,SAAS+L,SAASnC,IAAkBjR,SAApCqT;YAAwL,IAAAC,aAAA,MAAAD,QAAT,KAASA,OAAAE,cAAAD,MAAzFE,oBAAyF,MAAAD,4BAAAE,eAAAH,MAA3EI,sBAA2E,MAAAD,8BAAAE,iBAAAL,MAA5D9D,0BAA4D,MAAAmE,iBAAjD,MAAiDA,gBAAAC,YAAAN,MAA5CjP,gBAA4C,MAAAuP,YAAtC5U,SAAsC4U,WACvLC,eAAe5C,GAAG6C,aAClBC,gBAAgB9C,GAAG+C;YAEvBhU,QAAQ;gBAAEwT,OAAOK;gBAAcH,QAAQK;;YAEvC,IAYIE,UACA/R,SAbAwI,QAAQ;gBACR,IAAIwJ,WAAWjD,GAAG6C,aACdK,YAAYlD,GAAG+C;iBAEdR,SAASU,aAAaL,gBAAkBH,UAAUS,cAAcJ,kBACjE/T,QAAQ;oBAAEwT,OAAOU;oBAAUR,QAAQS;oBAGvCN,eAAeK,UACfH,gBAAgBI;;YA2BpB,YArBkC,MAAvB9P,IAAI+P,kBACXH,WAAW,IAAI5P,IAAI+P,eAAe1J,QACzB2J,QAAQpD,WAEsB,MAAzB5M,IAAIiQ,qBAClBL,WAAW,IAAI5P,IAAIiQ,iBAAiB5J,QAC3B2J,QAAQpD,IAAI;gBACjBgB,aAAe;gBACfsC,YAAe;gBACfC,UAAe;gBACfC,gBAAe;gBAEnBpQ,IAAI+M,iBAAiB,UAAU1G,UAEpB,SAAP8D;gBACA9D,SACAxI,UAAUhB,WAAWsN,MAAMgB;aAE/BhB,IAGG;gBACHpL,QAAQ;oBACJ6Q,SAASS,cACT1V,OAAOgU,oBAAoB,UAAUtI,QACrCrI,aAAaH;;;;QE/6BlB,SAASyS,OAAOpI;YACnB,OAAsB,mBAARA,OAAqB,YAAaqI,KAAKrI;;QAGlD,SAASsI,KAAKtI;YACjB,OAAsB,mBAARA,OAAqB,aAAcqI,KAAKrI;;QAGnD,SAASuI,MAAM1H;YAElB,IAAmB,mBAARA,KACP,OAAOA;YAGX,IAAIxD,QAAQwD,IAAIxD,MAAM;YAEtB,KAAKA,OACD,MAAM,IAAI7I,MAAJ,oCAA6CqM;YAGvD,OAAO2H,SAASnL,MAAM,IAAI;;QAGvB,SAASoL,KAAK5H;YACjB,OAAW0H,MAAM1H,OAAjB;;QAGG,SAAS6H,MAAM7H;YAElB,OAAmB,mBAARA,MACA4H,KAAK5H,OAGTuH,OAAOvH,OAAOA,MAAM4H,KAAK5H;;QAO7B,SAAS8H,mBAAmBC,KAAuBC;YACtD,IAAmB,mBAARD,KACP,OAAOA;YACJ,IAAIR,OAAOQ,MACd,OAPGJ,SAOWK,MAPIN,MAOCK,OAPc,KAAK;YAQnC,IAAIN,KAAKM,MACZ,OAAOL,MAAMK;YAEb,MAAM,IAAIpU,MAAJ,kCAA2CoU;;QFoVzDjE,eAAepQ,YAAY7D,OAAOY,OAAOkD,MAAMD;QGpYxC,ICWMuU,eAAe;YACxBC,QAAc;YACdC,OAAc;YACdC,aAAc;WASLC,qBAAqB,wBAGrB1R,qBAAW,KAEX2R,qBAAqB;YAC9BC,4BAA6B;YAC7BC,uBAA6B;YAC7BC,qBAA6B;;QC3B1B,SAASC,iBAAUzR;YACtB,YADoE,MAA9CA,cAA6BrF,SAC/CqF,QAAQrF,SACDqF,IAAG,yBAEUA,IAAG,yBAAkCA,IAAG,0BAAmC;;QASvG,IAAM0R,SAAwB;YAAA,OAAO;;QAe9B,SAASC,YAAuBlY,KAAyBmY;YAC5D,YADgH,MAA7EnY,cAAgB,eAA6D,MAApDmY,wBAA2BF;YAChF1J,cAASyJ,oBAAahY,KAAK;gBAC9B,IAAIoY,QAAQD;gBAEZ,OAAO;oBACH7J,KAAK,SAAC+J;wBACF,OAAOD,MAAM/X,eAAegY;;oBAEhC/Y,KAAK,SAAC+Y,UAAUC;wBAEZ,OAAOF,MAAM/X,eAAegY,YAAYD,MAAMC,YAAYC;;oBAE9DxK,KAAK,SAACuK,UAAU/I;wBAEZ,OADA8I,MAAMC,YAAY/I,KACXA;;oBAEXiJ,KAAK,SAACF;+BACKD,MAAMC;;oBAEjB9J,UAAU,SAAC8J,UAAUpZ;wBAEjB,OAAOsP,cAAS6J,OAAOC,UAAUpZ;;oBAErC6Q,OAAO;wBACHsI,QAAQD;;oBAEZlT,MAAM;wBACF,OAAO9F,OAAO8F,KAAKmT;;;;;QAM5B,IAAMI,WAAb;QAEO,SAASC;YACZ,IAAMC,SAASV;YAEf,OADAU,OAAOC,kBAAkBD,OAAOC,mBAAmB,IAAIH,YAChDE,OAAOC;;QAYX,SAASC,YAAe5Y,KAAyBmY;YACpD,YADwG,MAA7EnY,cAAgB,eAA6D,MAApDmY,wBAA2BF;YACxEC,YAAY,eAAe3J,SAASvO,KAAK;gBAC5C,IAAM6Y,WAAW,IAAInL,kCAEfoL,WAAW,SAACvS;oBACd,OAAOsS,SAAStK,SAAShI,KAAK4R;;gBAGlC,OAAO;oBACH7J,KAAK,SAAC/H;wBAEF,OADcuS,SAASvS,KACVlG,eAAeL;;oBAEhCV,KAAK,SAACiH,KAAK+R;wBACP,IAAMF,QAAQU,SAASvS;wBAEvB,OAAO6R,MAAM/X,eAAeL,OAAOoY,MAAMpY,OAAOsY;;oBAEpDxK,KAAK,SAACvH,KAAK+I;wBAGP,OAFcwJ,SAASvS,KACjBvG,OAAOsP,KACNA;;oBAEXiJ,KAAK,SAAChS;+BACYuS,SAASvS,KACVvG;;oBAEjBuO,UAAU,SAAChI,KAAKtH;wBAEZ,OAAOsP,cADOuK,SAASvS,MACAvG,KAAKf;;;;;QCvG5C,SAAS8Z;YACL,OAAOb,YAAY,YAAY3J,SAAS,cAAcM;;QAG1D,SAASmK,gBAAgBzS;YAErB,OADsBqS,YAAY,iBACbrK,SAAShI,KAAK;gBAAA,OAAM,IAAItE;;;QAU1C,SAASgX,SAAS1S,KAAlB2S;YACH,QAAOC,GADiKD,MAApHC,MACxC5S,KAAKgR,aAAaE,OAAO;gBAAE2B,YAAYL;eAAmB;gBAAE7R,QAAQjB;gBAAU7B,UAAU;eAC/F9C,KAAK,SAAA+X;gBAAsC,IAAnC3N,SAAmC2N,MAAnC3N,QAAgB0N,aAAmBC,MAA3BC,KAAQF;gBAErB,OADAJ,gBAAgBzS,KAAKzE,QAAQ;oBAAEyE;oBAAKW,QAAQwE;oBACrC;oBAAEnF;oBAAKW,QAAQwE;oBAAQ0N;;;;QAInC,SAASG,oBAAoBhT,KAA7BiT;YAAiH,IAArDL,OAAqDK,MAArDL;YAC/D,OAAOP,YAAY,4BAA4BrK,SAAShI,KAAK;gBACzD,OAAO0S,SAAS1S,KAAK;oBAAE4S;mBAAQ7X,KAAK,SAAAmY;oBAAA,OAAAA,MAAGL;;;;QAiBxC,SAASM,iBAAiBnT,KAA6BnC,SAAyBpF;iBAA2F,MAApHoF,sBAAmB,WAAiG,MAA3FpF,gBAAgB;YACnG,IAAI6C,UAAUmX,gBAAgBzS;YAM9B,QAJiB,MAAbnC,YACAvC,UAAUA,QAAQuC,QAAQA,SAAS,IAAInB,MAAUjE,OAAd,yBAA2CoF,UAA3C;YAGhCvC;;QCtDJ,SAAS8X,gBAAgBpT;YACPqS,YAAY,gBACpB9K,IAAIvH,MAAK;;QCNnB,iBAAMqT,OAAO;YAChBC,UAAY;YACZC,OAAY;YACZC,SAAY;YACZC,OAAY;YACZC,MAAY;YACZC,OAAY;YACZC,QAAY;YACZC,QAAY;YACZC,QAAY;YACZC,SAAY;YACZC,MAAY;YACZC,WAAY;;QCTT,SAASC,iBAAiBzZ;YAC7B,OAAwB,mBAATA,QAA8B,SAATA,QAA0C,mBAAlBA,KAAK0Z;;QAG9D,SAASC,cAAcrL;YAC1B,YAAmB,MAARA,MACAsK,KAAKY,YAGJ,SAARlL,MACOsK,KAAKW,OAGZ5O,MAAMC,QAAQ0D,OACPsK,KAAKM,QAGG,qBAAR5K,MACAsK,KAAKC,WAGG,mBAARvK,MAEHA,eAAerM,QACR2W,KAAKE,QAGQ,qBAAbxK,IAAIhO,OACJsY,KAAKG,UAG4B,sBAAxC5a,GAAiBkC,SAASzC,KAAK0Q,OACxBsK,KAAKI,QAG4B,oBAAxC7a,GAAiBkC,SAASzC,KAAK0Q,OACxBsK,KAAKK,OAGTL,KAAKO,SAGG,mBAAR7K,MACAsK,KAAKQ,SAGG,mBAAR9K,MACAsK,KAAKS,SAGG,oBAAR/K,MACAsK,KAAKU,eADhB;;QAKG,SAASM,cAAqCC,MAAUvL;YAC3D,OAAO;gBACHoL,UAAUG;gBACVC,SAAUxL;;;QCxBlB,mBAAMyL,eAAwBC,cAAA,IACxBpB,KAAKC,YCpCJ;QDmCuBmB,YAExBpB,KAAKE,SE5BJ,SAAAmB;YACH,OAAOL,cAAchB,KAAKE,OAAO;gBAAE7Q,SADqFgS,KAA3FhS;gBACevG,OAD4EuY,KAAlFvY;gBACawY,MADqED,KAA3EC;;WF0BnBF,YAGxBpB,KAAKG,WGtCJ,eHmCuBiB,YAIxBpB,KAAKI,SInCJ,SAAwB1K;YAC3B,OAAOsL,cAAchB,KAAKI,OAAO1K,IAAIzO;WJ8BXma,YAKxBpB,KAAKK,QKpCJ,SAAuB3K;YAC1B,OAAOsL,cAAchB,KAAKK,MAAM3K,IAAI6L;WL8BVH,YAMxBpB,KAAKM,SMzCJ,SAAmC5K;YACtC,OAAOA;WNkCmB0L,YAOxBpB,KAAKO,UO1CJ,SAAyB7K;YAC5B,OAAOA;WPkCmB0L,YAQxBpB,KAAKQ,UQ3CJ,SAAyB9K;YAC5B,OAAOA;WRkCmB0L,YASxBpB,KAAKS,US5CJ,SAAyB/K;YAC5B,OAAOA;WTkCmB0L,YAUxBpB,KAAKU,WU7CJ,SAA0BhL;YAC7B,OAAOA;WVkCmB0L,YAWxBpB,KAAKW,QW9CJ,SAAuBjL;YAC1B,OAAOA;WXkCmB0L,cAexBI,qBAAmC,IYhBnCC,iBAA4BC,gBAAA,IAC5B1B,KAAKC,YX/BJ;YACH,MAAM,IAAI5W,MAAJ;WW6BwBqY,cAE5B1B,KAAKE,SVvBJ,SAAAtE;YAA8E,IAAzC9S,QAAyC8S,MAAzC9S,OAAOwY,OAAkC1F,MAAlC0F,MACzC3Y,QAAQ,IAAIU,MAD+DuS,MAAlDvM;YAK/B,OAFA1G,MAAM2Y,OAAOA,MACb3Y,MAAMG,QAAYA,QAAlB,SAAgCH,MAAMG,OAC/BH;WUgBuB+Y,cAG5B1B,KAAKG,WTjCJ;YACH,MAAM,IAAI9W,MAAJ;WS6BwBqY,cAI5B1B,KAAKI,SR9BJ,SAA0B1K;YAE7B,OAAO,IAAIiM,OAAOjM;WQwBYgM,cAK5B1B,KAAKK,QP/BJ,SAAyB3K;YAC5B,OAAO,IAAInC,KAAKmC;WOyBcgM,cAM5B1B,KAAKM,SNpCJ,SAAqC5K;YACxC,OAAOA;WM6BuBgM,cAO5B1B,KAAKO,ULrCJ,SAA2B7K;YAC9B,OAAOA;WK6BuBgM,cAQ5B1B,KAAKQ,UJtCJ,SAA2B9K;YAC9B,OAAOA;WI6BuBgM,cAS5B1B,KAAKS,UHvCJ,SAA2B/K;YAC9B,OAAOA;WG6BuBgM,cAU5B1B,KAAKU,WFxCJ,SAA4BhL;YAC/B,OAAOA;WE6BuBgM,cAW5B1B,KAAKW,QDzCJ,SAAyBjL;YAC5B,OAAOA;WC6BuBgM,gBAe5BE,uBAAuC;QC5CtC,SAASC;YAEZ,SAAI5R,mBAAa3I,QAAQ4K,MAAM;;QAO5B,SAAS4P,kBAAkBnV;YAE9B,QAAKwE,gBAAgB7J,QAAQqF;;QAO1B,SAASoV,qBAAqBzU,QAAkBX;YAEnD,IAAIW;gBACA,IAAID,sBAAgBkF,iBAAiBjF,SACjC,QAAO;mBAER,IAAIX,QACFa,aAAab,MACd,QAAO;YAIf,QAAO;;QAGJ,SAASqV,YAATX;YAAqG,IAA9E1U,MAA8E0U,KAA9E1U,KAAKW,SAAyE+T,KAAzE/T;YAE/B,UAAKuU,2BAIDvU,WAAWyU,qBAAqBzU,QAAQX,QAIxCA,QAAQmV,kBAAkBnV;;QAO3B,SAASsV,cAAc3U;YAI1B,IAAM4U,mBAFN5U,SAASA,UAAUiF,iBAAiBjF,SAEL6H,QAAQ,kBAAkB;YAIzD,OAFe4I,qBAAP,MAA+BmE;;QAKpC,SAASC;YACZ,OAAOlQ,QAAQ3K,OAAOlC,QAAQkC,OAAOlC,SAAS6c,cAAc5U;;QAGzD,IAAM+U,oBAAoB,IAAI/Z,qBAAa,SAAAH;YAE9C,IAAIZ,OAAOmQ,YAAYnQ,OAAOmQ,SAASC,MACnC,OAAOxP,QAAQZ,OAAOmQ,SAASC;YAGnC,IAAMI,WAAWC,YAAY;gBACzB,IAAIzQ,OAAOmQ,YAAYnQ,OAAOmQ,SAASC,MAEnC,OADAM,cAAcF,WACP5P,QAAQZ,OAAOmQ,SAASC;eAEpC;;QAGA,SAAS2K,qBAAqB1V;YACJqS,YAAY,wBACpBrK,SAAShI,KAAK;gBAAA,OAAM,IAAItE;;;QAG1C,SAASia,iBAAiB3V;YAC7B,IACM4V,mBADuBvD,YAAY,wBACKtZ,IAAIiH;YAElD,KAAK4V,kBACD,MAAM,IAAIlZ,MAAJ;YAGV,OAAOkZ;;QAGJ,SAASC,0BAA0B7V,KAA6BW,QAAiBmV;YAapFH,iBAAiB3V,KAAKzE,QAZK,SAACwa,WAAmCC,cAAuBtT;gBAClF,IAAIqT,cAAc/V,KACd,MAAM,IAAItD,MAAJ;gBAGV,KAAKuI,YAAY+Q,cAAcrV,SAC3B,MAAM,IAAIjE,MAAJ,mBAA4BsZ,eAA5B,4BAAoErV;gBAG9EmV,YAAYG,cAAcvT;;;QAM3B,SAASwT,wBAAwBlW,KAA6BhF;YACjE2a,iBAAiB3V,KAAKzD,OAAOvB,KAAKwC,MAAMmM;;QCyCrC,SAASwM,WAATxD;YAAqE,SAA/C3S,MAA+C2S,MAA/C3S,KAAKvH,OAA0Cka,MAA1Cla,MAAMkI,SAAoCgS,MAApChS,QAC9ByV,qBAAqBzE,YAAY,uBACjC0E,oBAAoBhE,YAAY,sBAFkC5G,MAAA,GAAA6K,yBAIlDF,mBAAmB1X,QAJ+B+M,MAAA6K,uBAAAjc,QAAAoR,OAIvB;gBAA5C,IAAM8K,UAAOD,uBAAA7K;gBAEVlJ,eAAe6T,mBAAmBrd,IAAIwd,SAASvW,QAC/CoW,mBAAmBpE,IAAIuE;;YAI/B,IAAMC,UAAuBH,kBAAkBrO,SAAShI,KAAK;gBACzD,OAAKvH,OAIE2d,mBAAmBpO,SAASvP,MAAM;oBACrC,OAAO;wBAAEuH;wBAAKvH;;qBAJP;oBAAEuH;;;YAQjB,IAAIwW,QAAQxW,OAAOwW,QAAQxW,QAAQA,KAC/B,MAAM,IAAItD,MAAJ,kDAA0DjE,QAAQ;YAG5E,IAAIA,MAAM;gBACN,IAAI+d,QAAQ/d,QAAQ+d,QAAQ/d,SAASA,MACjC,MAAM,IAAIiE,MAAJ,8CAAuDjE,OAAvD,OAAkE+d,QAAQ/d;gBAGpF+d,QAAQ/d,OAAOA,MACf2d,mBAAmB7O,IAAI9O,MAAM+d;;YAUjC,OAPI7V,WACA6V,QAAQ7V,SAASA,QACjB+U,qBAAqB1V,OAGzBqW,kBAAkB9O,IAAIvH,KAAKwW;YAEpBA;;QCnMJ,SAASC,YAAT/B;YAA2H,ID2MxHgC,YC3MoBC,KAAoGjC,KAApGiC,IAAI/D,OAAgG8B,KAAhG9B,MAAMgE,iBAA0FlC,KAA1FkC;YD2M9BF,aAAa/b,OAAOkc,MAE1Blc,OAAOkc,OAAO,SAA2BhR,KAAcpN,MAAe4U,SAAkByJ;gBACpF,IAAM9W,MAAM0W,WAAWre,KAAKP,MAAM0O,iBAAiBX,MAAMpN,MAAM4U,SAASyJ;gBAExE,OAAK9W,OAILmW,WAAW;oBAAEnW;oBAAKvH;oBAAMkI,QAAQkF,MAAMD,iBAAiBC,OAAO;oBAEvD7F,OALIA;eA7MZ,SAAA0U;gBAAmI,IAApGiC,KAAoGjC,KAApGiC,IAAI/D,OAAgG8B,KAAhG9B,MAAMgE,iBAA0FlC,KAA1FkC,gBACtCR,qBAAqBzE,YAAY;gBAEvCgF,GAAG3F,aAAaG,aAAa,SAAAlC;oBAA8B,IAA3B3U,SAA2B2U,MAA3B3U,QAAQ6K,SAAmB8J,MAAnB9J,QAAQ4N,OAAW9D,MAAX8D,MACtCgE,gBAAgBpF,YAAY,WAAW5Y,IAAIoM;oBAEjD,KAAK4R,eACD,MAAM,IAAIra,MAAJ,4CAAqDyI;oBAG/D,OAAO4R,cAAchc,KAAK,SAAAic;wBAGtB,IAAI1c,WAAW0c,QAEX,MAAM,IAAIta,MAAJ,kEAA2EyI;wBAGrF,KAAK4N,KAAKta,MACN,MAAM,IAAIiE,MAAJ;wBAGV,KAAKqW,KAAK+C,aACN,MAAM,IAAIpZ,MAAJ;wBAGV,KAAK0Z,mBAAmBrO,IAAIgL,KAAKta,OAC7B,MAAM,IAAIiE,MAAJ,sBAA+BqW,KAAKta,OAApC;wBAIV,KAAK2d,mBAAmBrd,IAAIga,KAAKta,MAAMkI,QACnC,MAAM,IAAIjE,MAAJ,mDAA4DqW,KAAKta;wBAI3E,IAAI2d,mBAAmBrd,IAAIga,KAAKta,MAAMkI,WAAWwE,QAE7C,MAAM,IAAIzI,MAAJ,oBAA6ByI,SAA7B,gDAAmFiR,mBAAmBrd,IAAIga,KAAKta,MAAMkI;wBAM/H,OAFAkV,0BAA0BO,mBAAmBrd,IAAIga,KAAKta,MAAMuH,KAAKmF,QAAQ4N,KAAK+C;wBAEvE;4BACHA,aADG,SACSpT;gCAER,IAAK/H,WAAUA,OAAO8H,QAAtB;oCAIA,IAAMwU,aAAab,mBAAmBrd,IAAIga,KAAKta;oCAE/C,IAAKwe,YAIL;wCACIL,eAAe;4CACX7D,MAAQrQ;4CACRyC,QAAQ8R,WAAWtW;4CACnBrG,QAAQ2c,WAAWjX;2CACpB;4CAAE2W;4CAAI/D;;sCACX,OAAO5X;wCACLU,qBAAaa,OAAOvB;;;;;;;aClExCkc,CAAoB;gBAAEP;gBAAI/D;gBAAMgE;gBCkC7B,SAAA3H;gBAAiE,IAA9B2D,OAA8B3D,MAA9B2D;gBACtCnB,iBAAU9W,QAAQwc,qBAAqB,SAAAxE;oBAA+H,IAAjGla,OAAiGka,MAAjGla,MAAM6B,SAA2FqY,MAA3FrY,QAAQ8c,SAAmFzE,MAAnFyE,QAAQtB,cAA2EnD,MAA3EmD,aAEjFuB,gBAAgB1F,YAAY,kBAC5B2F,eAAenX,UAAUxF;oBAE/B,KAAK2c,cACD,MAAM,IAAI5a,MAAJ;oBAGV,IAAM+P,KAlBd,SAAAiI;wBAAgG,IAArEjc,OAAqEic,KAArEjc,MAAM6B,SAA+Doa,KAA/Dpa,QAAQ8c,SAAuD1C,KAAvD0C,QAAQtB,cAA+CpB,KAA/CoB;yBA1BjD;4BAA8B,KAC1B,IAAMuB,gBAAgB1F,YAAY,kBADRlG,MAAA,GAAA8L,uBAGRF,cAAc3Y,QAHN+M,MAAA8L,qBAAAld,QAAAoR,OAGc;gCAAnC,IAAMhS,MAAG8d,qBAAA9L;gCAUNlJ,eATiB8U,cAAc5d,KASHa,WAC5B+c,cAAcrF,IAAIvY;;yBAa1B+d;wBACA,IAAM/K,KAAKnE;wBAGX,OAFsBqJ,YAAY,iBACpBpK,IAAIkF,IAAI;4BAAEhU;4BAAM6B;4BAAQ8c;4BAAQtB;4BACvCrJ;qBAaQgL,CAAgB;wBAAEhf;wBAAM6B;wBAAQ8c;wBAAQtB;;oBAEnD,OAAOlD,KAAK0E,cAActG,aAAaG,aAAa;wBAEhD1Y;wBAEAqd,aAJgD;4BAM5C,IAAM4B,eAAeL,cAActe,IAAI0T;4BAUvC,IAAKiL,gBAAiBA,aAAapd,WAAUiI,eAAemV,aAAapd,SAAzE;gCAIA;oCACIod,aAAaN;kCACf,OAAOpc;oCACL;;gCAGJ0c,aAAa5B,YAAYvb,MAAMzC,MAAMsC;;;uBAG1C;wBAAEuG,QAAQjB;;;aD1EjBiY,CAAwB;gBAAEhB;gBAAI/D;gBEqC3B,SAAA8B;gBAAuJ,IAAzHiC,KAAyHjC,KAAzHiC,IAAI/D,OAAqH8B,KAArH9B,MAAMgE,iBAA+GlC,KAA/GkC;gBACpClb,qBAAakC,IAAI;oBACpB,IAvC6BoC,KAuCvBM,SAASD,UAAU1F;oBAEzB,IAAK2F,UAAW+U,YAAY;wBAAErV,KAAKM;wBAMnC,OAFAoV,qBAAqBpV,UA7CQN,MA+CKM,QA9C/B+R,YAAY,wBAAwBrK,SAAShI,KAAK;wBACrD,OAAOtE,qBAAakC,IAAI;4BACpB,IAAM6D,QAAQiC,eAAe1D,KAAKsV,cAAc5U;4BAEhD,IAAKe,OAKL,OAAIZ,aAAaY,UAAUZ,aAAaY,UAAUgQ,iBAAUhQ,SACjDA,QAGJ,IAAI/F,qBAAa,SAAAH;gCAEpB,IAAI4P,UACAtN;gCAEJsN,WAAWC,YAAY;oCAEnB,IAAI3J,SAASZ,aAAaY,UAAUgQ,iBAAUhQ,QAG1C,OAFA4J,cAAcF;oCACdnN,aAAaH,UACNtC,QAAQkG;mCAEpB,MAEH5D,UAAUhB,WAAW;oCAEjB,OADAwO,cAAcF,WACP5P;mCACR;;;wBAgB+BR,KAAK,SAAAic;wBAE3C,OAAKA,SAIArc,OAAOlC,OAKLgZ,iBAAUuF,QAAQG,mBAAmB;4BAExC1e,MAAMkC,OAAOlC;4BAEb6B,QAAQK;4BAERyc,QANwC;4BAUxCtB,aAVwC,SAU5BpT;gCAQR,IAAK/H,WAAUA,OAAO8H,QAItB;oCACImU,eAAe;wCACX7D,MAAQrQ;wCACRyC,QAAQrN,KAAKqN;wCACb7K,QAAQxC,KAAKwC;uCACd;wCAAEqc;wCAAI/D;;kCACX,OAAO5X;oCACLU,qBAAaa,OAAOvB;;;2BAI7BD,KAAK,SAAAkU;4BAA8B,IAA3B3U,SAA2B2U,MAA3B3U,QAAQ6K,SAAmB8J,MAAnB9J,QAAQ4N,OAAW9D,MAAX8D;4BAEvB,IAAIzY,WAAWgG,QACX,MAAM,IAAI5D,MAAJ;4BAGVmZ,0BAA0Bvb,QAAQ6K,QAAQ4N,KAAK+C;2BAEhDtY,MAAM,SAAAxC;4BAGL,MADAkb,wBAAwB5V,QAAQtF,MAC1BA;6BAhDCkb,wBAAwB5V,QAAQ,IAAI5D,MAAJ,gEAJhCwZ,wBAAwB5V,QAAQ,IAAI5D,MAAJ;;;aFjDnDkb,CAAmB;gBAAEjB;gBAAI/D;gBAAMgE;;;QGEnC,SAASiB;YAAsB,KAC3B,IAAMC,kBAAkBnG,YAAY,oBADTlG,MAAA,GAAAsM,yBAEVD,gBAAgBpZ,QAFN+M,MAAAsM,uBAAA1d,QAAAoR,OAEc;gBAApC,IAAMgB,KAAEsL,uBAAAtM;gBAELqM,gBAAgB/e,IAAI0T,IAAIuL,iBACxBF,gBAAgB9F,IAAIvF;;;QAiBhC,SAASwL,oBAAoBxL,IAAazM,KAA1C0U;YAA+H,IACvHwD,YADiEtF,OAAsD8B,KAAtD9B;YAGrE,OAAO;gBACHnG;gBACA6H,MAAejU,UAAUL,OAAOL,YAAYE,QAAQF,YAAYC;gBAChE4S,eAAetJ,eAAe;oBAAA,OAAM8J,oBAAoBhT,KAAK;wBAAE4S;;;gBAC/DuF,OAAe;oBAAA,OAAMzc,qBAAakC,IAAI;wBAClCoC,IAAImY;;;gBAERC,SAAS;oBAAA,OAAM1c,qBAAakC,IAAI;wBAC5B,KAAI2E,eAAevC,MAInB,OAAOkY;;;gBAEXG,OAAS;oBAAA,OAAM3c,qBAAakC,IAAI;wBAC5BoC,IAAIqY;;;gBAERC,UAAU;oBAAA,OAAM5c,qBAAakC,IAAI;wBAC7B,OAAO2E,eAAevC;;;gBAE1BuY,aAAa,SAACC;oBAAD,OAAU9c,qBAAakC,IAAI;wBACpC,IAAIiD,aAAab,MACb;4BACI,IAAIA,IAAIC,YAA4C,qBAAzBD,IAAIC,SAASuI,SAGpC,YADAxI,IAAIC,SAASuI,QAAQgQ;0BAG3B,OAAOxd;wBAKbgF,IAAIC,WAAWuY;;;gBAEnBC,SAAS,SAAChgB;oBAAD,OAAUiD,qBAAakC,IAAI;wBAE5BuY,WAAW;4BAAEnW;4BAAKvH;6BAGtBuH,MAAMiB,iBAAiBjB,MAEnBvH,OAAOA,MAEPuH,IAAI0Y,gBACJ1Y,IAAI0Y,aAAa/K,aAAa,QAAQlV;wBAG1Cyf,aAAazf;;;;;QAKlB,IAAMkgB,qBAAb;YASI,SAAAA,YAAYC,kBAA0CC,cAAtD5J;gBAA8H,IAA9B2D,OAA8B3D,MAA9B2D;gBAA8B9a,KAP9HghB,iBAAuB,GAOuGhhB,KAN9H8gB,wBAM8H,GAAA9gB,KAL9H+gB,oBAK8H;gBAAA/gB,KAJ9HihB,2BAI8H,GAAAjhB,KAH9H8a,YAG8H,GAAA9a,KAF9HW,YAE8H,GAC1HX,KAAK8gB,mBAAmBA;gBACxB9gB,KAAKihB,sBAAsB,IAAIrd,wBAC/B5D,KAAK8a,OAAOA,MACRiG,gBACA/gB,KAAKkhB,UAAUH;;YAd3B,IAAArc,SAAAmc,YAAAlc;YAAA,OAAAD,OAkBIyc,UAAA;gBACI,OAAOnhB,KAAK8gB,iBAAiBtE;eAnBrC9X,OAsBI0c,UAAA;gBACI,OAAOphB,KAAKmhB,cAActZ,YAAYE;eAvB9CrD,OA0BI2c,WAAA;gBACI,OAAOrhB,KAAKmhB,cAActZ,YAAYC;eA3B9CpD,OA8BI+b,cAAA,SAAYC;gBAA2C,IAAA5c,QAAA9D;gBACnD,OAAOA,KAAK8gB,iBAAiBL,YAAYC,MAAMzd,KAAK;oBAAA,OAAMa;;eA/BlEY,OAkCIic,UAAA,SAAQhgB;gBAA2C,IAAAmE,SAAA9E;gBAC/C,OAAOA,KAAK8gB,iBAAiBH,QAAQhgB,MAAMsC,KAAK;oBAAA,OAAM6B;;eAnC9DJ,OAsCI2b,QAAA;gBAAoC,IAAAhb,SAAArF;gBAChC,OAAOA,KAAK8gB,iBAAiBT,QAAQpd,KAAK;oBAAA,OAAMoC;;eAvCxDX,OA0CI6b,QAAA;gBAAoC,IAAAta,SAAAjG;gBAChC,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOlC,qBAAayC,IAAI,EACpBJ,OAAKmb,aAAanb,OAAK6a,iBAAiBR,UAAUrd,KAAK,SAAAtC;wBAC/CA,QACAkC,OAAOkc,KAAK,IAAIpe;wBAGxBsF,OAAK6a,iBAAiBP;mBAE3Btd,KAAK;oBAAA,OAAMgD;;eApDtBvB,OAuDI8b,WAAA;gBACI,OAAOxgB,KAAK8gB,iBAAiBN;eAxDrC9b,OA2DI4c,YAAA;gBACI,OAAOthB,KAAK+gB;eA5DpBrc,OA+DIwc,YAAA,SAAUhZ;gBACNlI,KAAK+gB,eAAe7Y,KACpBlI,KAAK8gB,mBAAmBX,oBAAoBngB,KAAK8gB,iBAAiBnM,IAAIzM,KAAK;oBAAE4S,MAAM9a,KAAK8a;oBACxF9a,KAAKihB,oBAAoBxd,QAAQyE;eAlEzCxD,OAqEI6c,cAAA;gBACI,OAAOvhB,KAAKihB;eAtEpBvc,OAyEI8c,cAAA,SAAYtZ;gBAAqD,IAAAuZ,SAAAzhB;gBAC7D,OAAO4D,qBAAakC,IAAI;oBACpB,OAAI2b,OAAKV,eACE7Y,QAAQuZ,OAAKV,eAGjBnd,qBAAayC,IAAI,EACpBob,OAAK/G,iBACLQ,oBAAoBhT,KAAK;wBAAE4S,MAAM2G,OAAK3G;0BACvC7X,KAAK,SAAA4X;wBAAgD,IAC9CpN,QAD8CoN,MAAA,OAAAA,MAAA;wBAOpD,OAJIpN,SACAgU,OAAKP,UAAUhZ,MAGZuF;;;eAzFvB/I,OA8FIgd,SAAA;gBACI,OAAO1hB,KAAK+gB,gBAAgB/gB;eA/FpC0E,OAkGIgW,gBAAA;gBACI,OAAO1a,KAAK8gB,iBAAiBpG;eAnGrChW,OAsGIid,YAAA;gBACI,OAAO3hB,KAAK8gB;eAvGpBpc,OA0GIwb,cAAA;gBACI,OAAOlgB,KAAK+gB,gBAAgBtW,eAAezK,KAAK+gB;eA3GxDF,YA8GWa,SAAP,SAAcxZ;gBACV,OAAO2Y,YAAYG,cAAc9Y,OAE3BA,IAAIwZ,WACJxZ;eAlHd2Y,YAqHWc,YAAP,SAAiBzZ,KAAjB8S;gBAAoH,IAAtDF,OAAsDE,MAAtDF;gBAG1D,OAFAiF,uBAEOc,YAAYe,cAAc1Z,KAAK;oBAAE4S;mBAAQ6G;eAxHxDd,YA2HWgB,cAAP,SAAmBf,kBAAnB3F;gBAA4H,IAA7D0D,KAA6D1D,MAA7D0D,IAAI/D,OAAyDK,MAAzDL;gBAG/D,OAFAiF,uBAEOlG,YAAY,mBAAmB3J,SAAS4Q,iBAAiBnM,IAAI;oBAChE,OAAO,IAAIkM,YAAYC,kBAAkB,MAAM;wBAAEjC;wBAAI/D;;;eA/HjE+F,YAmIWG,gBAAP,SAAqBvS;gBAEjB,OAAOjB,QAAQiB,QAAQD,SAASC,QAAQA,IAAIuS;eArIpDH,YAwIWe,gBAAP,SAAqB1Z,KAArBkT;gBAA8G,IAA5CN,OAA4CM,MAA5CN;gBAG9D,IAFAiF,uBAEIc,YAAYG,cAAc9Y,MAE1B,OAAOA;gBAIX,IAAM4Z,UAAkC5Z;gBAGxC,OAAOqS,YAAY,oBAAoBrK,SAAShI,KAAK;oBACjD,IAAMyM,KAAKnE,YAELuR,cAAc,IAAIlB,YADCV,oBAAoBxL,IAAImN,SAAS;wBAAEhH;wBACNgH,SAAS;wBAAEhH;;oBAEjE,OAAOjB,YAAY,mBAAmBpK,IAAIkF,IAAIoN;;eAzJ1DlB;SAAA;QCxEA,SAASmB,UAAUrN,IAAa1D,KAAgBtQ,MAAe6B,QAA8CqG;YACzG,IAAMoZ,cAAc1H,YAAY,gBAC1B2H,qBAAqBrI,YAAY;YAEnCgH,mBAAYG,cAAcxe,UAC1B0f,mBAAmBzS,IAAIkF,IAAI;gBAAE1D;gBAAKtQ;gBAAMkI;gBAAQrG;kBAEhD0f,mBAAmBhI,IAAIvF,KAEPsN,YAAY/R,SAAS1N,QAAQ;gBAAA,OAAO;eAC5CmS,MAAM;gBAAE9L;gBAAQlI;gBAAMsQ;gBAAKzO;;;QAI3C,SAAS2f,aAAa3f,QAAgCmS;YAClD,IAAMsN,cAAc1H,YAAY,gBAC1B2H,qBAAqBrI,YAAY;YAEvC,OADgBoI,YAAY/R,SAAS1N,QAAQ;gBAAA,OAAO;eACrCmS,OAAOuN,mBAAmBjhB,IAAI0T;;QA0D1C,SAASyN,2BAAqBC,aAAmDxZ,QAAwBoI,KAAiCtP,KAA1IkZ;aAvDP,SAAA+B;gBAA2E,IAAzCiC,KAuD4KhE,MAA7CgE;gBAtDtJhF,YAAY,oBAAoB3J,SAAS,iBAAiB;oBAC7D,OAAO2O,GAAG3F,aAAaC,QAAQ;wBAAEtQ,QAAQjB;uBAAY,SAAAuP;wBAAmG,IAAhG3U,SAAgG2U,MAAhG3U,QAAQ6K,SAAwF8J,MAAxF9J,QAAQ4N,OAAgF9D,MAAhF8D,MAC5DtG,KAAasG,KAAbtG,IAAIhU,OAASsa,KAATta,MAEN2hB,OAAOH,aAAa3f,QAAQmS;wBAElC,KAAK2N,MACD,MAAM,IAAI1d,MAAJ,4BAAqCqW,KAAKta,OAA1C,gBAA8Dsa,KAAKtG,KAAnE,SAA8E/L,gBAAU/F;wBANkD,IASpI0f,eAA8BD,KAAtC9f,QAAsBqG,SAAgByZ,KAAhBzZ,QAAQoI,MAAQqR,KAARrR;wBAEtC,OAAOrN,qBAAakC,IAAI;4BACpB,KAAKqH,YAAYtE,QAAQwE,SAErB,MAAM,IAAIzI,MAAJ,aAAsBqW,KAAKta,OAA3B,cAA6C+M,KAAKC,UAAUpG,aAAQ+a,KAAKzZ,UAAUyZ,KAAKzZ,OAAOrG,SAAS8f,KAAKzZ,UAA7G,4BAAgJwE,SAAhJ,SAA+JzE,gBAAU/F;4BAGnL,IAAIge,mBAAYG,cAAcuB,eAE1B,OAAOA,aAAaf,YAAYhf,QAAQS,KAAK,SAAAwK;gCACzC,KAAKA,OACD,MAAM,IAAI7I,MAAJ,kBAA2BqW,KAAKta,OAAhC,sDAA0FiI,gBAAU/F;;2BAIvHI,KAAK;4BACJ,OAAOgO,IAAIxO,MAAM;gCAAED;gCAAQ6K;+BAAU4N,KAAK7T;2BAC3C,SAAAlE;4BACC,OAAOU,qBAAakC,IAAI;gCACpB,IAAImL,IAAIxL,SACJ,OAAOwL,IAAIxL,QAAQvC;+BAExBD,KAAK;gCAOJ,MALIC,IAAImB,UAEJnB,IAAImB,QAAJ,oBAA+B1D,OAA/B,WAA8CuC,IAAImB;gCAGhDnB;;2BAEXD,KAAK,SAAAqB;4BACJ,OAAO;gCAAEA;gCAAQqQ;gCAAIhU;;;;;aAYjC6hB;YAEA,IAAM7N,KAAK1D,IAAIwR,UAAUjS;YACzB6R,cAAcxB,mBAAYa,OAAOW;YACjC,IAAM1hB,OAAOsQ,IAAIyR,YAAYzR,IAAItQ,QAAQgB;YAazC,OAXIkf,mBAAYG,cAAcqB,gBAC1BL,UAAUrN,IAAI1D,KAAKtQ,MAAM0hB,aAAaxZ;YAGtCwZ,YAAYd,cAActe,KAAK,SAAAiF;gBAC3B8Z,UAAUrN,IAAI1D,KAAKtQ,MAAMuH,KAAKW;kBAGlCmZ,UAAUrN,IAAI1D,KAAKtQ,MAAM0hB,aAAaxZ,SAGnC0T,cAAchD,mBAAmBE,uBAAuB;gBAAE9E;gBAAIhU;;;QCtGlE,SAASgiB,iBAA4BN,aAAmDxZ,QAAwB4F,KAAhHmO;YAAmL,IAAAgG,YAAxD/D,KAAwDjC,KAAxDiC,IAAI/D,OAAoD8B,KAApD9B;YAClI,OpB2CG,SAA8BrM,KAASoU;qBAAyD,MAAzDA,8BAA4B9F;gBAyBtE,IAAMzY,SAASoJ,KAAKC,UAAUc,KAvB9B,SAAkB9M;oBACd,IAAMsP,MAAMjR,KAAK2B;oBAEjB,IAAIya,iBAAiBpc,OACjB,OAAOiR;oBAGX,IAAMuL,OAAOF,cAAcrL;oBAE3B,KAAKuL,MACD,OAAOvL;oBAIX,IAAM6R,aAAaD,YAAYrG,SAASE,WAAWF;oBAEnD,OAAKsG,aAIEA,WAAW7R,KAAKtP,OAHZsP;;gBAQf,YAAsB,MAAX3M,SACAiX,KAAKY,YAGT7X;aoB1EAqd,CAAUlT,OAADmU,aAAA,IACVrH,KAAKG,WAAY,SAACzK,KAAgBtP;gBAAjB,OCEpB,SAA0B0gB,aAAmDxZ,QAAwBoI,KAAgBtP,KAArHib;oBACH,OAAOL,cAAchD,mBAAmBC,4BAA4B;wBAChEvW,MAAMmf,2BAAkBC,aAAaxZ,QAAQ,SAACpF,SAASgB;4BAAV,OAAqBwM,IAAIhO,KAAKQ,SAASgB;2BAAS9C,KAAK;4BAAEkd,IAFmGjC,KAAnEiC;4BAE5B/D,MAF+F8B,KAA/D9B;;;iBDF/DiI,CAAiBV,aAAaxZ,QAAQoI,KAAKtP,KAAK;oBAAEkd;oBAAI/D;;eADnH8H,WAEVrH,KAAKC,YAAY,SAACvK,KAAgBtP;gBAAjB,OAAuDygB,2BAAkBC,aAAaxZ,QAAQoI,KAAKtP,KAAK;oBAAEkd;oBAAI/D;;eAFrH8H,WAGVrH,KAAKO,UAAY,SAAC7K;gBAChB,OAAQzC,SAASyC,QAAQ4P,mBAAYG,cAAc/P,OF4OpDsL,cAAchD,mBAAmBG,qBAAqBmH,mBAAYc,UE5O+B1Q,KF4OhB;oBAAE6J,ME5OyBA;sBAAU7J;eAJ7G2R;;QASb,SAASI,mBAA8BxgB,QAA8C6K,QAAiBzC,SAAtGuM;YAA6K,IAAA8L,cAAnDpE,KAAmD1H,MAAnD0H,IAAI/D,OAA+C3D,MAA/C2D;YACjI,ORgCG,SAA8C1K,KAAc8S;gBAC/D,SADyH,MAA1DA,kCAAgC/F,uBAC3F/M,QAAQmL,KAAKY,WAmCjB,OAAOzO,KAAKyV,MAAM/S,KA9BlB,SAAkBzO,KAAKsP;oBACnB,IAAImL,iBAAiBpc,OACjB,OAAOiR;oBAGX,IAAIuL,MACAnb;oBAUJ,IARI+a,iBAAiBnL,QACjBuL,OAAOvL,IAAIoL,UACXhb,QAAQ4P,IAAIwL,YAEZD,OAAOF,cAAcrL;oBACrB5P,QAAQ4P,OAGPuL,MACD,OAAOnb;oBAIX,IAAM+hB,eAAeF,cAAc1G,SAASQ,aAAaR;oBAEzD,OAAK4G,eAIEA,aAAa/hB,OAAOM,OAHhBN;;aQ9DRwgB,CAAYjX,WAADqY,eAAA,IACZ1J,mBAAmBC,8BAA8B,SAAC6J;gBAAD,OCDhD,IAAIzf,qBDCuGyf,kBCFfpgB;eDCjFggB,aAEZ1J,mBAAmBE,yBAA8B,SAAC6J;gBAAD,OD4FpD,SAAgC9gB,QAA8C6K,QAA9E2N,OAAAG;oBAAqO,IAApIxG,KC5Fe2O,mBD4Ff3O,IAAIhU,OC5FW2iB,mBD4FX3iB,MAA2Cma,OAAqFK,MAArFL,MAC7IyI,0BAA0B,SAACC;wBAC7B,SAASC;4BAA0D,IAAAC,aAAAphB;4BAO/D,OAAOue,mBAAYe,cAAcpf,QAAQ;gCAAEsY;+BAAQyG,cAActe,KAAK,SAAAiF;gCAClE,IAAMoa,OAAOH,aAAaja,KAAKyM;gCAE/B,IAAI2N,QAAQA,KAAKrR,QAAQwS,4BACrB,OAAOnB,KAAKrR,IAAIxO,MAAM;oCAAED,QAAQK;oCAAQwK,QAAQzE;mCAAetG;gCAG/D,IAAMiT,UAAU;oCAAE1M,QAAQwE;oCAAQ8Q,eAAeqF,KAAKrF;mCAChD/W,QAAOkG,GAAgBW,MAAM1N,KAAK+B;gCAExC,OAAOwY,KAAK5S,KAAKgR,aAAaC,QAAQ;oCAAExE;oCAAIhU;oCAAMyG;mCAAQmO,SACrDtS,KAAK,SAAAuB;oCACF,KAAKgf,KAAKrF,eACN,OAAO3Z,IAAIyW,KAAK3W;;+BAKjCoB,MAAM,SAAAxC;gCAML,MAAMA;;;wBAWd,YA3CqD,MAAxBsgB,gBAAiB,KAoC9CC,2BAA2Bf,WAAW/hB;wBACtC8iB,2BAA2BE,aAAatW,QACxCoW,2BAA2BG,aAAaphB;wBACxCihB,2BAA2BhB,SAAS9N,IAEpC8O,2BAA2BpW,SAASA;wBAE7BoW;uBAGLA,6BAA6BF;oBAGnC,OAFAE,2BAA2BtF,gBAAgBoF,wBAAwB;wBAAEpF,gBAAe;wBAE7EsF;iBC9IwEI,CAAoBrhB,QAAQ6K,QAAQiW,GAAoB;oBAAEzE;oBAAI/D;;eAF3HmI,aAGZ1J,mBAAmBG,uBAA8B,SAACoH;gBAAD,OFuOhDD,mBAAYgB,YEvO8Ff,kBFuO7E;oBAAEjC,KADnCiF,QEtOgI;wBAAEjF;wBAAI/D;uBFsOb+D;oBAClF/D,MAD+IgJ,MAAzDhJ;;gBAA7H,IAAAgJ;eEzOeb;;QEbf,IAAMc,0BAA0B;QCChC,SAAS/F,iBAAY9V,KAA6BW,QAAwB+B,SAA1EgS;YAA8I,IAAAoH,mBAA/CnF,KAA+CjC,KAA/CiC,IAAI/D,OAA2C8B,KAA3C9B;YACtG,IAAIrQ,eAAevC,MACf,MAAM,IAAItD,MAAM;YAF6H,KAKjJ,IAAMqf,oBAAoBtB,iBAAiBza,KAAKW,UAANmb,oBAAA,6BAAA7hB,SAAA;gBAElCwS,IAAQnE;gBACRnD,QAAQzE,gBAAU/F;eACf+H,UAJ+BoZ,oBAMvC;gBAAEnF;gBAAI/D;gBAEHoJ,aAAapjB,OAAO8F,KAAKmd,0BACzBI,SAAS,IAdkIxQ,MAAA,GAAAA,MAgBtHuQ,WAhBsH3hB,QAAAoR,OAgB1G;gBAAlC,IAAMyQ,eAAgBF,WAAJvQ;gBACnB;oBACIoQ,wBAAwBK,cAAclc,KAAK+b,mBAAmBpb;kBAChE,OAAO3F;oBACLihB,OAAOlf,KAAK/B;;;YAIpB,IAAIihB,OAAO5hB,WAAW2hB,WAAW3hB,QAC7B,MAAM,IAAIqC,MAAJ,oDAA6Duf,OAAOtd,IAAImL,gBAAgB9D,KAAK;;QDxB3G6V,wBAAuB,yBAA+B,SAAC7b,KAA6B+b,mBAA4Bpb;aAUxGyE,MAAMC,QAAQ1E,UACJA,SACe,mBAAXA,SACJ,EAAEA,WAEF,EAAEjB,sBAGEf,IAAI,SAAAwd;gBAkBlB,OAAmC,MAA/BA,IAAIrf,QAAQwC,SAASE,QACdE,qBAGJyc;eAGHC,QAAQ,SAAAD;gBACZnc,IAAIqc,YAAYN,mBAAmBI;;WAMvCN,wBAAuB,mBAAyB,SAAC7b,KAA6B+b,mBAA4Bpb;YAEtG,IAAKuU,2BAA4BM,YAAjC;gBAIA,IAAI3U,aAAab,MACb,MAAM,IAAItD,MAAJ;gBAGV,KAAqC,MAAjC8H,gBAAgB7J,QAAQqF,MACxB,MAAM,IAAItD,MAAJ;iBTmDX,SAA2BsD,KAA6BW,QAAiB+B;oBAE5E,IAAM4Z,iBAAkBxY,SAASnJ,QAAQqF,MACnCuc,kBAAkBzY,SAAS9D,KAAKrF;oBAEtC,KAAK2hB,mBAAmBC,iBACpB,MAAM,IAAI7f,MAAJ;oBAGHiZ,iBAAiB3V,KAAKjF,KAAK,SAAA+a;wBAC9B,OAAOA,YAAY9V,KAAKW,QAAQ+B;;iBS1DhC8Z,CAAkBxc,KAAKW,QAAQob;;WAMnCF,wBAAuB,mBAAyB,SAAC7b,KAA6B+b;YAE1E,IE9EAzY,mBAAa3I,QAAQ4K,MAAM,0CF8E3B;gBAIA,KAAK1E,aAAab,MACd,MAAM,IAAItD,MAAJ;gBAGV,KAAqC,MAAjC8H,gBAAgB7J,QAAQqF,MACxB,MAAM,IAAItD,MAAJ;gBAIV,IAAM+f,gBAAgBhL,iBAAUzR;gBAEhC,KAAKyc,eACD,MAAM,IAAI/f,MAAJ;gBAGV+f,cAAc7F,eAAe;oBACzBtc,QAAQK;oBACRwK,QAAQzE;oBACRqS,MAAQgJ;;;;QG1FpB,2BAAMW,mBAAmB;QAwBlB,SAASC,oBAAoBle;YAEhC,OAD0BkT,YAAY,qBACb5Y,IAAI0F;;QAG1B,SAASme,uBAAuBne;YACTkT,YAAY,qBACpBK,IAAIvT;;QAmBnB,SAASoe,0BAA0Bpe;YAEtC,OADiCkT,YAAY,4BACb5J,IAAItJ;;QAGjC,SAASqe,mBAATpI;YAAsK,IAAxIjc,OAAwIic,KAAxIjc,MAAMuH,MAAkI0U,KAAlI1U,KAAKW,SAA6H+T,KAA7H/T,QACtCoc,mBAAmB1K,YAAY;YAUrC,IARIrS,QAAQN,uBACRM,MAAM,OAGNW,WAAWjB,uBACXiB,SAAS;aAGRlI,MACD,MAAM,IAAIiE,MAAJ;YAZ+J,SAAAsgB,MAAA,GAAArK,QAe9I,EAAE3S,KAAKkS,iBAfuI8K,MAAArK,MAAAtY,QAAA2iB,OAetH;gBAA9C,IAAMC,eAAYtK,MAAAqK;gBACnB,IAAKC,cAAL;oBAIA,IAAMC,gBAAgBH,iBAAiBhkB,IAAIkkB;oBAE3C,IAAKC,eAAL;wBAIA,IAAMC,kBAAkBD,cAAczkB;wBAEtC,IAAK0kB,iBAAL;4BAIA,IAAIxc,UAA4B,mBAAXA,QAAqB;gCACtC,IAAIwc,gBAAgBxc,SAChB,OAAOwc,gBAAgBxc;gCAG3B,IAAIwc,gBAAgBT,mBAAmB,SAAA7O,MAAA,GAAAuP,yBACDD,gBAAgBT,mBADf7O,MAAAuP,uBAAA/iB,QAAAwT,OACkC;oCAAA,IAAAwP,yBAAAD,uBAAAvP,MAAjDyP,WAAiDD,uBAAjDC;oCAChB,IAAIrY,YAD6DoY,uBAAxDE,OACc5c,SACnB,OAAO2c;;;4BAMvB,IAAIH,gBAAgBzd,qBAChB,OAAOyd,gBAAgBzd;;;;;;QC1G5B,IAAM8d,0BAAqBC,wBAAA,yCAELnjB,QAAgC6K,QAAiBzC,SAF5CgS;YAE4I,IAApEiC,KAAoEjC,KAApEiC,IAAI/D,OAAgE8B,KAAhE9B,MAEhGvF,UAAUyP,mBAAmB;gBAAErkB,MAAMiK,QAAQjK;gBAAMuH,KAAK1F;gBAAQqG,QAAQwE;;YAS9E,SAASuY,aAAapJ,MAAqCqJ,KAAoCC;qBAAe,MAAfA,wBAAW,KAElGlb,QAAQuT,iBAAiB1T,eAAejI,WAe5Cwb,iBAAYxb,QAAQ6K,QAATlL,SAAA;oBACPqa;oBACAqJ;oBACAlf,MAAQiE,QAAQjE;oBAChBhG,MAAQiK,QAAQjK;mBACbmlB,WACJ;oBAAEjH;oBAAI/D;;;YAGb,OAAOlX,qBAAayC,IAAI,EAEpBuf,ahChDG,0BgCkDHhiB,qBAAakC,IAAI;gBAEb,KAAKyP,SACD,MAAM,IAAI3Q,MAAJ,wCAAiDgG,QAAQjK,OAAzD,WAAwE0M,SAAxE,SAAuFxK,OAAOsF,SAASC,WAAvG,OAAsHvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAGzK,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,oBAA6ByI,SAA7B,4BAA+DkI,QAAQ1M,OAAO7F;gBAKxF,OAAOuS,QAAQ1R,QAAQ;oBAAErB;oBAAQ6K;oBAAQ4N,MAF5BrQ,QAAQqQ;;eAItBhY,KAAK,SAAAgY;gBACJ,OAAO2K,ahClER,8BAKD,WgC6DkE;oBAAE3K;;eAEnE,SAAA/W;gBACC,OAAO0hB,ahCrER,8BAMD,SgC+DgE;oBAAE1hB;;kBAGrEjB,KAAK4O,eAAMnM,MAAM,SAAAxC;gBAChB,IAAIqS,WAAWA,QAAQyQ,aACnB,OAAOzQ,QAAQyQ,YAAY9iB;gBAE3B,MAAMA;;WApEYyiB,sBAAA,iCAyETnjB,QAAgC6K,QAAiBzC;YAElE,KAAIma,0BAA0Bna,QAAQjE,OAAtC;gBAIA,IAAM4O,UAAUsP,oBAAoBja,QAAQjE;gBAE5C,KAAK4O,SACD,MAAM,IAAI3Q,MAAJ,wDAAiEgG,QAAQjK,OAAzE,WAAwF0M,SAAxF,SAAuGxK,OAAOsF,SAASC,WAAvH,OAAsIvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAGzL,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,gBAAyByI,SAAzB,4BAA2DkI,QAAQ1M,OAAO7F;gBAGpF,IAAIR,WAAW+S,QAAQrN,KACnB,MAAM,IAAItD,MAAJ;gBAGV2Q,QAAQsQ,OAAM;;WA7FYF,sBAAA,sCAgGJnjB,QAAgC6K,QAAiBzC;YAEvE,KAAIma,0BAA0Bna,QAAQjE,OAAtC;gBAIA,IxC6uB+ByG,SwC7uBzBmI,UAAUsP,oBAAoBja,QAAQjE;gBAE5C,KAAK4O,SACD,MAAM,IAAI3Q,MAAJ,6DAAsEgG,QAAQjK,OAA9E,WAA6F0M,SAA7F,SAA4GxK,OAAOsF,SAASC,WAA5H,OAA2IvF,OAAOsF,SAASQ,OAAS9F,OAAOsF,SAAS4d;gBAG9L,KAAK5Y,YAAYoI,QAAQ1M,QAAQwE,SAC7B,MAAM,IAAIzI,MAAJ,qBAA8ByI,SAA9B,6BxCsuBqBD,UwCtuBkEmI,QAAQ1M;gBxCuuBzGyE,MAAMC,QAAQH,WACd,MAAYA,QAAQc,KAAK,SAAzB,MACO3G,QAAQ6F,WACf,YAAkBA,QAAQpK,aAEnBoK,QAAQpK;gBwCzuBf,IAAIR,WAAW+S,QAAQrN,KACnB,MAAM,IAAItD,MAAJ;gBAGVkgB,uBAAuBla,QAAQjE,OhCtHzB,YgC0HFiE,QAAQib,MAKRtQ,QAAQ/R,QAAQiB,OAAOmG,QAAQ1G,ShChI7B,cgCkIK0G,QAAQib,OAKftQ,QAAQ/R,QAAQC,QAAQ;oBAAEjB;oBAAQ6K;oBAAQ4N,MAAMrQ,QAAQqQ;;;WApIlC0K;QCkC3B,SAAS7G,uBAAelI,OAAxBO;YAA+F,IAA/C0H,KAA+C1H,MAA/C0H,IAAI/D,OAA2C3D,MAA3C2D,MACjDmL,mBAAmBpM,YAAY;YAErC,KAAKhX,UAAUA,OAAO8H,QAClB,MAAM,IAAI/F,MAAJ;YAGV;gBACI,KAAKgS,MAAMpU,QACP;cAEN,OAAOU;gBACL;;YAZ8F,IAe5FV,SAAyBoU,MAAzBpU,QAAQ6K,SAAiBuJ,MAAjBvJ,QAORzC,UAxDV,SAAsBA,SAAkBpI,QAAgC6K,QAAxEuP;gBAAoJ,IAC5IsJ,eADmFrH,KAAyDjC,KAAzDiC,IAAI/D,OAAqD8B,KAArD9B;gBAG3F;oBACIoL,gBAAgBlD,mBAAmBxgB,QAAQ6K,QAAQzC,SAAS;wBAAEiU;wBAAI/D;;kBACpE,OAAO5X;oBACL;;gBAGJ,IAAKgjB,iBAIwB,mBAAlBA,iBAAgD,SAAlBA,kBAIzCA,gBAAgBA,cAAa,2BAEkB,mBAAlBA,iBAAgD,SAAlBA,iBAItDA,cAAc1J,QAAsC,mBAAvB0J,cAAc1J,QAI3CkJ,sBAAsBQ,cAAc1J,OAIzC,OAAO0J;aAyBSC,CAPevP,MAATqE,MAOazY,QAAQ6K,QAAQ;gBAAEwR;gBAAI/D;;YAEpDlQ,YAIL0Q,gBAAgB9Y,SAEZyjB,iBAAiBhW,IAAIrF,QAAQ+J,QAIjCsR,iBAAiBxW,IAAI7E,QAAQ+J,KAAI;YAE7BlK,eAAejI,YAAYoI,QAAQuT,kBAIO,MAA1CvT,QAAQyC,OAAOrI,QAAQwC,SAASE,UAChC2F,SAAa7F,SAASE,OAAhB;YAGVge,sBAAsB9a,QAAQ4R,MAAMha,QAAQ6K,QAAQzC,SAAS;gBAAEiU;gBAAI/D;;;QClFhE,SAAS+D,MAAGle,MAAe4U,SAA2C1R;YAEzE,KAAKlD,MACD,MAAM,IAAIiE,MAAM;YASpB,IANuB,qBAAZ2Q,YACP1R,UAAU0R,SAEVA,UAAU,MAGT1R,SACD,MAAM,IAAIe,MAAM;aAGpB2Q,UAAUA,WAAW,IACb5U,OAAOA,MACf4U,QAAQ1R,UAAUA,WAAW0R,QAAQ1R;YAErC,IAAMqE,MAAMqN,QAAQ1S,QACdgG,SAAS0M,QAAQ1M,QAYjBud,kBHkFH,SAASC,mBAATrL,OAA2IwK;gBAA0D,IAAvK7kB,OAAuKqa,MAAvKra,MAAMuH,MAAiK8S,MAAjK9S,KAAKW,SAA4JmS,MAA5JnS,QACtCoc,mBAAmB1K,YAAY;gBAErC,KAAK5Z,QAAwB,mBAATA,MAChB,MAAM,IAAIiE,MAAJ;gBAGV,IAAI0I,MAAMC,QAAQrF,MAAM;oBAAA,KACpB,IAAMoe,sBAAsB,IADRC,MAAA,GAAAC,QAGDte,KAHCqe,MAAAC,MAAAjkB,QAAAgkB,OAIhBD,oBAAoBrhB,KAAKohB,mBAAmB;wBAAE1lB;wBAAMkI;wBAAQX,KADjDse,MAAAD;uBAC8Df;oBAG7E,OAAO;wBACHve,QADG;4BACM,SAAAwf,OAAA,GAAAA,OACwBH,oBADxB/jB,QAAAkkB,QACwBH,oBAAJG,MACNxf;;;;gBAM/B,IAAIqG,MAAMC,QAAQ1E,SAAS;oBAAA,KACvB,IAAMyd,uBAAsB,IADLI,OAAA,GAAAC,WAGJ9d,QAHI6d,OAAAC,SAAApkB,QAAAmkB,QAInBJ,qBAAoBrhB,KAAKohB,mBAAmB;wBAAE1lB;wBAAMuH;wBAAKW,QAD9C8d,SAAAD;uBAC8DlB;oBAG7E,OAAO;wBACHve,QADG;4BACM,SAAA2f,OAAA,GAAAA,OACwBN,qBADxB/jB,QAAAqkB,QACwBN,qBAAJM,MACN3f;;;;gBAM/B,IAAM4f,mBAAmB7B,mBAAmB;oBAAErkB;oBAAMuH;oBAAKW;;gBAQzD,IANKX,OAAOA,QAAQN,uBAChBM,MAAMkS,gBAGVvR,SAASA,UAAUjB;gBAEfif,kBACA,MAAI3e,OAAOW,SACD,IAAIjE,MAAJ,yCAAkDjE,OAAlD,gBAAsEkI,OAAO7F,aAA7E,WAAiGkF,QAAQkS,gBAAgB,aAAa,eAAtI,aACClS,MACD,IAAItD,MAAJ,yCAAkDjE,OAAlD,WAAgEuH,QAAQkS,gBAAgB,aAAa,eAArG,aACCvR,SACD,IAAIjE,MAAJ,yCAAkDjE,OAAlD,gBAAsEkI,OAAO7F,cAE7E,IAAI4B,MAAJ,yCAAkDjE;gBAIhE,IAMImmB,gBACAC,eAPE3B,gBAAgBH,iBAAiB/U,SAAShI,KAAK;oBAAA,OAAO;oBAEtDmd,kBAAkBnV,cAASkV,eAAezkB,MAAM;oBAAA,OAAO;oBAEvDqmB,YAAYne,OAAO7F;gBAazB,OARIuE,aAAQsB,WACRie,iBAAiB5W,cAASmV,iBAAiBT,kBAAkB;oBAAA,OAAM;oBAEpD3f,KADf8hB,gBAAgB;oBAAEtB,OAAO5c;oBAAQ2c;qBAGjCH,gBAAgB2B,aAAaxB,UAG1B;oBACHve,QADG;+BAEQoe,gBAAgB2B,YAEnBD,kBACAD,eAAe5f,OAAO4f,eAAe9hB,QAAQ+hB,eAAe;wBAEvDD,eAAevkB,iBACT8iB,gBAAgBT,oBAI1B9jB,OAAO8F,KAAKye,iBAAiB9iB,iBAEvB6iB,cAAczkB;wBAIrBuH,QAAQpH,OAAO8F,KAAKwe,eAAe7iB,UACnC0iB,iBAAiB/K,IAAIhS;;;aGjLTme,CAAmB;gBAAE1lB;gBAAMuH;gBAAKW;eAVV;gBAC1ChF,SAAa0R,QAAQ1R;gBACrBmiB,aAAazQ,QAAQ0R,gBAAiB,SAAA/jB;oBAClC,MAAMA;;gBAEVL,QAAQqF;gBACRW,QAAQA,UAAUjB;gBAClBjH;;YAKJ,OAAO;gBACHsG,QADG;oBAECmf,gBAAgBnf;;;;QCIrB,ICnCIiY,YDmCEpE,YAAkB,SAAlBA,KAAmB5S,KAAKvH,MAAMsa,MAAM1F;YAI7C,IAAI1M,UADJ0M,UAAUA,WAAW,IACA1M,UAAUjB,oBACzBsf,kBAAkB3R,QAAQxP,YpC/CS,GoCgDnCohB,eAAe5R,QAAQxP,WpCpDG,KoCqD1BoY,gBAAgB5I,QAAQ4I,kBAAiB;YAG/C,OAAOva,qBAAakC,IAAI;gBAEpB,OA9CR,SAAyBnF,MAAeuH,KAA6BW;oBACjE,KAAKlI,MACD,MAAM,IAAIiE,MAAM;oBAGpB,IAAIiE,UACsB,mBAAXA,WAAwByE,MAAMC,QAAQ1E,YAAYtB,aAAQsB,SACjE,MAAM,IAAIzC,UAAJ;oBAId,IAAIqE,eAAevC,MACf,MAAM,IAAItD,MAAM;iBAiChBwiB,CAAgBzmB,MAAMuH,KAAKW,SA7BnC,SAAyBX,KAA6BW,QAAwBse,cAA9EvK;oBAAqL,IAA9E9B,OAA8E8B,KAA9E9B;oBACnG,OAAOlX,qBAAakC,IAAI;wBACpB,O3CmpBD,SAAoBwC,QAAgCe;4BAEvD,IAAIge,eAAepb,YAAY5C;4BAE/B,IAAIge,cACA,OAAIA,iBAAiB/e;4BAOzB,IAAIe,UAAUf,QACV,QAAO;4BAGX,IAAI2B,OAAOZ,WAAWA,OAClB,QAAO;4BAjBqF,SAAAie,OAAA,GAAAC,cAoB9E/d,UAAUlB,SApBoEgf,OAAAC,YAAAhlB,QAAA+kB,QAqB5F,IADUC,YAAAD,UACIje,OACV,QAAO;4BAIf,QAAO;yB2C7qBCme,CAAW3kB,QAAQqF,OACZmT,iBAAiBnT,KAAKif,gBACtB5f,aAAQsB,UAER+R,SAAS1S,KAAK;4BAAE4S;6BAEhB;4BAAEjS;;uBAGd5F,KAAK,SAAAkU;wBAGJ,OAHsCA,MAA/BtO;;iBAmBA4e,CAAgBvf,KAAKW,QAAQse,cAAc;oBAAErM;;eACrD7X,KAAK,SAAAykB;gBAEJ,KAAKva,YAAYtE,QAAQ6e,eACrB,MAAM,IAAI9iB,MAAJ,YAAqB+I,UAAU9E,UAA/B,qBAA2D8E,UAAU+Z;gBAG/E7e,SAAS6e;gBAET,IAAMC,UAAWhnB,SAASuY,aAAaC,UAAU8B,QAA6B,mBAAdA,KAAKta,OAAyBsa,KAAKta,OAAnF,OAA+FA,MAMzG6C,UAAU,IAAII,wBACd+C,OAAWhG,OAAP,MAAiB6P;gBAE3B,KAAK2N,eAAe;oBAChB,IAAMyJ,mBAA0C;wBAAEjnB;wBAAMuH;wBAAKW;wBAAQrF;;qBJ7C1E,SAA6BmD,MAAe6e;wBACrB3L,YAAY,qBACpBpK,IAAI9I,MAAM6e;qBI4CpBqC,CAAoBlhB,MAAMihB;oBAE1B,IAAME,cAAcvN,YAAY,mBAAmBrK,SAAShI,KAAK;wBAAA,OAAM;;oBACvE4f,YAAY7iB,KAAKzB,UAEjBA,QAAQkC,MAAM;yBJzBnB,SAAqCiB;4BACPkT,YAAY,4BACpBpK,IAAI9I,OAAM;yBIwBvBohB,CAA4BphB,OAC5Bme,uBAAuBne;;oBAG3B,IAAMqhB,kBhChFX,SAAuB9f;wBAE1B,OADqBqS,YAAY,gBACbtZ,IAAIiH,MAAK;qBgC8EG+f,CAAc/f,OpCrFjB,MADN,KoCuFTggB,kBAAkBhB,iBAEpBiB,aAAaH,iBACbI,aAAaF,iBAEX7U,WAAWjB,aAAa;wBAC1B,OAAI3H,eAAevC,OACR1E,QAAQiB,OAAO,IAAIG,MAAJ,uBAAgCjE,OAAhC,cAAiDinB,iBAAiB/B,MAAM,aAAa,WAG3G+B,iBAAiBS,YACV7kB,QAAQiB,OAAO,IAAIG,MAAJ,yCAAkDjE,UAG5EwnB,aAAahZ,KAAK8J,IAAIkP,apClGH,KoCkGqC;yBACpC,MAAhBC,eACAA,aAAajZ,KAAK8J,IAAImP,apCpGP,KoCoGyC,KAGvDR,iBAAiB/B,OAAsB,MAAfsC,aAGH,MAAfC,aACA5kB,QAAQiB,OAAO,IAAIG,MAAJ,iCAA0C+iB,UAA1C,SAA0D/e,oBAA1D,SAA8Esf,kBAA9E,cADnB,IAFI1kB,QAAQiB,OAAO,IAAIG,MAAJ,4BAAqC+iB,UAArC,SAAqD/e,oBAArD,SAAyEof,kBAAzE;uBpCxGP;oBoC+GvBxkB,QAAQoC,QAAQ;wBACZyN,SAASpM,UACT6gB,YAAY5gB,OAAO4gB,YAAY9iB,QAAQxB,SAAS;uBACjDkC,MAAMmM;;gBAWb,OARAmM,iBAAY9V,KAAKW,QAAQ;oBACrB2T,MnC3HG;oBmC4HH7V;oBACAhG;oBACAsa;oBACAkD;mBACD;oBAAEU;oBAAI/D;oBAEFqD,gBAAgB3a,QAAQC,YAAYD;;;QE1H5C,SAASmf,uBAAoBN,aAAmDxZ,QAAwB4F;YAC3G,OAAO6Z,iBAAyBjG,aAAaxZ,QAAQ4F,KAAK;gBAAEoQ;gBAAI/D;;;QAG7D,SAASkI,yBAA8BxgB,QAA8C6K,QAAiBzC;YACzG,OAAO2d,mBAA2B/lB,QAAQ6K,QAAQzC,SAAS;gBAAEiU;gBAAI/D;;;QAG9D,SAAS8G,oBAAc1Z;YAC1B,OAAO2Y,mBAAYe,cAAc1Z,KAAK;gBAAE4S;;;QCbrC,SAAS0N,cAActgB;YAA6B,KACvD,IADuDyL,MAAA,GAAA8U,wBAC/BlO,YAAY,mBACEtZ,IAAIiH,KAAK,KAFQyL,MAAA8U,sBAAAlmB,QAAAoR,OAErC8U,sBAAA9U,KACNlP,OAAO,IAAIG,MAAJ,sCAAgDc,MAAMmM;;QCNtE,SAAS8H,qBAAUzR;YAEtB,SAFsE,MAAhDA,cAA+BrF,UAEhDkG,aAAab,MACd,MAAM,IAAItD,MAAJ;YAOV,OAJKsD,IAAG,oBACJA,IAAG,kBAA4B,KAG5BA,IAAG;;QCNP,SAASwgB,eAAkBja;YAC9B,OAAO;gBACHxN,KADG;oBACqB,IAAA6C,QAAA9D;oBACpB,OAAO4D,qBAAakC,IAAI;wBACpB,IAAIhC,MAAKtB,UAAUsB,MAAKtB,WAAWK,QAC/B,MAAM,IAAI+B,MAAJ;wBAGV,OAAO6J;;;;;QJCnByQ,aAAS;YAAEP;YAAagK,YhB+FrB,SAAoB5a,KAAclF;gBACrC,IAAM+f,UAAU/O,YAAY,YACtBgP,eAAehP,YAAY;gBAIjC,OAFAhR,SAASA,UAAUiF,iBAAiBC,MAE7B6a,QAAQ1Y,SAASrH,QAAQ;oBAAA,OAAMjF,qBAAakC,IAAI;wBAEnD,IAAI8C,sBAAgBC,QAChB,MAAM,IAAIjE,MAAJ,+DAAwEiE;wBAGlF,IAAMlI,OAAQ6c,cAAc3U;wBAG5B,IAFc+C,eAAe/I,QAAQlC,OAGjC,MAAM,IAAIiE,MAAJ,qBAA8BjE,OAA9B;wBAGV,IAAM2U,SA/Cd,SAAyB3U,MAAeoN;4BAEpC,IAAMuH,SAAStC,SAAS0C,cAAT;4BAkBf,OAhBAJ,OAAOO,aAAP,QAA4BlV,OAC5B2U,OAAOO,aAAP,MAA4BlV,OAE5B2U,OAAOO,aAAP;4BACAP,OAAOO,aAAP,qBACAP,OAAOO,aAAP,gBACAP,OAAOO,aAAP;4BACAP,OAAOO,aAAP,8BAEAP,OAAOO,aAAP;4BACAP,OAAOO,aAAP,mBACAP,OAAOO,aAAP,cACAP,OAAOO,aAAP;4BAEAP,OAAOwT,MAAM/a,KAENuH;yBA2BYyT,CAAgBpoB,MAAMoN;wBAGrC,OAFA8a,aAAapZ,IAAI5G,QAAQyM,SAElBqI,kBAAkB1a,KAAK,SAAAgQ;4BAE1BA,KAAKkB,YAAYmB;4BACjB,IAAM4J,SAAS5J,OAAOrK;4BAEtB,OAAO,IAAIrH,qBAAa,SAACH,SAASgB;gCAE9B6Q,OAAOL,iBAAiB,QAAQxR,UAChC6R,OAAOL,iBAAiB,SAASxQ;+BAElCxB,KAAK;gCAEJ,OAAOoY,iBAAiB6D,QrBhJV,KqBgJS,YAAoCnR;+BAE5D9K,KAAK;gCAEJ,OAAOic;;;;;;YgBrIiBb;YAAY2K,ShB6L7C,SAAiB9gB,KAA6B6F;gBACjDsQ,WAAW;oBAAEnW;oBAAKW,QAAQiF,iBAAiBC;;;YgB9Lc2P;YAAUH;YAC/DH;YAAuB6L,WhByFxB,SAAmBlb,KAAclF;gBAEpC,OADgBgR,YAAY,WACb5J,IAAIpH,UAAUiF,iBAAiBC;;YgB3FRsP;YAAmBC;YAAsB4L,gBhBgN5E;gBAA0B,KAC7B,IAAMN,UAAU/O,YAAY,YACtBgP,eAAehP,YAAY,iBAFJqL,MAAA,GAAAiE,sBAIRN,aAAajiB,QAJLse,MAAAiE,oBAAA5mB,QAAA2iB,OAIa;oBAArC,IACKvb,QAAQkf,aAAa5nB,IADdkoB,oBAAAjE;oBAETvb,SAASA,MAAMuB,cACfvB,MAAMuB,WAAW6L,YAAYpN;;gBAGrCkf,aAAapX,SACbmX,QAAQnX;;;QqBzOL,IAAM2X,OAAI,QAEJC,wBACWD,OAAZ,aADCC,8BAEWD,OAAN,mBAGLE,YAAY;YACrBvN,QAAM;YACND,QAAM;YACNN,UAAQ;YACRS,SAAO;YACPD,QAAM;YACNH,OAAK;WAeI0N,qBAAqB;YAC9B7b,MAAS;YACT8b,QAAS;YACTC,QAAS;WAGAC,UAAU7hB,aAEVD,yBAAW,KAEX+hB,qBAAqB;YAC9BC,OAAQ;YACRC,QAAQ;WAGCC,QAAQ;YACjBC,QAAU;YACVC,UAAU;YACVC,SAAU;YACVxO,OAAU;YACVyO,OAAU;YACVC,OAAU;YACVC,QAAU;;QC7CP,SAASC,mBAAyBC,WAA0BrW,OAAwBtS,KAAcN,OAAWkpB;YAGhH,IAAMC,OAAoCF,UAAUG,kBAAkB9oB;YAEtE,OAAK6oB,QAI6B,qBAAvBA,KAAKE,gBACLF,KAAKE,cAALvoB,SAAA;gBAAqBd;eAAUkpB,YAJ/BlpB;;QCRf,SAASspB,qBAAqBvK;YAC1B,OAAO1O,cAAciZ,sBAAsB;gBACvC,KAAKvK,YACD,MAAM,IAAIxb,MAAJ;gBAFmC,IAAAgmB,oBAKAxK,WAAWpS,MAAM,OAApD6c,WALmCD,kBAAA,IAKzBjqB,OALyBiqB,kBAAA,IAKnBE,iBALmBF,kBAAA;gBAO7C,IAAIC,aAAazB,MACb,MAAM,IAAIxkB,MAAJ,uCAAgDimB;gBAG1D,KAAKlqB,MACD,MAAM,IAAIiE,MAAJ;gBAGV,KAAKkmB,gBACD,MAAM,IAAIlmB,MAAJ;gBAGV;oBACI,OAAO8I,KAAKyV,MhDVjB,SAAsB/S;wBACzB,IAAsB,sBAAXvN,UAAiD,qBAAhBA,OAAOkoB,MAC/C,OAAOloB,OAAOkoB,KAAK3a;wBAGvB,IAAsB,sBAAXE,QACP,OAAOA,OAAOC,KAAKH,KAAK,UAAUpN,SAAS;wBAG/C,MAAM,IAAI4B,MAAJ;qBgDCoBomB,CAAaF;kBACjC,OAAO5nB;oBACL,MAAM,IAAI0B,MAAJ,yCAAkDkmB,iBAAlD,OAAuE9Y,eAAe9O;;eAEjG,EAAEkd;;QAGF,SAAS6K;YACZ;gBACI,OAAON,qBAAqB9nB,OAAOlC;cACrC,OAAOuC;;QCQN,IAAMgoB,uBAAb;YAYI,SAAAA,eAAYZ;gBAA0B,IAAAxmB,QAAA9D;gBAAAA,KAVtCsqB,iBAUsC,GAAAtqB,KATtCiU,aASsC,GAAAjU,KARtCmH,eAQsC,GAAAnH,KAPtCsI,cAOsC;gBAAAtI,KANtCmrB,oBAMsC,GAAAnrB,KALtCorB,6BAKsC,GAAAprB,KAHtCqrB,sBAGsC;gBAAArrB,KAFtCsrB,kBAEsC,GAClC1nB,qBAAakC,IAAI;oBACbhC,MAAKwmB,YAAYA,WACjBxmB,MAAKunB,iBAAiB;oBAEtB,IAAME,eAAeN;oBAErB,KAAKM,cACD,MAAM,IAAI3mB,MAAJ;oBAGmB4mB,aAAzBD,aAAaE,WAIbC,QAAQC,IAHC,oCAAsCJ,aAAaE,UAAnD;oBAXM,IAiBXnjB,SAA4CijB,aAA5CjjB,QAAQO,SAAoC0iB,aAApC1iB,QAAQlJ,UAA4B4rB,aAA5B5rB,SAAkBsU,QAAUsX,aAAVtX;oBAE1CnQ,MAAKqD,UAF+CokB,aAAnBpkB,SAGjCrD,MAAKsnB,wBAAwBtnB,MAAK8nB,yBAAyBtjB;oBAC3DxE,MAAKqnB,eAAetiB,QACpB/E,MAAKwE,SAAS0a,yBAAmBlf,MAAKsnB,uBAAuBviB,QAAQlJ;oBAErEmE,MAAK+nB,kBAAkBhjB;oBAEvB,IAAMijB,eAAehoB,MAAKioB,cAAcjoB,MAAKsnB,uBAAuBviB,QAAQoL;oBAM5E,OALAnQ,MAAKkoB,SAASF,cAAcjjB,SAC5ByS,gBAAgBxX,MAAKsnB;oBAErBtnB,MAAKmoB,iBAEEnoB,MAAKwE,OAAO4jB,KAAKpoB,MAAKqoB;mBAE9BlpB,KAAK;oBACJ,OAAOa,MAAKsoB;mBAEb1mB,MAAM,SAAAxC;oBACLY,MAAK2B,QAAQvC;;;YAnDzB,IAAAwB,SAAAwmB,eAAAvmB;YAAA,OAAAD,OAuDI2nB,aAAA;gBAA+B,IAAAvnB,SAAA9E;gBAC3B,OAAO;oBACHugB,OAAiB;wBAAA,OAAMzb,OAAKyb;;oBAC5BF,OAAiB;wBAAA,OAAMvb,OAAKub;;oBAC5BiM,QAAiB,SAAA1P;wBAAA,OAAuB9X,OAAKwnB,OAAO;4BAAEjV,OAArCuF,KAAGvF;4BAAyCE,QAA5CqF,KAAUrF;;;oBAC3B9R,SAAiB,SAACvC;wBAAD,OAAS4B,OAAKW,QAAQvC;;oBACvCqpB,SAAiB,SAAC1oB;wBAAD,OAAaiB,OAAKynB,QAAQ1oB;;oBAC3CwE,WAAiB;wBAAA,OAAMvD,OAAKsmB;;oBAC5BoB,iBAAiB;wBAAA,OAAM1nB,OAAKqmB;;;eA/DxCzmB,OAmEImnB,oBAAA,SAAkBhjB;gBACd,KAAKsE,YAAYnN,KAAKsqB,UAAUmC,sBAAsB5jB,SAClD,MAAM,IAAIjE,MAAJ,oCAA6CiE;eArE/DnE,OAyEI6nB,UAAA,SAAQ1oB;gBACJ7D,KAAKqrB,eAAepmB,KAAKpB;eA1EjCa,OA6EIqnB,gBAAA,SAAcX,uBAA+CviB,QAA7DsO;gBAA+H,IACvHlD,OADwEuI,OAA+CrF,MAA/CqF,MAAatL,MAAkCiG,MAAlCjG;gBAGzF,IHzGC,UGyGGsL,MACAvI,QAJuHkD,MAAzC9V,YAK3E,IH1GN,UG0GUmb,MAA4B;oBACnC,KAAKzT,aAAaqiB,wBACd,MAAM,IAAIxmB,MAAJ,iEAA0EgE,oBAA1E;oBAGV,IAAMyR,SAASV,qBAAUyR;oBACzBnX,QAAQpB,aAAa,SAASwH,UAAUA,OAAOpG,MAAM/C;;gBAGzD,KAAK+C,OACD,MAAM,IAAIrP,MAAJ;gBAGV,OAAOoe,yBAAmBoI,uBAAuBviB,QAAQoL;eA/FjEvP,OAkGIknB,2BAAA,SAAyBc;gBAAyC,IpDsnBlCxkB,KAA6BrG,GoDrnBjD2a,OAASkQ,IAATlQ;gBAER,IHzHE,aGyHEA,MACA,OAAO3J,aAAa,UAAUtK,UAAU1F;gBAErC,IH1HL,aG0HS2Z,MAGP,OAAO3J,aAAa,WpD6mBI3K,MoD7mB0BrF,apD6mB4C,OAAzChB,IoD9mBpC6qB,IAAIjgB,cpD8mBgC5K,IAAa;gBAdvE,SAAsBqG,KAA6BrG;yBAAyC,MAAzCA,UAAa;oBAGnE,KAFA,IAAIyG,SAASJ,KAEJ9H,IAAI,GAAGA,IAAIyB,GAAGzB,KAAK;wBACxB,KAAKkI,QACD;wBAGJA,SAASD,UAAUC;;oBAGvB,OAAOA;iBAIAqkB,CAAazkB,KAAKsE,mBAAmBtE,OAAOrG;gBoD5mBxC,IH9HL,aG8HS2a,MAAmC;oBAAA,IAElCtL,MAAQwb,IAARxb,KACF0b,WAAW3gB,YAAYpJ;oBAE7B,KAAK+pB,UACD,MAAM,IAAIhoB,MAAJ;oBANgC,SAAA+O,MAAA,GAAAkZ,yBAStBxiB,qBAAqBuiB,WATCjZ,MAAAkZ,uBAAAtqB,QAAAoR,OASU;wBAA/C,IAAMhK,QAAKkjB,uBAAAlZ;wBACZ,IAAI5K,aAAaY,QAAQ;4BACrB,IAAM0Q,SAASV,qBAAUhQ;4BAEzB,IAAI0Q,UAAUA,OAAOyS,WAAWzS,OAAOyS,QAAQ5b,MAC3C,OAAOmJ,OAAOyS,QAAQ5b;;;;gBAMtC,MAAM,IAAItM,MAAJ,oBAA6B4X,OAA7B;eAjId9X,OAoIIqoB,WAAA;gBAGI,OADA/sB,KAAKiU,QAAQjU,KAAKiU,SAAS,IACpBjU,KAAKiU;eAvIpBvP,OA2IIsnB,WAAA,SAAS/X,OAAsB5G,QAAiB2f;qBAA4B,MAA5BA,yBAAqB;gBACjE,IAAMzC,UAAUvqB,KAAKqsB,cACfY,gBAAgBjtB,KAAK+sB;gBAG3B5a,OAAO8a,eFpKR,SAAgC7B,uBAA+Cd,WAA0BrW,OAAwB5G,QAAiBkd,SAA2ByC;yBAA6C,MAA7CA,yBAAqB;oBAAwB,KAE7N,IAAM1oB,SAAS,IAF8MqP,MAAA,GAAAqC,gBAK3MlV,OAAO8F,KAAKqN,QAL+LN,MAAAqC,cAAAzT,QAAAoR,OAKvL;wBAAjC,IAAMhS,MAAGqU,cAAArC,MACJ6W,OAAOF,UAAUG,kBAAkB9oB;wBAEzC,KAAI6oB,SAAQA,KAAK0C,cAAe7f,WAAWzE,gBAAU/F,WAAYkG,aAAaqiB,wBAA9E;4BAIA,IAAM/pB,QAAQgpB,mBAAmBC,WAAWrW,GAAOtS,KAAKsS,MAAMtS,MAAM4oB;4BAEpEjmB,OAAO3C,OAAON,OACVmpB,QAAQA,KAAK2C,UAAU7oB,OAAOkmB,KAAK2C,WACnC7oB,OAAOkmB,KAAK2C,SAAS9rB;;;oBAI7B,KAAK2rB,UAAU,SAAA9H,MAAA,GAAAkI,yBACO9C,UAAU+C,gBADjBnI,MAAAkI,uBAAA7qB,QAAA2iB,OACiC;wBAAvC,IAAMvjB,OAAGyrB,uBAAAlI;wBACLjR,MAAMjS,eAAeL,UACtB2C,OAAO3C,QAAO0oB,mBAAmBC,WAAWrW,GAAOtS,MAAKsS,MAAMtS,OAAM4oB;;oBAMhF,OAAOjmB;iBEqIqBgpB,CAAoBttB,KAAKorB,uBAAuBprB,KAAKsqB,WAAWrW,OAAO5G,QAAQkd,SAASyC;gBAHxC,SAAA9H,MAAA,GAAAqI,wBAOlDvtB,KAAKqrB,gBAP6CnG,MAAAqI,sBAAAhrB,QAAA2iB,OAOtDqI,sBAAArI,KACN3kB,KAAKP,MAAMitB;eAnJ/BvoB,OAuJIunB,gBAAA;gBAAgB,IAAA5mB,SAAArF;gBACZ6C,OAAOoS,iBAAiB,gBAAgB;oBACpC5P,OAAKiD,OAAOklB,WAAWrP;oBAG3Btb,OAAOoS,iBAAiB,UAAU;oBAC9B5P,OAAKiD,OAAOklB,WAAWrP;oBAG3BhQ,cAAcnO,KAAKorB,uBAAuB;oBACtC/lB,OAAKooB;;eAjKjB/oB,OAqKIgpB,gBAAA;gBAAgF,IAAA7S,QAClB7a,KAAKsrB,cAActrB,KAAKsqB,UAAUgB,cAAc,IAD9BqC,cAAA9S,MACtExD,OADsEuW,eAAA/S,MACvDtD,QADuDsW,gBAAAhT,MACvCvG,wBADuC,MAAAuZ,gBAC7B,SAD6BA;gBAG5E,OAAO;oBAAExW,YAHmE,MAAAsW;oBAG5DpW,aAH4D,MAAAqW;oBAGpDtZ,SADxBA,UAAUI,eAAeJ;;eAvKjC5P,OA2KI0nB,iBAAA;gBAAuC,IAAAnmB,SAAAjG;gBACnC,OhDnKGoT,uBAAuBnQ,KAAK;oBAC/B,IAAI+P,SAASC,MACT,OAAOD,SAASC;oBAGpB,MAAM,IAAIrO,MAAM;mBgD8Ja3B,KAAK;oBAAM,IAAA6qB,uBACD7nB,OAAKynB,iBAAhCrW,QAD4ByW,qBAC5BzW,OAAOE,SADqBuW,qBACrBvW,QAAQjD,UADawZ,qBACbxZ;oBAElBA,YAAa+C,SAAUE,WAAWtR,OAAKkB,YAAYuiB,QAAQ3hB,SAIhEkP,SAAS3C,SAAS,SAAA0G;wBACd/U,OAAKqmB,OAAO;4BACRjV,OAAQA,QAF8C2D,MAAzC3D,aAEc1R;4BAC3B4R,QAAQA,SAH8CyD,MAAxBzD,cAGD5R;;uBAElC;wBAAE0R;wBAAOE;;;eAxLxB7S,OA4LIynB,eAAA;gBAEI,IAAMpsB,OAAOC;gBAEb,OAAO;oBACH+tB,aADG,SACS9Z;wBAA6C,IAAAwN,SAAAzhB;wBACrD,OAAO4D,qBAAakC,IAAI;4BAAA,OAAM/F,KAAKisB,SAAS/X,OAAOwN,OAAKkC,aAAY;;;oBAGxEtD,OALG;wBAMC,OAAOzc,qBAAakC,IAAI;4BAAA,OAAM/F,KAAK0tB;;;;eAtMnD/oB,OA2MI4nB,SAAA,SAAAnR;gBACI,OAAOnb,KAAKsI,OAAOgkB,OAAOnO,cAAc;oBAAE9G,OADyC8D,MAA9E9D;oBAC4CE,QADkC4D,MAAvE5D;;eA3MpB7S,OA+MI2b,QAAA;gBACI,OAAOrgB,KAAKsI,OAAO+X;eAhN3B3b,OAmNI+oB,UAAA;gBACI,OAAO7pB,qBAAakC,IAAI;oBACpBjD,OAAOwd;;eArNnB3b,OAyNI6b,QAAA;gBACI,OAAO3c,qBAAakC,IAAI;oBACpBjD,OAAO0d;;eA3NnB7b,OA+NIe,UAAA,SAAQvC;gBAAkC,IAAA8qB,SAAAhuB;gBACtC,OAAO4D,qBAAakC,IAAI;oBACpB,IAAIkoB,OAAK1lB,UAAU0lB,OAAK1lB,OAAO7C,SAC3B,OAAOuoB,OAAK1lB,OAAO7C,QAAQvC;oBAE3B,MAAMA;;eApOtBgoB;SAAA,ICxBa+C,iBAAoD;QCoFjE,SAASC,oBAAoB1D,MAAmC7oB,KAAcN;YAC1E,OAAOuC,qBAAakC,IAAI;gBACpB,OAA+B,qBAApB0kB,KAAK2D,aACL3D,KAAK2D,WAAW;oBAAE9sB;qBACS,mBAApBmpB,KAAK2D,aACZ3D,KAAK2D,aAELxsB;;;QAMnB,SAASysB,cAAoB5D,MAAmC7oB,KAAcN;YAC1E,OAAOuC,qBAAakC,IAAI;gBACpB,OAA+B,qBAApB0kB,KAAK6D,cAA6B/b,UAAUjR,SAC5CmpB,KAAK6D,WAAW;oBAAEhtB;qBAElBA;;;QDpGnB4sB,eAAevE,QAAQ5hB,UAAU;YAC7BwmB,cAAa;YAEbC,WAH6B;gBAIzB,OAAO7F,eAAepT,WAAO;oBACzBQ,YAAY3T,SAAA;wBACRqsB,OAAOxuB,KAAKsqB,UAAU3pB;uBACnBX,KAAKsqB,UAAUxU,WAAWR;;;YAKzCyJ,MAZ6B,SAYxB0P;gBAA0E,IAAA3qB,QAAA9D;gBAC3E,KAAKyuB,YACD,MAAM,IAAI7pB,MAAJ;gBAGV,OAAO6pB,WAAWxtB,MAAMgC,KAAK,SAAA0G;oBACzB,OAAOyL,iBAAiBzL,OAAO1G,KAAK,SAAAiF;wBAEhC,IjDyyBqBoM,SAAuBzQ,SAGpDwP,UiD5yBcqb,gBjDyyBepa,UiDzyBqB3K,OjD0yBtD9F,UAAUiO,KAD8CjO,UiDzyBK;4BAAA,OAAMC,MAAKuc;4BjD8yBpErJ,gBAAgB1C,WAChBzQ,YAEAwP,WAAWjB,aAAa;4BAChB4E,gBAAgB1C,aAChBjB,SAASpM,UACTpD;2BAEL,KAGA;4BACHoD,QADG;gCAEKoM,YACAA,SAASpM;;;wBiDvzBT,OAJAnD,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAMgc,aAAaznB;4BACvCnD,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAMoE,eAAenN;4BACzC7F,MAAK6qB,MAAMjc,SAAS;4BAAA,OAAM8V,cAActgB;4BAEjC0Z,oBAAc1Z;;;;YAKjC0mB,oBA9B6B;gBA+BzB,OAAOlG,eAAepT,WAAO;oBACzBQ,YAAY3T,SAAA;wBACRxB,MAAI,6BAA+BX,KAAKsqB,UAAU3pB,OAA9C,MAAwD6P,aAAxD;wBACJge,OAAK,gBAAiBxuB,KAAKsqB,UAAU3pB;uBAClCX,KAAKsqB,UAAUxU,WAAWR;;;YAKzCuZ,eAxC6B,SAwCfC,UAAwBC;gBAAmF,IAAAjqB,SAAA9E;gBACrH,KAAK+uB,qBACD,MAAM,IAAInqB,MAAJ;gBAGV,OAAOmqB,oBAAoB9tB,MAAMgC,KAAK,SAAA+rB;oBAGlC,OAFAlqB,OAAK6pB,MAAMjc,SAAS;wBAAA,OAAMoE,eAAekY;wBAElC5Z,iBAAiB4Z,gBAAgB/rB,KAAK,SAAAgsB;wBACzC,OAAO9lB,iBAAiB8lB;uBACzBhsB,KAAK,SAAAiF;wBACJ,OAAO0Z,oBAAc1Z;;;;YAKjCgnB,UAAU,EACN,qBACA,mBACA,aACA,sBACA,aACA,QACA;WAKJjB,eAAevE,QAAQ3hB,SAAS;YAC5BumB,cAAa;YAEbvP,MAH4B;gBAGO,IAAA1Z,SAAArF;gBAC/B,OAAO4D,qBAAakC,IAAI;oBAAM,IAAAqpB,wBACF9pB,OAAKilB,UAAU8E,YAAjC/X,QADoB8X,sBACpB9X,OAAOE,SADa4X,sBACb5X,QAKPrP,MjD+Sf,SAAe6F,KAAcwH;wBAAiD,IAK3E8B,SAFN9B,UAAUA,WAAW,IAEf8B,OAAOE,SAAWhC,QAAXgC,QAETrN,MAAM,GACNmlB,OAAO;wBAEPhY,UACIxU,OAAOysB,aACPD,OAAOlgB,KAAKogB,OAAO1sB,OAAOysB,aAAajY,SAAS,KAAKxU,OAAO2sB,UACrD3sB,OAAO4sB,OAAOpY,UACrBgY,OAAOlgB,KAAKogB,OAAO1sB,OAAO4sB,OAAOpY,QAAQA,SAAS;wBAItDE,WACI1U,OAAO6sB,cACPxlB,MAAMiF,KAAKogB,OAAO1sB,OAAO6sB,cAAcnY,UAAU,KAAK1U,OAAO8sB,UACtD9sB,OAAO4sB,OAAOlY,WACrBrN,MAAMiF,KAAKogB,OAAO1sB,OAAO4sB,OAAOlY,SAASA,UAAU;wBAiB3D,IAAI5W,QAbJ4U,UAAUpT,SAAA;4BACN+H;4BACAmlB;4BACAhY;4BACAE;4BACAqY,QAAY;4BACZC,SAAY;4BACZC,SAAY;4BACZC,WAAY;4BACZC,YAAY;2BACTza,UAGY5U,QAAQ;+BACpB4U,QAAQ5U;wBAGf,IAOIuH,KASIhF,KAhBJwQ,SAAS5S,OAAO8F,KAAK2O,SAAS1O,IAAI,SAAAlF;4BAElC,IAAI4T,QAAQ5T,MACR,OAAWA,MAAX,MAAoBgM,UAAU4H,QAAQ5T;2BAE3CuS,OAAO1G,SAASU,KAAK;wBAIxB;4BACIhG,MAAMrF,OAAOkc,KiDpWa,IjDoWHpe,MAAM+S,SAAQ;0BACvC,OAAOxQ;4BACL,MAAM,IAAI6R,eAAJ,kCAAmD7R,IAAImB,SAASnB,IAAI0H;;wBAG9E,IAAIH,eAAevC,MAEf,MADU,IAAI6M,eAAJ;wBAMd,OAFAlS,OAAOoS,iBAAiB,UAAU;4BAAA,OAAM/M,IAAImY;4BAErCnY;qBiDhXiB+nB,CAAM,GAAD9tB,SAAA;wBACbkV,OAJJA,QAAQ0B,mBAAmB1B,OAAOxU,OAAOysB;wBAKrC/X,QAJJA,SAASwB,mBAAmBxB,QAAQ1U,OAAOysB;uBAKpCjqB,OAAKilB,UAAUxU,WAAWma;oBAQjC,OALA5qB,OAAKspB,MAAMjc,SAAS;wBAChBxK,IAAImY,SACJmI,cAActgB;wBAGX0Z,oBAAc1Z;;;YAI7B2mB,eAzB4B,SAyBdC;gBACV,OAAOlrB,qBAAakC,IAAI;oBACpB,OAAOgpB;;;YAIfI,UAAU,EACN,qBACA,mBACA;;QEhDL,IAAMgB,yBAAb;YAgBI,SAAAA,gBAAY5F,WAA0BrW;gBAA2B,IAAAnQ,QAAA9D;gBAAAA,KAdjEsqB,iBAciE,GAAAtqB,KAbjEmwB,cAaiE,GAAAnwB,KAZjE2uB,aAYiE,GAAA3uB,KAXjE4W,aAWiE;gBAAA5W,KATjEowB,mBASiE,GAAApwB,KARjEqwB,qBAQiE,GAAArwB,KANjEiU,aAMiE,GAAAjU,KALjEswB,aAKiE;gBAAAtwB,KAJjEqJ,aAIiE,GAAArJ,KAFjE8uB,gBAEiE,GAC7D9uB,KAAKowB,cAAc,IAAIxsB;gBACvB5D,KAAKqwB,gBAAgB,IAGrBrwB,KAAKiU,QAAQ,IAEbjU,KAAK2uB,QAAQpc,QAAQvS,OACrBA,KAAKswB,QAAQ;gBAEbtwB,KAAKsqB,YAAYA,WAEjBtqB,KAAKuwB,YAAYtc,MAAMxO,UACvBzF,KAAKgsB,SAAS/X;gBACdjU,KAAKsqB,UAAUkG,wBAAwBxwB,OACvCA,KAAK2uB,MAAMjc,SAAS;oBAAA,OAAM5O,MAAKwmB,UAAUmG,uBAAuB3sB;oBAChE9D,KAAK0wB;;YAhCb,IAAAhsB,SAAAwrB,gBAAAvrB;YAAA,OAAAD,OAmCI6rB,cAAA,SAAY9qB;gBAA4B,IpDwcpCkrB,WACAxsB,UoDzcoCW,SAAA9E;gBACpCA,KAAK4W,SpDucL+Z,YAAY,IACZxsB,WAAW,IAER;oBAEH0a,IAFG,SAEA+R,WAAoB/sB;wBACnB,IAAIgtB,cAAc1sB,SAASysB,aAAazsB,SAASysB,cAAc;wBAE/DC,YAAY5rB,KAAKpB;wBAEjB,IAAIwkB,aAAY;wBAEhB,OAAO;4BACHphB,QADG;gCAEMohB,cACDA,aAAY,GACZwI,YAAY3pB,OAAO2pB,YAAY7rB,QAAQnB,UAAU;;;;oBAOjEiO,MApBG,SAoBE8e,WAAoB/sB;wBAErB,IAAI2hB,WAAWxlB,KAAK6e,GAAG+R,WAAW;4BAC9BpL,SAASve,UACTpD;;wBAGJ,OAAO2hB;;oBAGXsL,SA9BG,SA8BKF;wBAA0E,SAAAG,QAAAzuB,UAAAC,QAAnD6E,OAAmD,IAAAkG,MAAAyjB,QAAA,IAAAA,QAAA,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAAnD5pB,KAAmD4pB,QAAA,KAAA1uB,UAAA0uB;wBAE9E,IAAIH,cAAc1sB,SAASysB,YACvBtqB,WAAW;wBAEf,IAAIuqB,aAAa,SAAAvrB,QAAA,SAAAqO;4BACR,IAAI9P,UAAWgtB,YAAJld;4BACZrN,SAASrB,KAAKrB,qBAAakC,IAAI;gCAAA,OAAMjC,QAAOpB,WAAP,GAAW2E;;2BAFvCuM,MAAA,GAAAA,MACOkd,YADPtuB,QAAAoR,OACoBrO,MAAAqO;wBAKrC,OAAO/P,qBAAayC,IAAIC,UAAUrD,KAAK4O;;oBAG3Cof,aA5CG,SA4CSL;wBAER,IAAID,UAAUC,YACV,OAAOhtB,qBAAaH;wBAGxBktB,UAAUC,cAAa;wBAN2D,SAAAM,QAAA5uB,UAAAC,QAAnD6E,OAAmD,IAAAkG,MAAA4jB,QAAA,IAAAA,QAAA,QAAAC,QAAA,GAAAA,QAAAD,OAAAC,SAAnD/pB,KAAmD+pB,QAAA,KAAA7uB,UAAA6uB;wBAOlF,OAAOnxB,KAAK8wB,QAALruB,MAAAzC,MAAA,EAAa4wB,YAAbtmB,OAA2BlD;;oBoD3ftCpH,KAAK4W,MAAMiI,GAAGiL,MAAMC,QAAU;oBAAA,OAAMjlB,OAAKmP,MAAMmd;oBAC/CpxB,KAAK4W,MAAMiI,GAAGiL,MAAMG,SAAU;oBAAA,OAAMnlB,OAAKmP,MAAMod;oBAC/CrxB,KAAK4W,MAAMiI,GAAGiL,MAAME,UAAU;oBAAA,OAAMllB,OAAKmP,MAAMqd;oBAC/CtxB,KAAK4W,MAAMiI,GAAGiL,MAAMI,OAAU;oBAAA,OAAMplB,OAAKmP,MAAMsd;oBAC/CvxB,KAAK4W,MAAMiI,GAAGiL,MAAMK,OAAU,SAAClW;oBAAD,OAAWnP,OAAKmP,MAAMsY,QAAQtY;oBAE5DjU,KAAK4W,MAAMiI,GAAGiL,MAAMrO,OAAO,SAAAvY;oBACvB,OAAI4B,OAAKmP,SAASnP,OAAKmP,MAAMxO,UAClBX,OAAKmP,MAAMxO,QAAQvC,OACnBuC,UACAA,QAAQvC,OAER4B,OAAKsrB,YAAY3rB,OAAOvB,KAAKD,KAAK;wBACrC8B,WAAW;4BACP,MAAM7B;2BACP;;;eArDvBwB,OA2DI8sB,SAAA,SAAOnvB,QAAgC+R,WAAkCjN;gBAAwD,IAAA9B,SAAArF;gBAC7H,OAAO4D,qBAAakC,IAAI;oBACpBT,OAAKilB,UAAUqB,IAAf,WAEAtmB,OAAK8qB,SAASlC,eAAe9mB;oBAC7B,IAAM+J,MAAUkY,OAAP,MAAiB/jB,OAAKilB,UAAU9U,MAAhC,MAAyChF,YAC5C3H,SAASxD,OAAKuD,aACd6oB,gBAAgBpsB,OAAKqsB;oBAE3BrsB,OAAKilB,UAAUqH,iBAAiBtvB,QAAQwG,QAAQuL,YAE5C/R,WAAWQ,UACXwC,OAAK6pB,SAAS/nB,SAAS9E;oBAG3B,IAAMmQ,QAAQ;oBAkEd,OAhEAA,MAAM0Z,OAAO7mB,OAAK+qB,aAClB5d,MAAMof,WAAWvsB,OAAKusB,YACtBpf,MAAM4e,WAAW/rB,OAAKuR,MAAMka,QAAQhH,MAAMC;oBAE1CvX,MAAMqf,oBAAoBxsB,OAAKwsB,kBAAkBzd,YAEjD5B,MAAM+b,YAAYlpB,OAAKkpB;oBACvB/b,MAAMoc,qBAAqBvpB,OAAKupB,sBAEhCpc,MAAMsf,kBAAkBluB,qBAAayC,IAAI,EAAEmM,MAAMqf,mBAAmBrf,MAAM+b,WAAW/b,MAAMoc,sBAAsB3rB,KAAK,SAAA2Z;wBAClH,OAAOvX,OAAKysB,gBAD+JlV,KAAA,IAC/H;4BAAEzV;4BAAS+J;4BAAKud,YAD+G7R,KAAA;4BACnGmS,qBADmGnS,KAAA;;wBAI/KpK,MAAMuM,OAAO1Z,OAAK8qB,OAAO7B,cACnBjpB,OAAK0Z,SACLvM,MAAM+b,UAAUtrB,KAAK,SAAAwrB;wBAAU,OAAIppB,OAAK0Z,KAAK0P;wBAEnDjc,MAAMqc,gBAAgBjrB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAMoc,sBAAsB3rB,KAAK,SAAAkU;wBAClF,OAAO9R,OAAKwpB,cAD6G1X,MAAA,IAAAA,MAAA;wBAI7H3E,MAAMuf,WAAWnuB,qBAAayC,IAAI,EAC9BmM,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAEZ,OADAzpB,OAAKypB,WAAWA,UACTzpB,OAAK2sB,YAAYlD;2BAIhCtc,MAAMyf,YAAYruB,qBAAayC,IAAI,EAAEmM,MAAMqc,eAAerc,MAAMuf,YAAY9uB,KAAK,SAAA4X;wBAC7E,OAAOxV,OAAK4sB,UAD4FpX,MAAA,IAC/D;4BAAE1T;4BAAS+J;;wBAGxDsB,MAAM0f,UAAUtuB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAMof,UAAUpf,MAAM2f,eAAe3f,MAAMyf,aAAahvB,KAAK,SAAA+X;wBACxG,OAD+HA,MAAA,GAC/GyF,YAD+GzF,MAAA;wBAInIxI,MAAM4f,kBAAkB5f,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBACpC,OAAOzpB,OAAK+sB,gBAAgB;4BAAEtD;4BAAU2C;4BAAe5oB;4BAAQxG;4BAAQ8E;4BAAS+J;;wBAGpFsB,MAAM2f,gBAAiBvuB,qBAAayC,IAAI,EAAEmM,MAAMuM,MAAMvM,MAAM4f,mBAAmBnvB,KAAK,SAAAkY;wBAChF,OAD8GA,MAAA,GAC9FwF,QAD8FxF,MAAA;wBAIlH3I,MAAMyZ,gBAAgBzZ,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAClCzpB,OAAK4mB,cAAc6C;wBAGvBtc,MAAM6e,YAAYztB,qBAAayC,IAAI,EAAEmM,MAAMsf,iBAAiBtf,MAAMyf,aAAahvB,KAAK;wBAChF,OAAOoC,OAAKuR,MAAMka,QAAQhH,MAAMG;wBAGpCzX,MAAMmW,aAAanW,MAAMuM,KAAK9b,KAAK,SAAA6rB;wBAC/B,OAAOzpB,OAAKsjB,WAAWmG,UAAU2C,eAAetqB;wBAGpDqL,MAAM6f,aAAa7f,MAAM0f,QAAQjvB,KAAK;wBAClC,OAAOoC,OAAKgtB;wBAGhB7f,MAAM4e,WAAW5e,MAAM0Z,KAAKjpB,KAAK;wBAC7B,OAAOoC,OAAKuR,MAAMka,QAAQhH,MAAME;wBAG7BpmB,qBAAa+C,KAAK6L;mBAE1B9M,MAAM,SAAAxC;oBACL,OAAOU,qBAAayC,IAAI,EACpBhB,OAAKI,QAAQvC,MACbmC,OAAKooB,QAAQvqB,QACdD,KAAK;wBACJ,MAAMC;;mBAEXD,KAAK4O;eArJhBnN,OAwJImtB,oBAAA,SAAkBzd;gBACd,OAAOxQ,qBAAakC,IAAI;oBACpB,OAAO+O,aAAaT;mBACrBnR,KAAK,SAAAqvB;oBACJ,OAAO5J,eAAe4J;;eA5JlC5tB,OAgKI0tB,kBAAA,SAAAhX;gBAAoP,IAC1OmQ,eAAevrB,KAAKuyB,kBAAkB;oBAAEzD,UADkM1T,MAAlO0T;oBAC0C2C,eADwLrW,MAAxNqW;oBAC+C5oB,QADyKuS,MAAzMvS;oBACwCxG,QADiK+Y,MAAjM/Y;oBACwC8E,SADyJiU,MAApLjU;oBACoC+J,KADgJkK,MAAzLlK;;gBAEvD,cAAakY,OAAb,OAAwBppB,KAAKsqB,UAAU3pB,OAAvC,OAAkDwP,aAAazC,KAAKC,UAAU4d,iBAA9E;eAlKR7mB,OAqKI8tB,cAAA,SAAY1D,UAAwB2C,eAAwB5oB,QAA0BqI;gBAClF,IAAM7P,QAAQshB,uBAAiBmM,UAAUjmB,QAAQ7I,KAAKyyB,iBAAiB5pB,UAEjE6pB,UAAWjB,kBAAkB7oB,oBAC7B;oBAAE4T,MNjOP;oBMiOgCtL;oBAC3B;oBAAEsL,MNnOP;oBMmOgCnb;;gBAEjC,INpOC,UMoOGqxB,QAAQlW,MAA4B;oBACpC,IAAMnC,SAASV,qBAAU9W;oBACzBwX,OAAOpG,QAAQoG,OAAOpG,SAAS,IAC/BoG,OAAOpG,MAAM/C,OAAO7P,OAEpBrB,KAAK2uB,MAAMjc,SAAS;+BACT2H,OAAOpG,MAAM/C;;;gBAI5B,OAAOwhB;eAtLfhuB,OAyLI6tB,oBAAA,SAAArb;gBAA0Q,IAAAyb,aAAA,MAAAzb,QAAnB,KAAmBA,OAAtP4X,WAAsP6D,MAAtP7D,UAAU2C,gBAA4OkB,MAA5OlB,eAAe5oB,SAA6N8pB,MAA7N9pB,QAA6N+pB,eAAAD,MAArNtwB,sBAAqN,MAAAuwB,eAA5M/vB,SAA4M+vB,cAApMzrB,UAAoMwrB,MAApMxrB,SAAS+J,MAA2LyhB,MAA3LzhB;gBAC3E,OAAO;oBACHA;oBACA/J;oBACAskB,SAASD;oBACT3iB,QAASD,gBAAU/F;oBACnB2S,KAASxV,KAAKsqB,UAAU9U;oBACxBlN,QAAStI,KAAK6yB,aAAaxwB,QAAQovB,eAAevgB,KAAK/J;oBACvD8M,OAASjU,KAAKwyB,YAAY1D,UAAU2C,eAAe5oB,QAAQqI;oBAC3DvR,SAASgjB,uBAAiBmM,UAAUjmB,QAAQ7I,KAAK8yB,mBAAmBhE;;eAlMhFpqB,OAsMIstB,cAAA,SAAYlD;gBAA6C,IAAA7oB,SAAAjG;gBACrD,OAAO4D,qBAAakC,IAAI;oBACpBG,OAAK6oB,WAAWA;;eAxM5BpqB,OA4MI2nB,aAAA;gBAAgC,IAAA5K,SAAAzhB;gBAC5B,OAAO;oBACHswB,OAAatwB,KAAKswB;oBAClB1Z,OAAa5W,KAAK4W;oBAClByJ,OAAa;wBAAA,OAAMoB,OAAKpB;;oBACxBE,OAAa;wBAAA,OAAMkB,OAAKlB;;oBACxB+L,QAAa,SAAAxI;wBAAA,OAAuBrC,OAAK6K,OAAO;4BAAEjV,OAArCyM,MAAGzM;4BAAyCE,QAA5CuM,MAAUvM;;;oBACvB9R,SAAa,SAACvC;wBAAD,OAASue,OAAKhc,QAAQvC;;oBACnC6qB,aAAa,SAAC9Z;wBAAD,OAAWwN,OAAKsM,YAAY9Z;;;eApNrDvP,OAwNIsnB,WAAA,SAAS/X,OAA2B+Y;qBAA4B,MAA5BA,yBAAqB,IACjDhtB,KAAKsqB,UAAUyI,YACf/yB,KAAKsqB,UAAUyI,SAAS;oBAAE9e;;gBAG9B,IAAMsW,UAAUvqB,KAAKqsB;iBD1RtB,SAAwB/B,WAA0BrW,OAAsB+e,YAAgCzI,SAA4ByC;yBAA4B,MAA5BA,yBAAqB,IAI5J7a,OAAO8B,OADP+e,aAAaA,cAAc;oBAHwI,KAMnK,IAAMC,YAAYjG,WAAW,KAAH,GAAA1iB,OAAaggB,UAAU+C,iBANkH1Z,MAAA,GAAAqC,gBASjJlV,OAAO8F,KAAKosB,aATqIrf,MAAAqC,cAAAzT,QAAAoR,OASxH;wBAAtC,IAAMhS,MAAGqU,cAAArC;yBACsB,MAA5Bsf,UAAUjuB,QAAQrD,QAClBsxB,UAAUhuB,KAAKtD;;oBAX4I,KAenK,IAAMuxB,UAAU,IAER5C,QAAiC/F,QAAjC+F,OAAOjQ,QAA0BkK,QAA1BlK,OAAOE,QAAmBgK,QAAnBhK,OAAO9a,UAAY8kB,QAAZ9kB,SAjBsIyf,MAAA,GAAAA,MAmBjJ+N,UAnBiJ1wB,QAAA2iB,OAmBtI;wBAAxB,IAAMvjB,OAAOsxB,UAAJ/N,MACJiO,UAAU7I,UAAUG,kBAAkB9oB,OAExCN,QAAQ2xB,WAAWrxB;wBAEvB,IAAKwxB,SAAL;4BAIA,IAAMhG,QAAQgG,QAAQhG;4BAgBtB,IAfIA,WACK7a,UAAUjR,UAAUiR,UAAU0gB,WAAW7F,YAC1C9rB,QAAQ2xB,WAAW7F;4BAEvB+F,QAAQjuB,KAAKkoB,SAGbgG,QAAQ9xB,UACRA,QAAQ8xB,QAAQ9xB,MAAM;gCAAE4S;gCAAOqc;gCAAOjQ;gCAAOE;gCAAO9a;kCAGnD6M,UAAUjR,UAAU8xB,QAAQC,YAC7B/xB,QAAQ8xB,QAAQC,QAAQ;gCAAEnf;gCAAOqc;gCAAOjQ;gCAAOE;gCAAO9a;iCAGtD6M,UAAUjR,WACW,YAAjB8xB,QAAQ3W,QAAoBlP,MAAMC,QAAQlM,gBAAiBA,UAAU8xB,QAAQ3W,OAC7E,MAAM,IAAIpW,UAAJ,yBAAsC+sB,QAAQ3W,OAA9C,OAAyD7a;4BAKvEsS,MAAMtS,QAAON;;;oBAnDkJ,SAAA0U,MAAA,GAAAA,MAsD/Imd,QAtD+I3wB,QAAAwT,cAwDxJ9B,MAFSif,QAAJnd;oBAtDmJ,SAAAwQ,MAAA,GAAA8M,gBA4DjJvyB,OAAO8F,KAAKqN,QA5DqIsS,MAAA8M,cAAA9wB,QAAAgkB,OA4D7H;wBAAjC,IAAM5kB,QAAG0xB,cAAA9M,MACJ4M,WAAU7I,UAAUG,kBAAkB9oB,QAEtCN,SAAQ4S,MAAMtS;wBAEfwxB,aAID7gB,UAAUjR,WAAU8xB,SAAQJ,YAE5BI,SAAQJ,SAAS;4BAAE1xB;4BAAO4S;4BAG1B3B,UAAUjR,WAAU8xB,SAAQG,aAE5Brf,MAAMtS,SAAOwxB,SAAQG,SAAS;4BAAEjyB;4BAAO4S;4BAAOqc;4BAAOjQ;4BAAOE;4BAAO9a;;;oBA5EwF,SAAAghB,OAAA,GAAA2G,yBAgFjJ9C,UAAU+C,gBAhFuI5G,OAAA2G,uBAAA7qB,QAAAkkB,QAgFvH;wBAAvC,IAAM9kB,QAAGyrB,uBAAA3G;wBAEV,KAAyB,MADT6D,UAAUG,kBAAkB9oB,OAChC4xB,aAAuBjhB,UAAU2B,MAAMtS,SAC/C,MAAM,IAAIiD,MAAJ,oBAA6BjD,QAA7B;;iBCwMV6xB,CAAYxzB,KAAKsqB,WAAWtqB,KAAKiU,OAAOA,OAAOsW,SAASyC;eA9NhEtoB,OAiOIktB,WAAA;gBAAkC,ID9KN6B,UAA0Cxf,OAEhEP,QC4K4Bsa,SAAAhuB;gBAC9B,QD/KwByzB,WC+KJtxB,SAAA,IAAKnC,KAAKsqB,UAAUrW,OAAUjU,KAAKsqB,UAAUoJ;gBD/KCzf,QC+KejU,KAAKiU,OD7KpFP,SAAS,IAGR9P,qBAAayC,IAAIvF,OAAO8F,KAAKqN,OAAOpN,IAAI,SAAAlF;oBAE3C,IAAM6oB,OAAOiJ,SAAS9xB;oBAEtB,IAAK6oB,MAIL,OAAO5mB,qBAAaH,UAAUR,KAAK;wBAE/B,IAAM5B,QAAQ4S,MAAMtS;wBAEpB,IAAKN,SAIAmpB,KAAK2D,YAIV,OAAO9sB;uBAER4B,KAAK,SAAA5B;wBAEJ,IAAIA,eAIJ,OAAOuC,qBAAayC,IAAI,EAEpB6nB,oBAAc1D,MAAM7oB,KAAKN,QAEzB+sB,cAAc5D,MAAM7oB,GAAKN,UAC1B4B,KAAK,SAAA2Z;4BAAgC,IAEhCtY,QAFG6pB,aAA6BvR,KAAA,IAAjByR,aAAiBzR,KAAA;4BAIpC,IAA0B,oBAAfyR,YACP/pB,SAAS+pB,WAAWrrB,iBACjB,IAA0B,mBAAfqrB,YACd/pB,SAAS+pB,WAAWrrB,iBACjB,IAA0B,mBAAfqrB,cAA0C,SAAfA;gCAEzC,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmB7b,MAC1CpJ,SAASoJ,KAAKC,UAAU0gB,kBACrB,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmBE,QACjDnlB,SAAS+L,KAAK3C,KAAKC,UAAU0gB,mBAC1B,IAAI7D,KAAKmJ,kBAAkBpK,mBAAmBC,WAAWgB,KAAKmJ,eAAe;oCAChFrvB,SnDqUjB,SAASsvB,OAAOnlB,KAAcolB,QAAsBC;wCAEvD,KAAK,IAAInyB,YAF4F,MAApEkyB,oBAAkB,UAAkD,MAA9CC,oBAAkB;wCACzED,SAASA,SAAaA,SAAP,MAAoBA,QACnBplB,KACPA,IAAIzM,eAAeL,QAApB,QAA4B8M,IAAI9M,QAA+D,qBAAb8M,IAAI9M,SAE/E8M,IAAI9M,QAAQ2L,MAAMC,QAAQkB,IAAI9M,SAAS8M,IAAI9M,KAAKY,UAAUkM,IAAI9M,KAAKoyB,MAAM,SAAA9iB;4CAAG,OAAmB,mBAARA;6CAC9F6iB,OAAM,KAAKD,SAAWlyB,MAAhB,QAA4B8M,IAAI9M,KAAKuM,KAAK,OACzCO,IAAI9M,QAA4B,mBAAb8M,IAAI9M,OAC9BmyB,SAASF,OAAOnlB,IAAI9M,MAAL,KAAekyB,SAAWlyB,KAAQmyB,UAEjDA,OAAM,KAAKD,SAAWlyB,OAA6B8M,IAAI9M,KA3BlDqB;wCA8Bb,OAAO8wB;qCmDlVsBF,CAAOvF,YAAY1sB;oCADoD,SAAA+kB,OAAA,GAAAsN,gBAG3DlzB,OAAO8F,KAAKtC,SAH+CoiB,OAAAsN,cAAAzxB,QAAAmkB,QAGtC;wCAArC,IAAMuN,SAAMD,cAAAtN;wCACbhT,OAAOugB,UAAU3vB,OAAO2vB;;oCAG5B;;mCAGyB,mBAAf5F,eACd/pB,SAAS+pB,WAAWrrB;4BAGxB0Q,OAAOya,cAAc7pB;;;oBAI7BrB,KAAK;oBACL,OAAOyQ;oBCwGsFzQ,KAAK,SAAAixB;oBAC9F,OnD9KL,SAAmBnmB,KAAcwH;6BAA2F,MAA3FA,sBAA8E;wBAElH,IAGI4e,aAEAC,cALAF,QAAQ3e,QAAQ2e,SAAS,IACzBvtB,OAAO4O,QAAQ5O,QAAQ,IAHoG0tB,aAS/FtmB,IAAIC,MAAM;wBAA3BomB,eATgHC,WAAA;wBAAA,IAAAC,sBAS7HH,cAT6HE,WAAA,IAUlFrmB,MAAM;wBAAjDmmB,cAV6HG,mBAAA;wBAY/H,IAAI7gB,cAAcM,YAZ6GugB,mBAAA,IAYlFJ,QACzCK,aAAaxgB,YAAYqgB,cAAcztB;wBAU3C,OARI8M,gBACA0gB,cAAkBA,cAAP,MAAwB1gB,cAGnC8gB,eACAJ,cAAkBA,cAAP,MAAwBI;wBAGhCJ;qBmDuJQK,CAAU9lB,iBAAiBsf,OAAK1D,UAAUmK,OAAOzG,OAAK/Z,SAAS;wBAAEigB;;;eAnOpFxvB,OAuOIkE,YAAA;gBACI,OAAO5I,KAAKsqB,UAAU1hB,UAAU5I,KAAKiU;eAxO7CvP,OA2OIgtB,mBAAA;gBACI,OAAO1xB,KAAKsqB,UAAUoH,iBAAiB1xB,KAAKiU;eA5OpDvP,OA+OI+tB,mBAAA,SAAiB5pB;gBAA2C,KACxD,IAAMvE,SAAS,IADyCqP,MAAA,GAAAqC,gBAGtClV,OAAO8F,KAAK5G,KAAKiU,QAHqBN,MAAAqC,cAAAzT,QAAAoR,OAGb;oBAAtC,IAAMhS,MAAGqU,cAAArC,MACJ6W,OAAOxqB,KAAKsqB,UAAUG,kBAAkB9oB;oBAE1C6oB,SAA6B,MAArBA,KAAKkK,eAIblK,QAAQA,KAAK0C,eAAe/f,YAAYtE,QAAQD,gBAAU/F,aAK9DyB,OAAO3C,OAAO3B,KAAKiU,MAAMtS;;gBAI7B,OAAO2C;eAlQfI,OAqQIqpB,cAAA,SAAY9Z;gBAAgD,IAAA0gB,SAAA30B;gBAGxD,OAFAA,KAAKgsB,SAAS/X,QAAO,IAEdjU,KAAKowB,YAAYntB,KAAK;oBACzB,IAAI0xB,OAAKtrB,OACL,OAAOsrB,OAAKtrB,MAAM0kB,YAAY4G,OAAKlC,iBAAiBkC,OAAK/rB,cAAclD,MAAM,SAAAxC;wBACzE,IAAKyxB,OAAKtrB,SAAUsrB,OAAK7F,UAIzB,OAAO6F,OAAKnH,WAAWmH,OAAK7F,UAAU7rB,KAAK;4BACvC,IAAI0xB,OAAKtrB,OACL,MAAMnG;;;;eAjRlCwB,OAyRI6pB,YAAA;gBAA4D,IAAAqG,SAAA50B;gBACxD,OAAO4D,qBAAakC,IAAI;oBACpB,IAAI8uB,OAAKzE,OAAO5B,WACZ,OAAOqG,OAAKzE,OAAO5B,UAAUhuB,KAAKq0B;;eA5RlDlwB,OAiSIkqB,qBAAA;gBAAqE,IAAAiG,SAAA70B;gBACjE,OAAO4D,qBAAakC,IAAI;oBACpB,IAAI+uB,OAAK1E,OAAOvB,oBACZ,OAAOiG,OAAK1E,OAAOvB,mBAAmBruB,KAAKs0B;;eApS3DnwB,OAySIqa,OAAA,SAAK0P;gBAA0E,IAAAqG,UAAA90B;gBAC3E,OAAO4D,qBAAakC,IAAI;oBACpBgvB,QAAKxK,UAAUqB,IAAf;oBAEA,IAAMoJ,aAAaD,QAAK7gB,MAAMpR;oBAE9B,OAAIkyB,cACAD,QAAKnG,MAAMjc,SAAS;wBAAA,OAAMqiB,WAAW1U;wBAC9BuB,oBAAcmT,eAGlBD,QAAK3E,OAAOpR,KAAKxe,KAAKu0B,SAAMrG;mBAEpCxrB,KAAK,SAAA6rB;oBAEJ,OADAgG,QAAKhG,WAAWA,UACTA;;eAxTnBpqB,OA4TImqB,gBAAA,SAAcC,UAAwBC;gBAAmF,IAAAiG,UAAAh1B;gBACrH,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOkvB,QAAK7E,OAAOtB,cAActuB,KAAKy0B,SAAMlG,UAAUC;;eA9TlErqB,OAkUI6b,QAAA;gBAA6B,IAAA0U,UAAAj1B;gBACzB,OAAO4D,qBAAakC,IAAI;oBACpB,IAAImvB,QAAKnG,UACL,OAAOmG,QAAKnG,SAASvO,QAAQtd,KAAK4O;;eArUlDnN,OA0UIwqB,WAAA,SAAS/nB,SAAmC9E;gBAAgC,IAAA6yB,UAAAl1B;gBACxEA,KAAKsqB,UAAUqB,IAAf;gBADwE,KAGxE,IAAM1X,QAAQ,IAH0DiR,MAAA,GAAAiQ,yBAIjDn1B,KAAKsqB,UAAU+C,gBAJkCnI,MAAAiQ,uBAAA5yB,QAAA2iB,OAIlB;oBAAjD,IAAMkQ,WAAQD,uBAAAjQ;oBACXllB,KAAKsqB,UAAUG,kBAAkB2K,UAAUC,kBAC3CphB,MAAMmhB,YAAYp1B,KAAKiU,MAAMmhB;;gBANmC,KAUxE,IAAME,mBAAmBxa,UAAKzY,QAAYgnB,wBAAb,MAAwCrpB,KAAKsqB,UAAU3pB,MAAS;oBACzFwG;oBACA8M;oBACAshB,WAAW;wBACP3e,OAAS5W,KAAK4W;wBACdyJ,OAAS;4BAAA,OAAM6U,QAAK7U;;wBACpB5a,SAAS,SAACvC;4BAAD,OAASgyB,QAAKzvB,QAAQvC;;;mBAGpCD,KAAK,SAAAuyB;oBAAc,IAAXva,OAAWua,MAAXva;oBAEP,OADAia,QAAKvG,MAAMjc,SAASuI,KAAKwS,UAClBxS,KAAKsa;mBAEb7vB,MAAM,SAAAxC;oBACL,MAAM,IAAI0B,MAAJ,iGAA0GoN,eAAe9O;oBAxB3DoC,QAAA,SAAAyQ,KAAA0f;oBA2BnE,IAAM9zB,MAAG8zB,uBAAA1f;oBAEVmf,QAAKvzB,OAAO;wBAAoD,IAAA+zB,UAAA11B,MAAA0jB,aAAAphB;wBAC5D,OAAOgzB,iBAAiBryB,KAAK,SAAAsyB;4BACzB,OAAOA,UAAU5zB,KAAKc,MAAMizB,SAAMpzB;;;mBA/B0ByT,MAAA,GAAA0f,yBA2BtDz1B,KAAKmwB,OAAOjB,UA3B0CnZ,MAAA0f,uBAAAlzB,QAAAwT,OA2BhCzQ,MAAAyQ,KAAA0f;eArWhD/wB,OA+WImuB,eAAA,SAAaxwB,QAAgCwG,QAAiBqI,KAAc/J;gBAExE,IAAI0B,WAAWD,gBAAU/F,SAAS;oBAC9B,IAAMwX,SAASV,qBAAU9W;oBAOzB,OANAwX,OAAOyS,UAAUzS,OAAOyS,WAAW,IACnCzS,OAAOyS,QAAQ5b,OAAOrO,QACtB7C,KAAK2uB,MAAMjc,SAAS;+BACT2H,OAAOyS,QAAQ5b;wBAGnB;wBAAEsL,MN1aX;wBM0a2CtL;;;gBAG7C,OAAI/J,YAAYuiB,QAAQ3hB,QACb;oBAAEyU,MNjbX;oBMobK;oBAAEA,MNlbP;oBMkbuC/P,UAAUD,mBAAmB3J;;eAhY9E6B,OAmYIunB,gBAAA,SAAc6C;gBAA6C,IAAA6G,UAAA31B,MACnDqoB,aAAY;gBAMhB,OAJAroB,KAAK2uB,MAAMjc,SAAS;oBAChB2V,aAAY;oBAGTzkB,qBAAayD,MAAM,KAAMpE,KAAK;oBACjC,OAAO6rB,SAAStO;mBACjBvd,KAAK,SAAAud;oBACJ,OAAIA,YACAmV,QAAKrL,UAAUqB,IAAf,uBACOgK,QAAKtV,WACJgI,iBAAL,IACIsN,QAAK1J,cAAc6C;;eAjZ1CpqB,OAsZIgsB,iBAAA;gBAAiB,IAAAkF,UAAA51B,MACP61B,uBAAuB5gB,iBAAiBpS,QAAQ,UAAUiP,KAAK;oBACjE8jB,QAAKtL,UAAUqB,IAAf,kBACAiK,QAAKnI,QAAQ,IAAI7oB,MAAJ;;gBAGjB5E,KAAK2uB,MAAMjc,SAASmjB,qBAAqB5uB;eA5ZjDvC,OA+ZI2tB,aAAA;gBAAkC,IAAAyD,UAAA91B;gBAC9B,OAAO4D,qBAAakC,IAAI;oBACpB,IAAMC,UAAU+vB,QAAK7hB,MAAMlO;oBAE3B,IAAIA,SACA,OAAO+vB,QAAK1F,YAAYrqB,QAAQA,SAAS,IAAInB,MAAJ,uCAAgDmB,UAAhD;;eApazDrB,OAyaIqxB,YAAA,SAAU1sB;gBAAkD,IAAA2sB,UAAAh2B;gBACxD,OAAO4D,qBAAakC,IAAI;oBACpBkwB,QAAKrH,MAAMlf,IAAI,SAASpG,QACxB2sB,QAAK5F,YAAY3sB;;eA5a7BiB,OAgbIouB,qBAAA,SAAmB5qB;gBAA0C,IAAA+tB,UAAAj2B,MACnDyF,UAAa,SAACvC;oBAAD,OAAS+yB,QAAKxwB,QAAQvC;mBACnCgpB,OAAa,SAAC7iB;oBAAD,OAAW4sB,QAAKF,UAAU1sB;;gBAO7C,OAFA6iB,KAAKzmB,UAAUA,SAER;oBAAEymB;oBAAM7L,OANI;wBAAA,OAAM4V,QAAK5V;;oBAMRmN,YALH;wBAAA,OAAMyI,QAAKzI,WAAWtlB;;oBAKPokB,QAJf,SAAA4J;wBAAA,OAAuBD,QAAK3J,OAAO;4BAAEjV,OAArC6e,OAAG7e;4BAAyCE,QAA5C2e,OAAU3e;;;oBAIa9R;;eAzblDf,OA4bI4nB,SAAA,SAAA6J;gBAAyF,IAAAC,UAAAp2B,MAAhFqX,QAAgF8e,OAAhF9e,OAAOE,SAAyE4e,OAAzE5e;gBACZ,OAAO3T,qBAAakC,IAAI;oBACpBswB,QAAKxf,MAAMka,QAAQhH,MAAMM,QAAQ;wBAAE/S;wBAAOE;;;eA9btD7S,OAkcI8oB,aAAA,SAAWtlB;gBAAwC,IAAAmuB,UAAAr2B;gBAC/C,OAAOkI,IAAIsY,WAAWvd,KAAK,SAAA0H;oBACvB,OAAIA,SACO0rB,QAAKhW,UAGTzc,qBAAayD,MAAM,KACrBpE,KAAK;wBAAA,OAAMiF,IAAIsY;uBACfvd,KAAK,SAAAqzB;wBACF,IAAIA,cACA,OAAOD,QAAKhW;;;eA5cpC3b,OAkdI2b,QAAA;gBAA6B,IAAAkW,UAAAv2B;gBACzB,OAAO4D,qBAAakC,IAAI;oBAEpB,OADAywB,QAAKjM,UAAUqB,IAAf,UACO4K,QAAK3f,MAAMka,QAAQhH,MAAMI;mBAEjCjnB,KAAK;oBAKJ,OAJIszB,QAAKltB,SACLktB,QAAKltB,MAAMgX,MAAMlC,gBAAgBzY,MAAMmM;oBAGpC0kB,QAAK9I,QAAQ,IAAI7oB,MAAJ,mBAA4B;;eA5d5DF,OAgeIutB,YAAA,SAAUuE,mBAAVC;gBAAwI,IAAAC,UAAA12B,MAA3FmH,UAA2FsvB,OAA3FtvB,SAAS+J,MAAkFulB,OAAlFvlB;gBAClD,OAAOtN,qBAAakC,IAAI;oBACpB,IAAM6wB,oBAAoBD,QAAKpM,UAAUqM;oBAEzC,IAAKA,mBAAL;wBAIA,IAAIC,kBAAkBJ,kBAAkBlV;wBAExC,IAAKsV,mBAAoB7tB,aAAa6tB,oBvDrc3C,SAAuB1uB;4BAC1B;gCAEI,KAAKA,IAAIC,SAASuY,MACd,QAAO;gCAGX,IAA0B,kBAAtBxY,IAAIC,SAASuY,MACb,QAAO;8BAEb,OAAOxd;4BAIT,QAAO;yBuDub4D2zB,CAAcD,kBAAzE;4BAMA,IAAMzrB,OAFNyrB,kBAAkBztB,iBAAiBytB,kBAEP5jB,UACtB8B,KAAK4hB,QAAKI,eAAeH,mBAAmB;gCAAExvB;gCAAS+J;gCAAK/F;;4BAElE,IAAK2J,IAAL;gCAIA,IAAIA,GAAG1J,kBAAkBD,KACrB,MAAM,IAAIvG,MAAJ;iCnD9Ff,SAA8BsD,KAA4B4M;oCAE7D,IAAIU,MAAMV,GAAGiiB,QAAQjmB;oCAErB,IAAY,WAAR0E,KACA,MAAM,IAAI5Q,MAAJ,sCAA+C4Q;oCAKzD,KAFA,IAAInK,kBAAkBnD,IAAI8K,SAAS3H,iBAE5BA,gBAAgB2rB,YAAY3rB,gBAAgB2rB,SAASz0B,UACxD8I,gBAAgB0L,YAAY1L,gBAAgB2rB,SAAS;oCAGzD,MAAOliB,GAAGkiB,SAASz0B,UACf8I,gBAAgB8I,YAAYW,GAAGkiB,SAAS;iCmDkFpCC,CAAqBL,iBAAiB9hB;gCA1BZ,IAAAoiB,SA4BgCR,QAAKpM,UAAUgB,cAAc,IA5B7D6L,eAAAD,OA4BpB7f,oBA5BoB,MAAA8f,8BAAAC,gBAAAF,OA4BL3f,sBA5BK,MAAA6f,gCAAAC,iBAAAH,OA4BW5iB,wBA5BX,MAAA+iB,iBA4BqB,SA5BrBA;iCA6B1B/iB,UAAUI,eAAeJ,SAASnJ,UAElBkM,SAASE,WACrBN,SAAS3C,SAAS,SAAAgjB;oCACdZ,QAAKpK,OAAO;wCACRjV,OAAQA,QAF8CigB,OAAzCjgB,aAEc1R;wCAC3B4R,QAAQA,SAH8C+f,OAAxB/f,cAGD5R;;mCAElC;oCAAE0R;oCAAOE;oCAAQrP,KAAK0uB;;;;;;eAtgBzClyB,OA2gBIoyB,iBAAA,SAAeS,UAAfC;gBAA6S,IAAAC,UAAAz3B;gBAEzS,OAAOu3B,SAASh3B,KAAKP,MAAM;oBACvBoU,WAHqSojB,OAA3NpjB;oBAI1EjN,SAJqSqwB,OAAzOrwB;oBAK5D+J,KALqSsmB,OAAhOtmB;oBAMrE/F,KANqSqsB,OAAhNrsB;oBAOrFxB,OAPqS6tB,OAA3M7tB;oBAQ1FqlB,gBARqSwI,OAApMxI;oBASjGzO,OAAY;wBAAA,OAAMkX,QAAKlX;;oBACvBF,OAAY;wBAAA,OAAMoX,QAAKpX;;oBACvBiQ,OAAYtwB,KAAKswB;oBACjBrc,OAAYjU,KAAKiU;oBACjBuB,KAAYxV,KAAKsqB,UAAU9U;oBAC3B4Z,YAAYpvB,KAAKsqB,UAAU8E;oBAC3BxY,OAAY5W,KAAK4W;;eA1hB7BlS,OA8hBIotB,kBAAA,SAAgB4F,gBAAhBC;gBAAmT,IAAAC,UAAA53B,MAAtPyuB,aAAsPkJ,OAAtPlJ,YAAYM,sBAA0O4I,OAA1O5I,qBAAqB5nB,UAAqNwwB,OAArNxwB,SAAS+J,MAA4MymB,OAA5MzmB;gBACnG,OAAOtN,qBAAayC,IAAI,EACpBqxB,eAAez2B,MAAMgC,KAAK4R,eAE1B4Z,aAAaA,WAAWxtB,QAAQ,MAEhC8tB,sBAAsBA,oBAAoB9tB,QAAQ,QACnDgC,KAAK,SAAA40B;oBAA0C,IAAvCzjB,YAAuCyjB,OAAA,IACxCC,iBAAiBF,QAAKd,eAAec,QAAKtN,UAAUyN,mBAAmB;wBAAE5wB;wBAAS+J;wBAAKkD;wBAAWzK,OAD1DkuB,OAAA;wBACiE7I,gBADjE6I,OAAA;wBACiF1sB,KAAK6H;;oBACpI,IAAI8kB,gBAGA,OAFA3jB,YAAYC,WAAW0jB,iBACvBF,QAAKjJ,MAAMjc,SAAS;wBAAA,OAAMoE,eAAeghB;wBAClCpP,eAAeoP;;eA1iBtCpzB,OA+iBI+oB,UAAA,SAAQvqB,KAAc4tB;gBAAgD,IAAAkH,UAAAh4B;gBAClE,YADkE,MAAhD8wB,uBAAqB,IAChCltB,qBAAakC,IAAI;oBAMpB,OALK5C,QACD4tB,WAAU,GACV5tB,MAAM,IAAI0B,MAAM,yBAEpBozB,QAAK1N,UAAUqB,IAAf;oBACOqM,QAAKvyB,QAAQvC,KAAK4tB;mBAC1B7tB,KAAK;oBACJ,OAAO+0B,QAAKrJ,MAAMtoB;;eAxjB9B3B,OA4jBIe,UAAA,SAAQvC,KAAa4tB;gBAAgD,IAAAmH,UAAAj4B;gBACjE,YADiE,MAAhD8wB,uBAAqB,IAC/BltB,qBAAakC,IAAI;oBACpB,KAAyC,MAArCmyB,QAAK5H,cAAcrrB,QAAQ9B,MAO/B,OAHA+0B,QAAK5H,cAAcprB,KAAK/B;oBACxB+0B,QAAK7H,YAAYhrB,YAAYlC,MAEzB4tB,UACOmH,QAAKrhB,MAAMka,QAAQhH,MAAMrO,OAAOvY,YAD3C;;eArkBZwB,OA2kBIikB,aAAA,SAAWmG,UAAwBjmB,QAAiB1B;gBAA2E,IAAA+wB,UAAAl4B;gBAEvH,OAAO4D,qBAAakC,IAAI;oBACpB,OAAOgpB,SAASvN;mBAEjBte,KAAK,SAAAiF;oBACJ,IAAKgX,cAAWA,WAAO3B,YAAY;wBAAErV;wBAAKW;2BAAaqW,WAAO+J,UAAUpgB,QAAQA,SAAhF;wBAIA,IAAMsvB,YAAYD,QAAK5N,UAAU8N;wBAEjC,KAAKD,WACD,MAAM,IAAIvzB,MAAJ,6BAAsCuC;wBAGhD,IAAMkxB,eAAevqB,iBAAiBqqB;wBAEtC,OADAjZ,WAAO8J,QAAQ9gB,KAAKW,SACbqW,WAAOyJ,WAAWja,iBAAiBypB,YAAYE;;;eA7lBtEnI;SAAA,IC9CaoI,6BAAb;YAiBI,SAAAA,kBAAYhO,WAA0B9nB,QAAgC+S;gBAA+B,IAAAzR,QAAA9D;gBAAAA,KAfrGsqB,iBAeqG,GAAAtqB,KAdrGwC,cAcqG,GAAAxC,KAbrGmH,eAaqG,GAAAnH,KAZrGmwB,cAYqG;gBAAAnwB,KAXrGiU,aAWqG,GAAAjU,KAVrG2uB,aAUqG,GAAA3uB,KARrGugB,aAQqG,GAAAvgB,KAPrGssB,cAOqG;gBAAAtsB,KANrG82B,sBAMqG,GAAA92B,KAJrGqgB,aAIqG,GAAArgB,KAHrGyF,eAGqG,GAAAzF,KAFrG4W,aAEqG;gBACjG5W,KAAKsqB,YAAYA,WACjBtqB,KAAKmH,UAAUoO,QAAQpO,SACvBnH,KAAKmwB,SAASlC,eAAe1Y,QAAQpO;gBACrCnH,KAAK2uB,QAAQpc,QAAQvS,OAErBA,KAAKugB,QAAQ2P,uBAAgBvrB,UAAU4b;gBACvCvgB,KAAKssB,SAAS4D,uBAAgBvrB,UAAU2nB,QACxCtsB,KAAK82B,iBAAiB5G,uBAAgBvrB,UAAUmyB;gBAGhD92B,KAAKiU,QAAQ;gBAXoF,SAAAN,MAAA,GAAAqC,gBAY1ElV,OAAO8F,KAAK2O,QAAQtB,QAZsDN,MAAAqC,cAAAzT,QAAAoR,OAY9C;oBAA9C,IAAMyhB,WAAQpf,cAAArC,MACTwf,UAAUnzB,KAAKsqB,UAAUG,kBAAkB2K;oBAC7CjC,WAAWA,QAAQkC,iBAAiB9f,QAAQtB,MAAMmhB,cAElDp1B,KAAKiU,MAAMmhB,YAAY7f,QAAQtB,MAAMmhB;;gBAI7Cp1B,KAAKqgB,QAAU9K,QAAQggB,UAAUlV,OACjCrgB,KAAKyF,UAAU8P,QAAQggB,UAAU9vB;gBACjCzF,KAAK4W,QAAUrB,QAAQggB,UAAU3e,OAEjC5W,KAAKsqB,UAAUkG,wBAAwBxwB;gBACvCA,KAAK2uB,MAAMjc,SAAS;oBAAA,OAAM5O,MAAKwmB,UAAUmG,uBAAuB3sB;oBAEhE9D,KAAKu4B,oBAAoB/1B;;YA5CjC,IAAAkC,SAAA4zB,kBAAA3zB;YAAA,OAAAD,OA+CI8zB,cAAA;gBAAmC,IAAA1zB,SAAA9E;gBAC/B,OAAO;oBACHu1B,WAAWv1B,KAAKy4B;oBAChBhL,SAAW;wBAAA,OAAM3oB,OAAK2oB;;;eAlDlC/oB,OAsDI6zB,sBAAA,SAAoB/1B;gBAAgC,IAAA6C,SAAArF,MAC1C04B,4BAA4BvqB,cAAc3L,QAAQ;oBAAA,OAAM6C,OAAKooB;mBAAW;gBAC9EztB,KAAK2uB,MAAMjc,SAASgmB,0BAA0BzxB;eAxDtDvC,OA2DI+zB,eAAA;gBAAsC,KAClC,IAAMlD,YAAY,IACZx1B,OAAOC,MAFqBsF,QAAA,SAAA4f,KAAAuQ;oBAI7B,IAAM9zB,MAAG8zB,uBAAAvQ;oBACVqQ,UAAU5zB,OAAO;wBAEb,OAAOuuB,uBAAgBvrB,UAAUhD,KAAKc,MAAM1C,MAAMuC;uBAEtDizB,UAAU5zB,KAAK+gB,WAAW/gB;mBATIujB,MAAA,GAAAuQ,yBAIhBz1B,KAAKmwB,OAAOjB,UAJIhK,MAAAuQ,uBAAAlzB,QAAA2iB,OAIM5f,MAAA4f,KAAAuQ;gBAQxC,OAAOF;eAvEf7wB,OA0EI+oB,UAAA;gBACI,OAAOztB,KAAK2uB,MAAMtoB;eA3E1BiyB;SAAA,ICxBMK,QAAQ;YACVC,SAAW;YACXC,WAAW;;QAGR,SAASC,yBAATlc;YAA8J,IAAvH1L,MAAuH0L,KAAvH1L,KAAKvH,QAAkHiT,KAAlHjT,OAAOqlB,iBAA2GpS,KAA3GoS,gBAAgB7jB,MAA2FyR,KAA3FzR,KAAK8I,QAAsF2I,KAAtF3I,OAAO2C,QAA+EgG,KAA/EhG,OAA+EmiB,kBAAAnc,KAAxEwS,YAAe/X,QAAyD0hB,gBAAzD1hB,OAAOE,SAAkDwhB,gBAAlDxhB;YAE3G,IAAK5N,SAAUqlB,gBAAf;gBAIA,IAAMgK,MAAM7tB,IAAIuK,cAAc;gBAC9BsjB,IAAInjB,aAAa,MAAM3E;gBACvB,IAAMuD,QAAQtJ,IAAIuK,cAAc;gBA6DhC,OA5DIzB,MAAMglB,YACNxkB,MAAMoB,aAAa,SAAS5B,MAAMglB,WAGtCxkB,MAAMN,YAAYhJ,IAAIgL,eAAJ,oBACVjF,MADU,6GAIAmG,QAJA,gCAKCE,SALD,sCAQVrG,MARU,mSAkBVA,MAlBU,eAkBQynB,MAAME,YAlBd,oEAsBV3nB,MAtBU,eAsBQynB,MAAMC,UAtBd;gBA2BlBI,IAAI7kB,YAAYxK,QAChBqvB,IAAI7kB,YAAY6a,iBAChBgK,IAAI7kB,YAAYM;gBAEhBua,eAAekK,UAAUC,IAAIR,MAAMC,UACnCjvB,MAAMuvB,UAAUC,IAAIR,MAAME;gBAE1BjiB,MAAMiI,GAAGiL,MAAME,UAAU;oBACrBgF,eAAekK,UAAUE,OAAOT,MAAMC,UACtC5J,eAAekK,UAAUC,IAAIR,MAAME;oBAEnClvB,MAAMuvB,UAAUE,OAAOT,MAAME,YAC7BlvB,MAAMuvB,UAAUC,IAAIR,MAAMC,UAE1B7zB,WAAW;wBACP+R,eAAekY;uBAChB;oBAGPpY,MAAMiI,GAAGiL,MAAMM,QAAQ,SAAAjT;oBAA4C,IAAlCY,WAAkCZ,MAAzCE,OAAyBW,YAAgBb,MAAxBI;oBACf,mBAAbQ,aACPihB,IAAIvkB,MAAM4C,QAAQyB,MAAMf,YAGH,mBAAdC,cACPghB,IAAIvkB,MAAM8C,SAASuB,MAAMd;oBAI1BghB;;;QC7ER,SAASK,yBAATzc;YAA2F,IAApDzR,MAAoDyR,KAApDzR,KAAK8I,QAA+C2I,KAA/C3I,OAErCmC,OAAOjL,IAAIuK,cAAc,SACzBzC,OAAO9H,IAAIuK,cAAc,SACzBjB,QAAQtJ,IAAIuK,cAAc,UAC1B4jB,UAAUnuB,IAAIuK,cAAc;YAyClC,OAxCA4jB,QAAQJ,UAAUC,IAAI,YAElBllB,MAAMglB,YACNxkB,MAAMoB,aAAa,SAAS5B,MAAMglB;YAGtC7iB,KAAKjC,YAAYlB,OACjBA,KAAKkB,YAAYmlB,UACjBrmB,KAAKkB,YAAYM,QACjBA,MAAMN,YAAYhJ,IAAIgL,eAAJ;YA+BXC;;QCiDf,IAAMmjB,oBAAc;YAAA,OAAM1nB;WACpB2nB,qBAAe,SAAA5c;YAAA,OAAe9K,KAAf8K,KAAGvb;WChBXo4B,sBAAb;YAqCI,SAAAA,UAAYlkB;gBAAmCvV,KAnC/CwV,WAmC+C,GAAAxV,KAlC/CW,YAkC+C,GAAAX,KAhC/C+N,WAgC+C,GAAA/N,KA/B/C6I,cA+B+C;gBAAA7I,KA9B/Cm4B,iBA8B+C,GAAAn4B,KA5B/CiU,aA4B+C,GAAAjU,KA3B/C0zB,oBA2B+C,GAAA1zB,KAzB/CovB,kBAyB+C;gBAAApvB,KAxB/CsrB,kBAwB+C,GAAAtrB,KAtB/CysB,4BAsB+C,GAAAzsB,KApB/C05B,sBAoB+C;gBAAA15B,KAlB/C8V,kBAkB+C,GAAA9V,KAb/C+3B,yBAa+C,GAAA/3B,KAZ/C22B,yBAY+C;gBAAA32B,KAV/C+yB,gBAU+C,GAAA/yB,KAR/C25B,mBAQ+C,GAAA35B,KAN/C45B,cAM+C,GAAA55B,KAJ/C65B,cAI+C;gBAAA75B,KAF/CizB,iBAE+C,GC5E5C,SAAqB1d;oBAExB,KAAKA,SACD,MAAM,IAAI3Q,MAAJ;oBAIV,KAAK2Q,QAAQC,QAAQD,QAAQC,IAAI/H,MAAM,6BACnC,MAAM,IAAI7I,MAAJ,0BAAmC2Q,QAAQC;oBAKrD,IAnDJ,SAAoCD;wBAEhC,IAAIA,QAAQtB,SAAoC,mBAAlBsB,QAAQtB,OAClC,MAAM,IAAIrP,MAAJ;wBAGV,IAAMk1B,iB1DoWH,SAAmBrrB;4BACtB,IAAInK,SAAS;4BACb,KAAK,IAAI3C,OAAO8M,KACRA,IAAIzM,eAAeL,QACnB2C,OAAOW,KAAKwJ,IAAI9M;4BAGxB,OAAO2C;yB0D3WgB4K,CAAOoa;wBAE9B,IAAI/T,QAAQtB,OAAO,SAAAN,MAAA,GAAAqC,gBACGlV,OAAO8F,KAAK2O,QAAQtB,QADvBN,MAAAqC,cAAAzT,QAAAoR,OAC+B;4BAAzC,IAAMhS,MAAGqU,cAAArC,MAGJ6W,OAAOjV,QAAQtB,MAAMtS;4BAE3B,KAAK6oB,QAA0B,mBAATA,MAClB,MAAM,IAAI5lB,MAAJ,4BAAqCjD,MAArC;4BAGV,KAAK6oB,KAAKhO,MACN,MAAM,IAAI5X,MAAJ;4BAGV,KAA2C,MAAvCk1B,eAAe90B,QAAQwlB,KAAKhO,OAC5B,MAAM,IAAI5X,MAAJ,qCAA8Ck1B,eAAe5rB,KAAK;4BAG5E,IAAIsc,KAAK+I,YAAY/I,KAAK4I,SACtB,MAAM,IAAIxuB,MAAJ;4BAGV,IAAI4lB,KAAKhO,SAAS8M,UAAU9N,YAAYgP,KAAK2D,eAAe3D,KAAK6D,YAC7D,MAAM,IAAIzpB,MAAJ;;qBAkBlBm1B,CAAwBxkB,UAEpBA,QAAQ6Z,YAAY;wBACpB,IAAI7Z,QAAQ6Z,eAAe1W,KAAKnD,QAAQ6Z,WAAW/X,WAAWmB,OAAOjD,QAAQ6Z,WAAW/X,QACpF,MAAM,IAAIzS,MAAJ;wBAGV,IAAI2Q,QAAQ6Z,eAAe1W,KAAKnD,QAAQ6Z,WAAW7X,YAAYiB,OAAOjD,QAAQ6Z,WAAW7X,SACrF,MAAM,IAAI3S,MAAJ;;oBAId,IAAI2Q,QAAQmkB,kBACJnkB,QAAQmkB,mBAAmBhQ,QAAQ5hB,UAAUyN,QAAQmkB,mBAAmBhQ,QAAQ3hB,OAChF,MAAM,IAAInD,MAAJ,gCAAwC2Q,QAAQmkB,kBAAkB;oBAIhF,KAAKnkB,QAAQxH,KACT,MAAM,IAAInJ,MAAJ;oBAGV,IAA2B,mBAAhB2Q,QAAQxH,OAA2C,qBAAhBwH,QAAQxH,KAClD,MAAM,IAAI3H,UAAJ;oBAGV,IAAImP,QAAQohB,qBAA0D,qBAA9BphB,QAAQohB,mBAC5C,MAAM,IAAI/xB,MAAJ;oBAGV,IAAK2Q,QAAQwiB,qBAA8F,qBAA9BxiB,QAAQwiB,mBACjF,MAAM,IAAInzB,MAAJ;iBDmCNmuB,CAASxd,UAKTvV,KAAKwV,MAAMD,QAAQC,KACnBxV,KAAKW,OAAOX,KAAKwV,IAAI9E,QAAQ,MAAM,MAEnC1Q,KAAKysB,uBAAuBlX,QAAQkX,wBAAwB7kB;gBAE5D,IAAMyS,SAASV;gBAGf,IAFAU,OAAO2f,aAAa3f,OAAO2f,cAAc,IAErC3f,OAAO2f,WAAWh6B,KAAKwV,MACvB,MAAM,IAAI5Q,MAAJ,6DAAsE5E,KAAKwV;gBAMrFxV,KAAK0zB,eDvCF;oBACH7wB,QAAQ;wBACJ2Z,MAAe;wBACfkY,cAAe;wBACfnB,WAAe;wBACf8B,gBAAe;wBACftC,UALI,SAAA5b;4BAKkE,IAA3D9V,QAA2D8V,MAA3D9V;4BACP,KAAKmN,SAASnN,WAAWwf,mBAAYG,cAAc3f,QAC/C,MAAM,IAAIuD,MAAJ;;wBAGd0uB,UAVI,SAAAzY;4BAWA,OAAO+G,oBADyE/G,MAAzExZ;;;oBAKf0E,SAAS;wBACLyW,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;;oBAGjBrU,OAAO;wBACH7D,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA1P;4BAAA,OAAAA,MAAGqF;;;oBAGtBE,OAAO;wBACH/D,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAvP;4BAAA,OAAAA,MAAGoF;;;oBAGtB+L,QAAQ;wBACJ9P,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAtP;4BAAA,OAAAA,MAAGkR;;;oBAGtB2M,UAAU;wBACNzc,MAAU;wBACV+W,WAAU;;oBAGdlrB,WAAW;wBACPmU,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAAiI;4BAAA,OAAAA,MAAGtqB;;;oBAGtBmkB,iBAAiB;wBACbhQ,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA5G;4BAAA,OAAAA,MAAG0I;;;oBAGtB6E,WAAW;wBACP7U,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfW,gBAAe;wBACfjC,SAAemG;wBACfjG,UAAekG;;oBAGnBlI,YAAY;wBACR9U,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;wBACbtB,SAAamG;wBACbjG,UAAakG;;oBAGjBpI,UAAU;wBACN5U,MAAa;wBACb+W,WAAa;wBACbmB,cAAa;wBACbtB,SAAamG;wBACbjG,UAAakG;;oBAGjBjI,SAAS;wBACL/U,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfW,gBAAe;wBACfjC,SAAemG;wBACfjG,UAAekG;;oBAGnB/zB,SAAS;wBACL+W,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACfhK,eAAe,SAAA8K;4BAAA,OAAAA,MAAG/vB;;;oBAGtB8mB,SAAS;wBACL/P,MAAe;wBACf+W,WAAe;wBACfmB,cAAe;wBACftB,SAAemG;wBACf7O,eAAe,SAAAwL;4BAAA,OAAAA,OAAG3J;;;mBCpEtBvsB,KAAKiU,QAAQsB,QAAQtB,SAAS;gBAtBa,IAAA2I,OA0BsCrH,QAAQ6Z,cAAc,IA1B5D6K,aAAArd,KA0BnCvF,OA1BmC6iB,cAAAtd,KA0BDrF;gBAC1CvX,KAAKovB,aAAa;oBAAE/X,YA3BuB,MAAA4iB,aA0B3BtQ,mBAAmBC,QA1BQqQ;oBA2BhB1iB,aA3BgB,MAAA2iB,cA0BQvQ,mBAAmBE,SA1B3BqQ;mBA6B3Cl6B,KAAK+N,MAAMwH,QAAQxH,KACnB/N,KAAK6I,SAAS0M,QAAQ1M,QACtB7I,KAAKm4B,YAAY5iB,QAAQ4iB;gBAEzBn4B,KAAK8V,aAAaP,QAAQO,cAAc,IACxC9V,KAAK8V,WAAWR,SAAStV,KAAK8V,WAAWR,UAAU;gBACnDtV,KAAK8V,WAAWma,QAAQjwB,KAAK8V,WAAWma,SAAS,IAEjDjwB,KAAK05B,iBAAiBnkB,QAAQmkB,kBAAkBhQ,QAAQ5hB;gBAExD9H,KAAKsrB,aAAa/V,QAAQ+V,YAGtBtrB,KAAK+3B,oBADLxiB,QAAQwiB,oBACiBxiB,QAAQwiB,oBAERe;gBAIzB94B,KAAK22B,oBADLphB,QAAQohB,oBACiBphB,QAAQohB,oBAER0C;gBAG7Br5B,KAAK+yB,WAAWxd,QAAQwd,UAExB/yB,KAAK65B,SAAStkB,QAAQskB,UAAU;oBAC5BM,OAAOtoB;oBACPuoB,MAAOvoB;oBACPwoB,MAAOxoB;oBACP3N,OAAO2N;mBAGX7R,KAAKs6B,iBACLt6B,KAAKu6B,kBAELlgB,OAAO2f,WAAWh6B,KAAKwV,OAAOxV;;YAtGtC,IAAA0E,SAAA+0B,UAAA90B;YAAA,OAAAD,OAyGI2oB,eAAA;gBACI,IAAIrtB,KAAKizB,WACL,OAAOjzB,KAAKizB;gBAFoB,KAKpC,IAAMA,YAAYnyB,OAAO8F,KAAK5G,KAAKiU,QALCN,MAAA,GAAAqC,gBAMlBlV,OAAO8F,KAAK5G,KAAK0zB,eANC/f,MAAAqC,cAAAzT,QAAAoR,OAMc;oBAA7C,IAAMhS,MAAGqU,cAAArC;qBACsB,MAA5Bsf,UAAUjuB,QAAQrD,QAClBsxB,UAAUhuB,KAAKtD;;gBAKvB,OADA3B,KAAKizB,YAAYA,WACVA;eAtHfvuB,OA0HI+lB,oBAAA,SAAkB9pB;gBAEd,OAAOX,KAAKiU,MAAMtT,SAASX,KAAK0zB,aAAa/yB;eA5HrD+D,OA+HIyrB,SAAA,SAAOxvB,MAAe65B;gBAgBd,MAAM,IAAI51B,MAAJ;eA/IlBF,OAmJI41B,gBAAA;gBACI,IAAIt6B,KAAKy6B,WAAW;oBAChB,IAAI53B,OAAO+2B,QACP,MAAM,IAAIh1B,MAAJ,sBAA+B5E,KAAKW,OAApC;oBAGV,IAAM0I,QAAQ,IAAI6hB,qBAAelrB;oBACjC6C,OAAO+2B,SAAS55B,KAAK45B,SAASvwB,MAAM0jB;;eA1JhDroB,OA8JI61B,iBAAA;gBAAiB,IAAAz2B,QAAA9D;gBACb6e,MAAOwK,8BAAL,MAAsCrpB,KAAKW,MAAS;oBAClD,QAAO;oBAGXke,MAAOwK,wBAAL,MAAgCrpB,KAAKW,MAAS,SAAAwW;oBAAqD,IAAAujB,aAAAvjB,MAA1C8D;oBAEvD,OADiB,IAAIqd,2BAAkBx0B,OAD0DqT,MAAlD3U,QACM;wBAAE2E,SAD0CuzB,WAAlCvzB;wBACC8M,OADiCymB,WAAzBzmB;wBACDshB,WAD0BmF,WAAlBnF;uBAE/DiD;;eArK5B9zB,OAyKIi2B,cAAA,SAAYzyB;gBACR,OAAO4S,UAAK5S,KAASmhB,8BAAV,MAA2CrpB,KAAKW,MAASsC,KAAK,SAAA4X;oBACrE,OADmFA,MAAXI;mBAEzEvV,MAAM;oBACL,QAAO;;eA7KnBhB,OAiLI+vB,SAAA,SAAOxgB;gBACH,OAAwB,qBAAbjU,KAAK+N,MACL/N,KAAK+N,IAAI;oBAAEkG;qBAGfjU,KAAK+N;eAtLpBrJ,OAyLIgtB,mBAAA,SAAiBzd;gBACb,OAAIjU,KAAK6I,UAAiC,mBAAhB7I,KAAK6I,SACpB7I,KAAK6I,SAGTiF,iBAAiB9N,KAAKy0B,OAAOxgB;eA9L5CvP,OAiMIkE,YAAA,SAAUqL;gBACN,OAAI1M,aAAQvH,KAAK6I,UAEN7I,KAAK6I,SAGT7I,KAAK0xB,iBAAiBzd;eAvMrCvP,OA0MI0zB,eAAA;gBACI,IAAIp4B,KAAKm4B,WACL,OAAOn4B,KAAKm4B;eA5MxBzzB,OAgNI+1B,UAAA;gBACI,IAAMG,UAAU3P;gBAChB,OAAOzd,QAAQotB,WAAWA,QAAQplB,QAAQxV,KAAKwV;eAlNvD9Q,OAqNIm2B,sBAAA,SAAgD1zB,SAAmCiN;gBAC/E,IAAIA,WAAW;oBACX,IAAyB,mBAAdA,cAA2BC,UAAUD,YAC5C,MAAM,IAAIhO,UAAJ;oBAGV,OAAOgO;;gBAGX,IAAIjN,YAAYuiB,QAAQ3hB,OAEpB,OAAO;gBAGX,MAAM,IAAInD,MAAJ;eAnOdF,OAsOIo2B,oBAAA,SAAkB3zB,SAAoC8M;gBAClD,IAAIA,MAAMpR,QACN,OAAO+e,oBAAc3N,MAAMpR,QAAQse;gBAGvC,IAAIha,SAAS;oBACT,IAAIA,YAAYuiB,QAAQ5hB,UAAUX,YAAYuiB,QAAQ3hB,OAClD,MAAM,IAAInD,MAAJ,2BAAoCuC;oBAG9C,OAAOA;;gBAGX,OAAOnH,KAAK05B;eAnPpBh1B,OAsPIwnB,OAAA,SAAKjY;gBAAsD,IAAAnP,SAAA9E,MAKjDsI,SAAS,IAAI4nB,uBAAgBlwB,MAFnCiU,QAAQA,SAAS,KAIXud,UAAS,SAACnvB,QAAQ+R,WAAWjN;oBAApB,OAAgCvD,qBAAakC,IAAI;wBAC5D,KAAK0I,SAASnM,SACV,MAAM,IAAIuC,MAAJ;wBAKV,OAFAuC,UAAUrC,OAAKg2B,kBAAkB3zB,SAAS8M,QAC1CG,YAAYtP,OAAK+1B,oBAAoB1zB,SAASiN;wBACvC9L,OAAOkpB,OAAOnvB,QAAQ+R,WAAWjN;;;gBAG5C,OAAAhF,SAAA,IACOmG,OAAO+jB,cADd;oBAEImF,QAAU,SAACpd,WAAWjN;wBAAZ,OAAwBqqB,QAAO3uB,QAAQuR,WAAWjN;;oBAC5D4zB,UAAU,SAAC14B,QAAQ+R,WAAWjN;wBAApB,OAAgCqqB,QAAOnvB,QAAQ+R,WAAWjN;;;eA1QhFzC,OA8QIitB,mBAAA,SAAiBtvB,QAAgCwG,QAA0BuL;gBACvE,IAAI/R,WAAWQ,QAAf;oBAIA,KAAK6J,gBAAgB7J,QAAQR,SACzB,MAAM,IAAIuC,MAAJ;oBAGV,IAAMyI,SAASzE;oBAEf,KAAKuE,YAAYtE,QAAQwE,YAAYtE,aAAa1G,SAC9C,MAAM,IAAIuC,MAAJ,gCAAyCiE,OAAO7F,aAAhD,2BAAqFqK;oBAG/F,IAAI+G,aAAkC,mBAAdA,WACpB,MAAM,IAAIxP,MAAJ,wEAAiFwP,YAAjF;;eA9RlB1P,OAkSIinB,MAAA,SAAI/U,OAAgBgkB;gBAChB56B,KAAK65B,OAAOO,KAASp6B,KAAKW,OAA1B,MAAoCiW,OAAUgkB;eAnStDl2B,OAsSI8rB,0BAAA,SAA2BwK;gBACvB,IAAM3gB,SAASV;gBACfU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IACrD5gB,OAAO4gB,iBAAiBh2B,KAAK+1B;eAzSrCt2B,OA4SI+rB,yBAAA,SAA0BuK;gBACtB,IAAM3gB,SAASV;gBACfU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IACrD5gB,OAAO4gB,iBAAiB/zB,OAAOmT,OAAO4gB,iBAAiBj2B,QAAQg2B,WAAW;eA/SlFvB;SAAA;QAuTO,SAAS/3B,OAAU6T;YfrXnB,IJsEAsF,OAAqCgE,IAAI/D,MACtCT;YItEDV,mBAAYuhB,gBACbvhB,mBAAYuhB,eAAc,GJoEUrc,MAArChE,QIlE2B;gBAAEgE;gBAAI/D;eJkEI+D,IAAI/D,OAA2CD,MAA3CC,OACtCT,SAASV,oBACRmF,iBAAiBzE,OAAOyE,kBAAmB,SAAAlU;gBAAO,OAAIkU,uBAAelU,SAAS;oBAAEiU;oBAAI/D;;eA4CxF,SAAAK;gBAA6F,IAAhE0D,KAAgE1D,MAAhE0D,IAAI/D,OAA4DK,MAA5DL;gBAC7BjB,cAAc3J,SAAS,uBAAuB;oBAEjD,OAAO+E,iBAAiBpS,QAAQ,WAAW,SAAA+T;yBApC5C,SAAyBA,OAAzBoE;4BAAiG,IAA/C6D,KAA+C7D,MAA/C6D,IAAI/D,OAA2CE,MAA3CF,MAQnDtY,SAASoU,MAAMpU,UAAUoU,MAAMukB,eACjC9tB,SAASuJ,MAAMvJ,UAAWuJ,MAAMwkB,iBAAiBxkB,MAAMwkB,cAAc/tB,QACnE4N,OAAOrE,MAAMqE;4BAMnB,IAJe,WAAX5N,WACAA,SAAa7F,SAASE,OAAhB,OAGLlF,QAAL;gCAIA,KAAK6K,QACD,MAAM,IAAIzI,MAAJ;gCASVka,uBAAe;oCAAEtc;oCAAQ6K;oCAAQ4N;mCAAQ;oCAAE4D;oCAAI/D;;;yBAQvCugB,CAAgBzkB,OAAO;4BAAEiI;4BAAI/D;;;;aIpHjCwgB,CAAkB;gBAAEzc;gBAAI/D;gBAGpB6D,YAAY;gBAAEE;gBAAI/D;gBAAMgE;gBnCS7B,SAAA6T;gBAAqF,IAAhE9T,KAAgE8T,MAAhE9T,IAAI/D,OAA4D6X,MAA5D7X;gBACrBjB,YAAY,oBAAoB3J,SAAS,iBAAiB;oBAC7D,IAAMsV,WAA4B3G,GAtB5B3F,aAAaE,OAAO;wBAAEvQ,QAAQjB;uBAAY,SAAAuP;wBAAwB,IAArB3U,SAAqB2U,MAArB3U,QAAQ6K,SAAa8J,MAAb9J;wBAE3D,OADAsN,gBAAgBnY,QAAQiB,QAAQ;4BAAEyE,KAAK1F;4BAAQqG,QAAQwE;4BAChD;4BAAE0N,YAAYL;;wBAsBfpS,SAAS2D;oBAKf,OAJI3D,UACAsS,SAAStS,QAAQ;wBAAEwS;uBAAQpV,MAAMmM,gBAG9B2T;;amCfP+V,CAAU;gBAAE1c;gBAAI/D;;Ye6WpB,IAAMwP,YAA2B,IAAImP,oBAAUlkB,UAEzC2W,OAAO,SAACjY;gBAAD,OAAWqW,UAAU4B,KAAKjY;;YAOvC,OANAiY,KAAKiE,SAAS,SAACxvB,MAAM65B;gBAAP,OAAelQ,UAAU6F,OAAOxvB,MAAM65B;eACpDtO,KAAKuO,UAAU;gBAAA,OAAMnQ,UAAUmQ;eAC/BvO,KAAKyO,cAAc,SAACzyB;gBAAD,OAASoiB,UAAUqQ,YAAYzyB;eAClDgkB,KAAK0N,SAAStP,UAAUsP,QAGjB1N;;QAGJ,SAASsP;YACRtc,cACAA,WAAOgK;YAGX,IAAM1iB,UAAU,IAEV6T,SAASV;YAEf,KADAU,OAAO4gB,mBAAmB5gB,OAAO4gB,oBAAoB,IAC9C5gB,OAAO4gB,iBAAiB14B,UAC3BiE,QAAQvB,KAAKoV,OAAO4gB,iBAAiB,GAAGxN,QAAQ,IAAI7oB,MAAJ,uBAAgC;YAGpF,OAAOhB,qBAAayC,IAAIG,SAASvD,KAAK4O;;QAGnC,IAAM4pB,oBAAoBD;QAE1B,SAAS/N;YfvYT,IJgHGjI;YmBwRNgW,qBb5ZO34B,OAAM,iBRgCV;gBAAmC,KACtC,IAAM64B,oBAAoB7hB,YAAY,sBADAlG,MAAA,GAAAgoB,yBAEnBD,kBAAkB90B,QAFC+M,MAAAgoB,uBAAAp5B,QAAAoR,OAEO;oBAAxC,IAAMhN,OAAIg1B,uBAAAhoB,MACL6R,WAAWkW,kBAAkBz6B,IAAI0F;oBACnC6e,aACAA,SAAS6C,aAAY,IAEzBqT,kBAAkBxhB,IAAIvT;;aMlB1Bi1B,KJ+GMpW,WAAW3L,cAAc5Y,IAAI,2BAE/BukB,SAASve;mBhCzINpE,OAAM;;QqDbjB3C,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAA9mB;YAAA7U,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAn6B;YAAAxB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAC;YAAA57B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAJ;YAAAv7B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAL;YAAAt7B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAE;YAAA77B,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAvS;YAAAppB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAtS;YAAArpB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAAnS;YAAAxpB,oBAAAQ,EAAAm7B,qBAAA;YAAA,OAAA/R","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/zoid.min.js.map b/dist/zoid.min.js.map index 21fa60c9..1438e56b 100644 --- a/dist/zoid.min.js.map +++ b/dist/zoid.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport {\n isSameDomain,\n matchDomain,\n getDomain,\n getOpener,\n getNthParentFromTop,\n getAncestor,\n getAllFramesInWindow,\n type CrossDomainWindowType,\n onCloseWindow,\n} from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport {\n extend,\n waitForDocumentBody,\n onResize,\n getElementSafe,\n assertExists,\n} from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps: (props: PropsType

) => ZalgoPromise,\n close: () => ZalgoPromise,\n|};\n\nexport type ChildHelpers

= {|\n close: () => ZalgoPromise,\n focus: () => ZalgoPromise,\n resize: ({ width: ?number, height: ?number }) => ZalgoPromise,\n onError: mixed => ZalgoPromise,\n onProps: ((PropsType

) => void) => void,\n getParent: () => CrossDomainWindowType,\n getParentDomain: () => string,\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n component: Component

;\n props: PropsType

;\n context: string;\n parent: ParentExportsType

;\n parentDomain: string;\n parentComponentWindow: CrossDomainWindowType;\n\n onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array\n autoResize: { width: boolean, height: boolean, element?: string };\n\n constructor(component: Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n\n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${\n childPayload.version\n }, child window has version ${__ZOID__.__VERSION__}`;\n // throw new Error(msg);\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(\n this.parentComponentWindow,\n domain,\n exports\n );\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(\n this.parentComponentWindow,\n domain,\n props\n );\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n\n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n })\n .then(() => {\n return this.watchForResize();\n })\n .catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers(): ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: err => this.onError(err),\n onProps: handler => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain,\n };\n }\n\n checkParentDomain(domain: string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${domain}`);\n }\n }\n\n onProps(handler: Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(\n parentComponentWindow: CrossDomainWindowType,\n domain: string,\n { type, value, uid }: PropRef\n ): PropsType

{\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(\n `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props`\n );\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref: WindowRef): CrossDomainWindowType {\n const { type } = ref;\n\n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n\n throw new Error(`Unable to find ${type} parent component window`);\n }\n\n getProps(): PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n setProps(props: PropsType

, origin: string, isUpdate: boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(\n this.parentComponentWindow,\n this.component,\n props,\n origin,\n helpers,\n isUpdate\n );\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } {\n let { width = false, height = false, element = 'body' } =\n this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize(): ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(\n element,\n ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined,\n });\n },\n { width, height }\n );\n });\n }\n\n buildExports(): ChildExportsType

{\n const self = this;\n\n return {\n updateProps(props: PropsType

): ZalgoPromise {\n return ZalgoPromise.try(() =>\n self.setProps(props, this.__origin__, true)\n );\n },\n\n close(): ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n },\n };\n }\n\n resize({\n width,\n height,\n }: {\n width: ?number,\n height: ?number,\n }): ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close(): ZalgoPromise {\n return this.parent.close();\n }\n\n destroy(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus(): ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err: mixed): ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://zoid/webpack/universalModuleDefinition","webpack://zoid/webpack/bootstrap","webpack://zoid/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://zoid/./node_modules/zalgo-promise/src/utils.js","webpack://zoid/./node_modules/zalgo-promise/src/exceptions.js","webpack://zoid/./node_modules/zalgo-promise/src/flush.js","webpack://zoid/./node_modules/zalgo-promise/src/promise.js","webpack://zoid/./node_modules/cross-domain-utils/src/util.js","webpack://zoid/./node_modules/cross-domain-utils/src/constants.js","webpack://zoid/./node_modules/cross-domain-utils/src/utils.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/util.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/weakmap.js","webpack://zoid/./node_modules/belter/src/util.js","webpack://zoid/./node_modules/belter/src/dom.js","webpack://zoid/./node_modules/cross-domain-safe-weakmap/src/native.js","webpack://zoid/./node_modules/belter/src/css.js","webpack://zoid/./node_modules/post-robot/src/conf/config.js","webpack://zoid/./node_modules/post-robot/src/conf/constants.js","webpack://zoid/./node_modules/post-robot/src/global.js","webpack://zoid/./node_modules/post-robot/src/lib/hello.js","webpack://zoid/./node_modules/post-robot/src/lib/windows.js","webpack://zoid/./node_modules/universal-serialize/src/constants.js","webpack://zoid/./node_modules/universal-serialize/src/common.js","webpack://zoid/./node_modules/universal-serialize/src/serialize.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/function.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/error.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/promise.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/regex.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/date.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/array.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/object.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/string.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/number.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/boolean.js","webpack://zoid/./node_modules/universal-serialize/src/serializers/null.js","webpack://zoid/./node_modules/universal-serialize/src/deserialize.js","webpack://zoid/./node_modules/post-robot/src/bridge/common.js","webpack://zoid/./node_modules/post-robot/src/bridge/parent.js","webpack://zoid/./node_modules/post-robot/src/bridge/setup.js","webpack://zoid/./node_modules/post-robot/src/bridge/bridge.js","webpack://zoid/./node_modules/post-robot/src/bridge/child.js","webpack://zoid/./node_modules/post-robot/src/serialize/window.js","webpack://zoid/./node_modules/post-robot/src/serialize/function.js","webpack://zoid/./node_modules/post-robot/src/serialize/serialize.js","webpack://zoid/./node_modules/post-robot/src/serialize/promise.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/strategies.js","webpack://zoid/./node_modules/post-robot/src/drivers/send/index.js","webpack://zoid/./node_modules/post-robot/src/lib/compat.js","webpack://zoid/./node_modules/post-robot/src/drivers/listeners.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/types.js","webpack://zoid/./node_modules/post-robot/src/drivers/receive/index.js","webpack://zoid/./node_modules/post-robot/src/public/on.js","webpack://zoid/./node_modules/post-robot/src/public/send.js","webpack://zoid/./node_modules/post-robot/src/index.js","webpack://zoid/./node_modules/post-robot/src/setup.js","webpack://zoid/./node_modules/post-robot/src/clean.js","webpack://zoid/./src/lib/global.js","webpack://zoid/./src/lib/serialize.js","webpack://zoid/./src/constants.js","webpack://zoid/./src/child/props.js","webpack://zoid/./src/child/window.js","webpack://zoid/./src/child/index.js","webpack://zoid/./src/parent/drivers.js","webpack://zoid/./src/parent/props.js","webpack://zoid/./src/parent/index.js","webpack://zoid/./src/delegate/index.js","webpack://zoid/./src/component/templates/container.js","webpack://zoid/./src/component/templates/component.js","webpack://zoid/./src/component/props.js","webpack://zoid/./src/component/component.js","webpack://zoid/./src/component/validate.js","webpack://zoid/./src/index.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","_extends","assign","target","arguments","length","source","apply","isPromise","item","Promise","window","Window","constructor","toString","then","err","flushPromise","dispatchedErrors","possiblyUnhandledPromiseHandlers","activeCount","flushActive","promise","resolve","startActive","endActive","ZalgoPromise","handler","_this","resolved","rejected","errorHandled","error","handlers","dispatching","stack","result","isAsync","res","reject","_proto","prototype","Error","dispatch","_this2","setTimeout","indexOf","push","j","dispatchPossiblyUnhandledError","asyncReject","_this3","_loop","_handlers$i","onSuccess","onError","catch","undefined","finally","onFinally","try","timeout","time","_this4","clearTimeout","toPromise","TypeError","all","promises","count","results","_loop2","prom","hash","keys","map","items","method","onPossiblyUnhandledException","cancel","splice","context","args","delay","flush","isRegex","PROTOCOL","MOCK","FILE","ABOUT","WILDCARD","WINDOW_TYPE","IFRAME","POPUP","IE_WIN_ACCESS_ERROR","isAboutProtocol","win","location","protocol","getParent","parent","getOpener","opener","canReadFromWindow","getActualDomain","host","getDomain","domain","mockDomain","isSameDomain","desc","getOwnPropertyDescriptor","isActuallySameDomain","assertSameDomain","isAncestorParent","child","childParent","getParents","getFrames","frames","len","frame","getAllChildFrames","_i3","_getFrames2","_i5","_getAllChildFrames2","getTop","top","_i7","_getAllChildFrames4","getAllFramesInWindow","concat","iframeWindows","iframeFrames","isWindowClosed","allowMock","closed","message","mockclosed","iframeIndex","collection","safeIndexOf","contentWindow","parentNode","doc","ownerDocument","documentElement","contains","isFrameWindowClosed","getUserAgent","navigator","mockUserAgent","userAgent","getFrameByName","winFrames","_i9","childFrame","isOpener","getAncestor","anyMatch","collection1","collection2","_i17","item1","_i19","getDistanceFromTop","distance","isSameTopWindow","win1","win2","top1","top2","allFrames1","allFrames2","opener1","opener2","matchDomain","pattern","origin","Array","isArray","Boolean","match","JSON","stringify","some","subpattern","getDomainFromUrl","url","split","slice","join","onCloseWindow","callback","maxtime","Infinity","check","isWindow","obj","normalizeMockUrl","objectIDs","awaitFrameLoadPromises","counter","Date","now","CrossDomainSafeWeakMap","weakmap","values","Math","random","WeakMap","freeze","testWeakMap","testKey","set","hasNativeWeakMap","_cleanupClosedWindows","delete","isSafeToReadWrite","entry","writable","index","has","getOrSet","base64encode","str","btoa","Buffer","from","uniqueID","chars","replace","charAt","floor","toISOString","toLowerCase","serializeArgs","subkey","val","uid","getObjectID","memoizePromise","cache","memoizedPromiseFunction","_len2","_key2","reset","inlineMemoize","logic","__inline_memoize_cache__","noop","once","called","stringifyError","level","newErr","extend","safeInterval","loop","isDefined","cleanup","tasks","cleaned","register","task","pop","assertExists","thing","isDocumentReady","document","body","readyState","urlEncode","waitForDocumentReady","interval","setInterval","clearInterval","parseQuery","queryString","params","_i2","_queryString$split2","pair","decodeURIComponent","extendQuery","originalQuery","props","filter","appendChild","container","isElement","element","Element","nodeType","style","getElementSafe","id","querySelector","elementReady","el","PopupOpenError","awaitFrameLoad","addEventListener","cleanIframes","linkFrameWindow","awaitFrameWindow","loadedFrame","iframe","options","tag","styleText","createElement","class","className","setAttribute","attributes","_i6","_Object$keys2","styleSheet","cssText","createTextNode","html","innerHTML","allowTransparency","backgroundColor","border","isIE","hasAttribute","getElement","event","removeEventListener","destroyElement","removeChild","isElementClosed","onResize","_temp","_ref2","_ref2$width","width","_ref2$height","height","_ref2$interval","_ref2$win","currentWidth","offsetWidth","currentHeight","offsetHeight","observer","newWidth","newHeight","ResizeObserver","observe","MutationObserver","childList","subtree","characterData","disconnect","isPerc","test","isPx","toNum","parseInt","toPx","toCSS","normalizeDimension","dim","max","MESSAGE_NAME","METHOD","HELLO","OPEN_TUNNEL","BRIDGE_NAME_PREFIX","SERIALIZATION_TYPE","CROSS_DOMAIN_ZALGO_PROMISE","CROSS_DOMAIN_FUNCTION","CROSS_DOMAIN_WINDOW","getGlobal","getObj","globalStore","defStore","store","storeKey","defVal","del","WildCard","getWildcard","global","WINDOW_WILDCARD","windowStore","winStore","getStore","getInstanceID","getHelloPromise","sayHello","_ref3","send","instanceID","_ref4","data","getWindowInstanceID","_ref5","_ref6","awaitWindowHello","markWindowKnown","TYPE","FUNCTION","ERROR","PROMISE","REGEX","DATE","ARRAY","OBJECT","STRING","NUMBER","BOOLEAN","NULL","UNDEFINED","isSerializedType","__type__","determineType","serializeType","type","__val__","SERIALIZER","_SERIALIZER","_ref","code","toJSON","defaultSerializers","DESERIALIZER","_DESERIALIZER","RegExp","defaultDeserializers","needsBridgeForBrowser","needsBridgeForWin","needsBridgeForDomain","needsBridge","getBridgeName","sanitizedDomain","isBridge","documentBodyReady","registerRemoteWindow","findRemoteWindow","remoteWinPromise","registerRemoteSendMessage","sendMessage","remoteWin","remoteDomain","fireAndForget","rejectRemoteSendMessage","linkWindow","popupWindowsByName","popupWindowsByWin","_popupWindowsByName$k2","winName","details","setupBridge","windowOpen","on","receiveMessage","open","last","bridgePromise","bridge","winDetails","listenForOpenTunnel","openTunnelToParent","canary","tunnelWindows","parentWindow","_tunnelWindows$keys2","cleanTunnelWindows","addTunnelWindow","tunnelWindow","setupOpenTunnelToParent","openTunnelToOpener","cleanupProxyWindows","idToProxyWindow","_idToProxyWindow$keys2","shouldClean","getSerializedWindow","windowName","close","getName","focus","isClosed","setLocation","href","setName","frameElement","ProxyWindow","serializedWindow","actualWindow","isProxyWindow","actualWindowPromise","setWindow","getType","isPopup","isIframe","getWindow","awaitWindow","matchWindow","_this5","unwrap","serialize","toProxyWindow","deserialize","realWin","proxyWindow","addMethod","methodStore","proxyWindowMethods","lookupMethod","serializeFunction","destination","meth","methodSource","listenForFunctionCalls","__id__","__name__","serializeMessage","_serialize","serializers","serializer","serializePromise","deserializeMessage","_deserialize","deserializers","parse","deserializer","serializedPromise","serializedFunction","getDeserializedFunction","opts","crossDomainFunctionWrapper","_arguments","__origin__","__source__","deserializeFunction","_ref8","SEND_MESSAGE_STRATEGIES","_serializeMessage","serializedMessage","strategies","errors","strategyName","dom","forEach","postMessage","messagingChild","messagingParent","sendBridgeMessage","foreignGlobal","__DOMAIN_REGEX__","getResponseListener","deleteResponseListener","isResponseListenerErrored","getRequestListener","requestListeners","_i4","winQualifier","nameListeners","domainListeners","_domainListeners$__DO2","_domainListeners$__DO3","listener","regex","RECEIVE_MESSAGE_TYPES","_RECEIVE_MESSAGE_TYPE","sendResponse","ack","response","pathname","handleError","receivedMessages","parsedMessage","parseMessage","requestListener","addRequestListener","listenersCollection","_i8","_win2","_i10","_i12","_domain2","_i14","existingListener","regexListeners","regexListener","strDomain","errorHandler","responseTimeout","childTimeout","validateOptions","actualParent","_i15","_getFrames8","isAncestor","normalizeDomain","targetDomain","logName","responseListener","addResponseListener","reqPromises","markResponseListenerErrored","totalAckTimeout","isWindowKnown","totalResTimeout","ackTimeout","resTimeout","cancelled","internalSerializeMessage","internalDeserializeMessage","cleanUpWindow","_requestPromises$get2","getProxyObject","openBridge","bridges","bridgeFrames","src","openBridgeFrame","linkUrl","hasBridge","destroyBridges","_bridgeFrames$keys2","ZOID","POST_MESSAGE","PROP_TYPE","PROP_SERIALIZATION","DOTIFY","BASE64","CONTEXT","DEFAULT_DIMENSIONS","WIDTH","HEIGHT","EVENT","RENDER","RENDERED","DISPLAY","CLOSE","PROPS","RESIZE","normalizeChildProp","component","helpers","prop","getPropDefinition","childDecorate","parseChildWindowName","_windowName$split","zoidcomp","encodedPayload","atob","base64decode","getChildPayload","ChildComponent","parentDomain","parentComponentWindow","onPropHandlers","autoResize","childPayload","__ZOID__","version","console","log","getParentComponentWindow","checkParentDomain","initialProps","getPropsByRef","setProps","watchForClose","init","buildExports","watchForResize","getHelpers","resize","onProps","getParentDomain","allowedParentDomains","ref","getNthParent","ancestor","_getAllFramesInWindow2","windows","getProps","isUpdate","existingProps","sameDomain","alias","_component$getPropNam2","getPropNames","normalizeChildProps","_this$onPropHandlers2","checkClose","destroy","getAutoResize","_ref3$width","_ref3$height","_ref3$element","_this4$getAutoResize","updateProps","_this6","RENDER_DRIVERS","getQueryParam","queryParam","getQueryValue","queryValue","openOnClick","openFrame","title","proxyFrame","frameWatcher","clean","openPrerenderFrame","openPrerender","proxyWin","proxyPrerenderFrame","prerenderFrame","prerenderFrameWindow","delegate","_this3$component$dime","dimensions","left","outerWidth","round","screenX","screen","outerHeight","screenY","status","toolbar","menubar","resizable","scrollbars","popup","ParentComponent","driver","initPromise","handledErrors","state","setupEvents","registerActiveComponent","destroyActiveComponent","watchForUnload","triggered","eventName","handlerList","trigger","_len3","_key3","triggerOnce","_len4","_key4","onRender","onDisplay","onRendered","onClose","render","initialDomain","getInitialDomain","checkAllowRender","buildUrl","getProxyContainer","renderContainer","setState","setProxyWin","prerender","loadUrl","setWindowName","buildWindowName","runTimeout","containerElement","buildChildPayload","getPropsRef","getPropsForChild","propRef","_ref7","_ref7$target","getWindowRef","buildParentExports","validate","inputProps","propNames","aliases","propDef","default","_Object$keys4","decorate","required","extendProps","propsDef","builtinProps","serialization","dotify","prefix","newobj","every","_Object$keys6","dotkey","query","originalUrl","originalHash","_url$split","_originalUrl$split","hashString","extendUrl","getUrl","sendToChild","_this7","_this8","_this9","_this10","windowProp","_this11","_this12","_this13","_this$component$getPr2","propName","allowDelegate","overridesPromise","overrides","_ref9","_this$driver$delegate2","_this14","_this15","_this16","unloadWindowListener","_this17","initChild","_this18","_this19","_ref10","_ref11","_this20","_this21","secondClosed","_this22","proxyPrerenderWin","_ref12","_this23","prerenderTemplate","prerenderWindow","isBlankDomain","renderTemplate","tagName","children","writeElementToWindow","_ref13","_ref13$width","_ref13$height","_ref13$element","_ref14","renderer","_ref15","_this24","proxyContainer","_ref16","_this25","_ref17","innerContainer","containerTemplate","_this26","_this27","_this28","bridgeUrl","getBridgeUrl","bridgeDomain","DelegateComponent","watchForSourceClose","getDelegate","getOverrides","closeSourceWindowListener","CLASS","VISIBLE","INVISIBLE","defaultContainerTemplate","_ref$dimensions","div","cspNonce","classList","add","remove","defaultPrerenderTemplate","spinner","defaultNoop","decorateOnce","Component","defaultContext","driverCache","xprops","logger","PROP_TYPE_LIST","validatePropDefinitions","components","_ref$width","_ref$height","debug","info","warn","registerChild","listenDelegate","dep","isChild","_ref2$data","canRenderTo","payload","getDefaultContainer","getDefaultContext","renderTo","instance","activeComponents","initialized","sourceElement","originalEvent","messageListener","listenForMessages","initHello","destroyAll","destroyComponents","responseListeners","_responseListeners$ke2","cancelResponseListeners","__webpack_exports__","component_destroy","component_Component"],"mappings":"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","file":"zoid.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(\"zoid\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"zoid\"] = factory();\n\telse\n\t\troot[\"zoid\"] = 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","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' && window.Window && item instanceof window.Window) {\n return false;\n }\n\n if (typeof window !== 'undefined' && window.constructor && item instanceof window.constructor) {\n return false;\n }\n\n let toString = ({}).toString;\n\n if (toString) {\n let 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 = [];\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 let promise = flushPromise = flushPromise || new Zalgo();\n flushActive();\n return promise;\n}\n","/* @flow */\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 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 let 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 let { 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 for (let i = 0; i < handlers.length; i++) {\n\n let { 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\n if (result.resolved) {\n promise.resolve(result.value);\n } else {\n promise.reject(result.error);\n }\n\n result.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 result.then(res => {\n promise.resolve(res);\n }, err => {\n promise.reject(err);\n });\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 let promise : ZalgoPromise = 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 return this.then(undefined, onError);\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 let 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 static resolve(value : X | ZalgoPromise) : ZalgoPromise {\n\n if (value instanceof ZalgoPromise) {\n return value;\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 let promise = new ZalgoPromise();\n let count = promises.length;\n let results = [];\n\n if (!count) {\n promise.resolve(results);\n return promise;\n }\n\n for (let i = 0; i < promises.length; i++) {\n let 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 ZalgoPromise.resolve(prom).then(result => {\n results[i] = result;\n count -= 1;\n if (count === 0) {\n promise.resolve(results);\n }\n }, err => {\n promise.reject(err);\n });\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 let result = {};\n \n return ZalgoPromise.all(Object.keys(promises).map(key => {\n return ZalgoPromise.resolve(promises[key]).then(value => {\n result[key] = value;\n });\n })).then(() => {\n return result;\n });\n }\n\n static map(items : Array, method : (T) => (ZalgoPromise | X)) : ZalgoPromise> {\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 : A) => (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;\n\n startActive();\n \n try {\n // $FlowFixMe\n result = method.apply(context, args || []);\n } catch (err) {\n endActive();\n return ZalgoPromise.reject(err);\n }\n\n endActive();\n\n return ZalgoPromise.resolve(result);\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\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\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/* eslint max-lines: 0 */\n\nimport { isRegex, noop } from './util';\nimport type { CrossDomainWindowType, SameDomainWindowType, DomainMatcher } from './types';\nimport { PROTOCOL, WILDCARD } from './constants';\n\nlet IE_WIN_ACCESS_ERROR = 'Call was rejected by callee.\\r\\n';\n\nexport function isFileProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.FILE;\n}\n\nexport function isAboutProtocol(win : SameDomainWindowType = window) : boolean {\n return win.location.protocol === PROTOCOL.ABOUT;\n}\n\nexport function getParent(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n\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(win : CrossDomainWindowType | SameDomainWindowType) : 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) : string {\n\n win = win || window;\n\n let location = win.location;\n\n if (!location) {\n throw new Error(`Can not read window location`);\n }\n\n let protocol = location.protocol;\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\n let parent = getParent(win);\n if (parent && canReadFromWindow(parent)) {\n // $FlowFixMe\n return getActualDomain(parent);\n }\n\n return `${ PROTOCOL.ABOUT }//`;\n }\n\n let 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) : string {\n\n win = win || window;\n\n let 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\n try {\n if (win === window) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n try {\n let desc = Object.getOwnPropertyDescriptor(win, 'location');\n\n if (desc && desc.enumerable === false) {\n return false;\n }\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 (getActualDomain(win) === getActualDomain(window)) {\n return true;\n }\n\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\nexport function isSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : boolean {\n\n if (!isActuallySameDomain(win)) {\n return false;\n }\n\n try {\n\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\n } catch (err) {\n // pass\n }\n\n return false;\n}\n\n\nexport function assertSameDomain(win : CrossDomainWindowType | SameDomainWindowType) : 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(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n try {\n\n while (win.parent !== win) {\n result.push(win.parent);\n win = win.parent;\n }\n\n } catch (err) {\n // pass\n }\n\n return result;\n}\n\nexport function isAncestorParent(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n if (!parent || !child) {\n return false;\n }\n\n let 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(win : CrossDomainWindowType) : Array {\n\n let 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\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\n\nexport function getAllChildFrames(win : CrossDomainWindowType) : Array {\n\n let result = [];\n\n for (let frame of getFrames(win)) {\n result.push(frame);\n\n for (let childFrame of getAllChildFrames(frame)) {\n result.push(childFrame);\n }\n }\n\n return result;\n}\n\nexport function getTop(win : CrossDomainWindowType) : ?CrossDomainWindowType {\n\n if (!win) {\n return;\n }\n\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 (let 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(win? : CrossDomainWindowType = window) : ?CrossDomainWindowType {\n return getOpener(getTop(win) || win);\n}\n\nexport function getUltimateTop(win? : CrossDomainWindowType = window) : CrossDomainWindowType {\n let opener = getNextOpener(win);\n\n if (opener) {\n return getUltimateTop(opener);\n }\n\n return top;\n}\n\nexport function getAllFramesInWindow(win : CrossDomainWindowType) : Array {\n let top = getTop(win);\n\n if (!top) {\n throw new Error(`Can not determine top window`);\n }\n\n return [ ...getAllChildFrames(top), top ];\n}\n\nexport function getAllWindows(win? : CrossDomainWindowType = window) : $ReadOnlyArray {\n let frames = getAllFramesInWindow(win);\n let 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\n if (!frame.contentWindow) {\n return true;\n }\n\n if (!frame.parentNode) {\n return true;\n }\n\n let doc = frame.ownerDocument;\n\n if (doc && doc.documentElement && !doc.documentElement.contains(frame)) {\n return true;\n }\n\n return false;\n}\n\nfunction safeIndexOf(collection : Array, 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\nlet iframeWindows = [];\nlet iframeFrames = [];\n\nexport function isWindowClosed(win : CrossDomainWindowType, allowMock : boolean = true) : boolean {\n\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\n } catch (err) {\n return true;\n }\n\n try {\n if (win.closed) {\n return true;\n }\n\n } catch (err) {\n\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\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 let iframeIndex = safeIndexOf(iframeWindows, win);\n\n if (iframeIndex !== -1) {\n let 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\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\n\nexport function getFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let winFrames = getFrames(win);\n\n for (let childFrame of winFrames) {\n try {\n // $FlowFixMe\n if (isSameDomain(childFrame) && childFrame.name === name && winFrames.indexOf(childFrame) !== -1) {\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(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n for (let childFrame of getFrames(win)) {\n let namedFrame = findChildFrameByName(childFrame, name);\n\n if (namedFrame) {\n return namedFrame;\n }\n }\n}\n\nexport function findFrameByName(win : CrossDomainWindowType, name : string) : ?CrossDomainWindowType {\n\n let frame;\n\n frame = getFrameByName(win, name);\n\n if (frame) {\n return frame;\n }\n\n let top = getTop(win) || win;\n\n return findChildFrameByName(top, name);\n}\n\nexport function isParent(win : CrossDomainWindowType, frame : CrossDomainWindowType) : boolean {\n\n let frameParent = getParent(frame);\n\n if (frameParent) {\n return frameParent === win;\n }\n\n for (let childFrame of getFrames(win)) {\n if (childFrame === frame) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isOpener(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n return parent === getOpener(child);\n}\n\nexport function getAncestor(win : ?CrossDomainWindowType) : ?CrossDomainWindowType {\n win = win || window;\n\n let opener = getOpener(win);\n\n if (opener) {\n return opener;\n }\n\n let parent = getParent(win);\n\n if (parent) {\n return parent;\n }\n}\n\nexport function getAncestors(win : CrossDomainWindowType) : Array {\n\n let 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\n\nexport function isAncestor(parent : CrossDomainWindowType, child : CrossDomainWindowType) : boolean {\n\n let 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 (let frame of getFrames(parent)) {\n if (frame === child) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isPopup() : boolean {\n return Boolean(getOpener(window));\n}\n\nexport function isIframe() : boolean {\n return Boolean(getParent(window));\n}\n\nexport function isFullpage() : boolean {\n return Boolean(!isIframe() && !isPopup());\n}\n\nfunction anyMatch(collection1, collection2) : boolean {\n\n for (let item1 of collection1) {\n for (let item2 of collection2) {\n if (item1 === item2) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDistanceFromTop(win : CrossDomainWindowType = window) : 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(win : CrossDomainWindowType, n : number = 1) : ?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(win : CrossDomainWindowType, n : number = 1) : ?CrossDomainWindowType {\n return getNthParent(win, getDistanceFromTop(win) - n);\n}\n\nexport function isSameTopWindow(win1 : CrossDomainWindowType, win2 : CrossDomainWindowType) : boolean {\n\n let top1 = getTop(win1) || win1;\n let 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 let allFrames1 = getAllFramesInWindow(win1);\n let allFrames2 = getAllFramesInWindow(win2);\n\n if (anyMatch(allFrames1, allFrames2)) {\n return true;\n }\n\n let opener1 = getOpener(top1);\n let 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(pattern : DomainMatcher, origin : DomainMatcher) : boolean {\n\n if (typeof pattern === 'string') {\n\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\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\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\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(win : CrossDomainWindowType, callback : Function, delay : number = 1000, maxtime : number = Infinity) : { cancel : () => void } {\n\n let timeout;\n\n let check = () => {\n\n if (isWindowClosed(win)) {\n\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\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 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 noop(obj === obj); // eslint-disable-line no-self-compare\n\n } catch (err) {\n return true;\n }\n\n try {\n noop(obj && obj.__cross_domain_utils_window_check__);\n\n } catch (err) {\n return true;\n }\n\n return false;\n}\n\nexport function isBrowser() : boolean {\n return (typeof window !== 'undefined' && typeof window.location !== 'undefined');\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","/* @flow */\n\nexport function safeIndexOf(collection : Array, 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 : Array) {\n // pass\n}\n","/* @flow */\n\nimport { isWindow, isWindowClosed } from 'cross-domain-utils/src';\n\nimport { hasNativeWeakMap } from './native';\nimport { noop, safeIndexOf } from './util';\n\nlet defineProperty = Object.defineProperty;\nlet counter = Date.now() % 1e9;\n\nexport class CrossDomainSafeWeakMap {\n\n name : string\n weakmap : WeakMap\n keys : Array\n values : Array\n\n constructor() {\n counter += 1;\n\n // eslint-disable-next-line no-bitwise\n this.name = `__weakmap_${ Math.random() * 1e9 >>> 0 }__${ counter }`;\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 let weakmap = this.weakmap;\n let keys = this.keys;\n\n for (let i = 0; i < keys.length; i++) {\n let 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 let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let values = this.values;\n let 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 } else {\n\n let name = this.name;\n let entry = key[name];\n\n if (entry && entry[0] === key) {\n entry[1] = value;\n } else {\n defineProperty(key, name, {\n value: [ key, value ],\n writable: true\n });\n }\n }\n }\n\n get(key : K) : V | void {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let weakmap = this.weakmap;\n\n if (weakmap) {\n try {\n if (weakmap.has(key)) {\n return weakmap.get(key);\n }\n } catch (err) {\n delete this.weakmap;\n }\n }\n\n if (!this.isSafeToReadWrite(key)) {\n\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index === -1) {\n return;\n }\n\n return this.values[index];\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return entry[1];\n }\n }\n }\n\n delete(key : K) {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let keys = this.keys;\n let index = safeIndexOf(keys, key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n this.values.splice(index, 1);\n }\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n entry[0] = entry[1] = undefined;\n }\n }\n }\n\n has(key : K) : boolean {\n\n if (!key) {\n throw new Error(`WeakMap expected key`);\n }\n\n let 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\n this._cleanupClosedWindows();\n\n let index = safeIndexOf(this.keys, key);\n return index !== -1;\n\n } else {\n\n let entry = key[this.name];\n\n if (entry && entry[0] === key) {\n return true;\n }\n\n return false;\n }\n }\n\n getOrSet(key : K, getter : () => V) : V {\n if (this.has(key)) {\n // $FlowFixMe\n return this.get(key);\n }\n\n let value = getter();\n this.set(key, value);\n return value;\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport type { CancelableType } from './types';\n\nexport function base64encode(str : string) : string {\n if (typeof btoa === 'function') {\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n return Buffer.from(str, 'utf8').toString('base64');\n }\n\n throw new Error(`Can not find window.btoa or Buffer`);\n}\n\nexport function base64decode(str : string) : string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n return window.atob(str);\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\n let chars = '0123456789abcdef';\n\n let randomID = 'xxxxxxxxxx'.replace(/./g, () => {\n return chars.charAt(Math.floor(Math.random() * chars.length));\n });\n\n let timeID = base64encode(\n new Date().toISOString().slice(11, 19).replace('T', '.')\n ).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n\n return `${ 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\n objectIDs = objectIDs || new WeakMap();\n\n if (obj === null || obj === undefined || (typeof obj !== 'object' && typeof obj !== 'function')) {\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 : Array) : string {\n try {\n return JSON.stringify(Array.prototype.slice.call(args), (subkey, val) => {\n if (typeof val === 'function') {\n return `memoize[${ getObjectID(val) }]`;\n }\n return val;\n });\n } catch (err) {\n throw new Error(`Arguments not serializable -- can not be used to memoize`);\n }\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoize(method : (...args : Array) => R, options : { time? : number, name? : string, thisNamespace? : boolean } = {}) : ((...args : Array) => R) {\n let cacheMap = new WeakMap();\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedFunction(...args : Array) : R {\n let cache = cacheMap.getOrSet(options.thisNamespace ? this : method, () => ({}));\n\n let key : string = serializeArgs(args);\n\n let cacheTime = options.time;\n if (cache[key] && cacheTime && (Date.now() - cache[key].time) < cacheTime) {\n delete cache[key];\n }\n\n if (cache[key]) {\n return cache[key].value;\n }\n\n let time = Date.now();\n let value = method.apply(this, arguments);\n\n cache[key] = { time, value };\n\n return cache[key].value;\n }\n\n memoizedFunction.reset = () => {\n cacheMap.delete(options.thisNamespace ? this : method);\n };\n\n if (options.name) {\n memoizedFunction.displayName = `${ options.name }:memoized`;\n }\n\n return memoizedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function memoizePromise(method : (...args : Array) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) {\n let cache = {};\n\n // eslint-disable-next-line flowtype/no-weak-types\n function memoizedPromiseFunction(...args : Array) : ZalgoPromise {\n let key : string = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n cache[key] = method.apply(this, arguments)\n .finally(() => {\n delete cache[key];\n });\n\n return cache[key];\n }\n\n memoizedPromiseFunction.reset = () => {\n cache = {};\n };\n\n return memoizedPromiseFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function promisify(method : (...args : Array) => R, options : { name? : string } = {}) : ((...args : Array) => 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 promisifiedFunction;\n}\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport function inlineMemoize(method : (...args : Array) => R, logic : (...args : Array) => R, args : Array = []) : R {\n let cache = method.__inline_memoize_cache__ = method.__inline_memoize_cache__ || {};\n let key = serializeArgs(args);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n \n let result = cache[key] = logic(...args);\n return result;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function noop(...args : Array) {\n // pass\n}\n\nexport function once(method : Function) : Function {\n let called = false;\n\n return function onceFunction() : mixed {\n if (!called) {\n called = true;\n return method.apply(this, arguments);\n }\n };\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 let 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\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\n configurable: true,\n\n set(item) {\n value = item;\n\n if (value) {\n resolve(value);\n }\n },\n\n get() : mixed {\n return value;\n }\n });\n });\n}\n\nexport function stringifyError(err : mixed, level : number = 1) : string {\n\n if (level >= 3) {\n return 'stringifyError stack overflow';\n }\n\n try {\n if (!err) {\n return ``;\n }\n\n if (typeof err === 'string') {\n return err;\n }\n\n if (err instanceof Error) {\n let stack = err && err.stack;\n let 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 (typeof err.toString === 'function') {\n return err.toString();\n }\n\n return Object.prototype.toString.call(err);\n\n } catch (newErr) { // eslint-disable-line unicorn/catch-error-name\n return `Error while stringifying error: ${ stringifyError(newErr, level + 1) }`;\n }\n}\n\nexport function stringifyErrorMessage(err : mixed) : string {\n\n let 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 && typeof item.toString === 'function') {\n return item.toString();\n }\n\n return Object.prototype.toString.call(item);\n}\n\nexport function domainMatches(hostname : string, domain : string) : boolean {\n hostname = hostname.split('://')[1];\n let index = hostname.indexOf(domain);\n return (index !== -1 && hostname.slice(index) === domain);\n}\n\nexport function patchMethod(obj : Object, name : string, handler : Function) {\n let original = obj[name];\n\n obj[name] = function patchedMethod() : mixed {\n return handler({\n context: this,\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 (let 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 }) : Array {\n let result = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n result.push(obj[key]);\n }\n }\n return result;\n}\n\nexport function perc(pixels : number, percentage : number) : number {\n return Math.round((pixels * percentage) / 100);\n}\n\nexport function min(...args : Array) : number {\n return Math.min(...args);\n}\n\nexport function max(...args : Array) : number {\n return Math.max(...args);\n}\n\nexport function regexMap(str : string, regexp : RegExp, handler : () => T) : Array {\n let 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(obj : { [string] : T }, filter? : (T, ?string) => mixed = Boolean) : { [string] : R } {\n let result = {};\n\n for (let 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(text : string, regexp : RegExp) : Array {\n let result = [];\n text.replace(regexp, token => {\n result.push(token);\n return '';\n });\n return result;\n}\n\nexport function promiseDebounce(method : () => ZalgoPromise | T, delay : number = 50) : () => ZalgoPromise {\n\n let promise;\n let timeout;\n\n return function promiseDebouncedMethod() : ZalgoPromise {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n let localPromise = promise = promise || new ZalgoPromise();\n\n timeout = setTimeout(() => {\n promise = null;\n timeout = null;\n\n ZalgoPromise.try(method).then(\n result => { localPromise.resolve(result); },\n err => { localPromise.reject(err); }\n );\n }, delay);\n\n return localPromise;\n };\n}\n\nexport function safeInterval(method : Function, time : number) : { cancel : () => void } {\n\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(obj : Object, prefix : string = '', newobj : Object = {}) : { [string] : string } {\n prefix = prefix ? `${ prefix }.` : prefix;\n for (let key in obj) {\n if (!obj.hasOwnProperty(key) || obj[key] === undefined || obj[key] === null || typeof obj[key] === 'function') {\n continue;\n } else if (obj[key] && Array.isArray(obj[key]) && obj[key].length && obj[key].every(val => typeof val !== 'object')) {\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 \n let 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, key.length - 2);\n value = value.split(',').map(deserializePrimitive);\n } else {\n value = deserializePrimitive(value);\n }\n\n let keyResult = result;\n let parts = key.split('.');\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let isLast = (i + 1 === parts.length);\n let isIndex = !isLast && isInteger(parts[i + 1]);\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 : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise,\n triggerOnce : (eventName : string, ...args : $ReadOnlyArray) => ZalgoPromise\n};\n\nexport function eventEmitter() : EventEmitterType {\n let triggered = {};\n let handlers = {};\n\n return {\n\n on(eventName : string, handler : Function) : CancelableType {\n let 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\n once(eventName : string, handler : Function) : CancelableType {\n\n let listener = this.on(eventName, () => {\n listener.cancel();\n handler();\n });\n\n return listener;\n },\n\n trigger(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n let handlerList = handlers[eventName];\n let promises = [];\n\n if (handlerList) {\n for (let handler of handlerList) {\n promises.push(ZalgoPromise.try(() => handler(...args)));\n }\n }\n\n return ZalgoPromise.all(promises).then(noop);\n },\n\n triggerOnce(eventName : string, ...args : $ReadOnlyArray) : ZalgoPromise {\n\n if (triggered[eventName]) {\n return ZalgoPromise.resolve();\n }\n\n triggered[eventName] = true;\n return this.trigger(eventName, ...args);\n }\n };\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\n if (!path) {\n return def;\n }\n\n let pathParts = path.split('.');\n\n // Loop through each section of our key path\n\n for (let i = 0; i < pathParts.length; i++) {\n\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\n let interval = safeInterval(() => {\n time -= 100;\n if (time <= 0) {\n interval.cancel();\n method();\n }\n }, 100);\n}\n\nexport function defineLazyProp(obj : Object | Array, key : string | number, getter : () => T) {\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 let 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\nexport function isObject(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null);\n}\n\nexport function isObjectObject(obj : mixed) : boolean {\n return isObject(obj) && Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function isPlainObject(obj : mixed) : boolean {\n if (!isObjectObject(obj)) {\n return false;\n }\n\n // $FlowFixMe\n let constructor = obj.constructor;\n\n if (typeof constructor !== 'function') {\n return false;\n }\n\n let 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> (item : T, replacer : (mixed, string | number, string) => mixed, fullKey : string = '') : T {\n\n if (Array.isArray(item)) {\n let length = item.length;\n let result = [];\n\n for (let i = 0; i < length; i++) {\n\n \n defineLazyProp(result, i, () => {\n let itemKey = fullKey ? `${ fullKey }.${ i }` : `${ i }`;\n let 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 let result = {};\n\n for (let key in item) {\n if (!item.hasOwnProperty(key)) {\n continue;\n }\n\n defineLazyProp(result, key, () => {\n let itemKey = fullKey ? `${ fullKey }.${ key }` : `${ key }`;\n // $FlowFixMe\n let 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\n\nexport function copyProp(source : Object, target : Object, name : string, def : mixed) {\n if (source.hasOwnProperty(name)) {\n let descriptor = Object.getOwnPropertyDescriptor(source, name);\n // $FlowFixMe\n Object.defineProperty(target, name, descriptor);\n\n } else {\n target[name] = def;\n }\n}\n\ntype RegexResultType = {\n text : string,\n groups : Array,\n start : number,\n end : number,\n length : number,\n replace : (text : string) => string\n};\n\nexport function regex(pattern : string | RegExp, string : string, start : number = 0) : ?RegexResultType {\n\n if (typeof pattern === 'string') {\n // eslint-disable-next-line security/detect-non-literal-regexp\n pattern = new RegExp(pattern);\n }\n\n let result = string.slice(start).match(pattern);\n\n if (!result) {\n return;\n }\n\n // $FlowFixMe\n let index : number = result.index;\n let 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\n if (!regmatch) {\n return '';\n }\n\n return `${ regmatch.slice(0, start + index) }${ text }${ regmatch.slice(index + regmatch.length) }`;\n }\n };\n}\n\nexport function regexAll(pattern : string | RegExp, string : string) : Array {\n\n let matches = [];\n let start = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let 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(method : (...args : Array) => T, time : number = 100) : (...args : Array) => void {\n\n let timeout;\n\n return function debounceWrapper() {\n clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n return method.apply(this, arguments);\n }, time);\n };\n}\n\nexport function isRegex(item : mixed) : boolean {\n return Object.prototype.toString.call(item) === '[object RegExp]';\n}\n\ntype FunctionProxy = (method : T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoize : FunctionProxy<*> = (method : (arg : any) => R) : ((...args : Array) => R) => {\n\n let 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) => ZalgoPromise> = (T) => T;\n\n// eslint-disable-next-line flowtype/no-weak-types\nexport let weakMapMemoizePromise : FunctionPromiseProxy<*, *> = (method : (arg : any) => ZalgoPromise) : ((...args : Array) => ZalgoPromise) => {\n\n let 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(obj : O, key : string, getter : () => T) : 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) => void,\n all : () => ZalgoPromise\n|};\n\nexport function cleanup(obj : Object) : CleanupType {\n\n const tasks = [];\n let cleaned = false;\n\n return {\n set(name : string, item : T) : T {\n if (!cleaned) {\n obj[name] = item;\n this.register(() => {\n delete obj[name];\n });\n }\n return item;\n },\n\n register(method : Function) {\n if (cleaned) {\n method();\n } else {\n tasks.push(once(method));\n }\n },\n\n all() : ZalgoPromise {\n const results = [];\n cleaned = true;\n\n while (tasks.length) {\n const task = tasks.pop();\n results.push(task());\n }\n\n return ZalgoPromise.all(results).then(noop);\n }\n };\n}\n\nexport function tryCatch(fn : () => T) : {| 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\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","/* @flow */\n/* eslint max-lines: off */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { linkFrameWindow, isWindowClosed,\n type SameDomainWindowType, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\n\nimport { inlineMemoize, noop, stringify, capitalizeFirstLetter,\n once, extend, safeInterval, uniqueID } from './util';\nimport { isDevice } from './device';\nimport { KEY_CODES } from './constants';\nimport type { CancelableType } from './types';\n\ntype ElementRefType = string | HTMLElement;\n\nexport function isDocumentReady() : boolean {\n return Boolean(document.body) && document.readyState === 'complete';\n}\n\nexport function urlEncode(str : string) : string {\n return str.replace(/\\?/g, '%3F').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\\+/g, '%2B');\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\nexport function waitForDocumentReady() : ZalgoPromise {\n return inlineMemoize(waitForDocumentReady, () : ZalgoPromise => {\n return new ZalgoPromise(resolve => {\n\n if (isDocumentReady()) {\n return resolve();\n }\n\n let interval = setInterval(() => {\n if (isDocumentReady()) {\n clearInterval(interval);\n return resolve();\n }\n }, 10);\n });\n });\n}\n\nexport function waitForDocumentBody() : ZalgoPromise {\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\nexport function parseQuery(queryString : string) : Object {\n return inlineMemoize(parseQuery, () : Object => {\n let 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 }, [ 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\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 function formatQuery(obj : { [ string ] : string } = {}) : string {\n\n return Object.keys(obj).filter(key => {\n return typeof obj[key] === 'string';\n }).map(key => {\n return `${ urlEncode(key) }=${ urlEncode(obj[key]) }`;\n }).join('&');\n}\n\nexport function extendQuery(originalQuery : string, props : { [ string ] : string } = {}) : string {\n\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(url : string, options : { query? : { [string] : string }, hash? : { [string] : string } } = {}) : string {\n\n let query = options.query || {};\n let 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 let queryString = extendQuery(originalQuery, query);\n let 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(url : string, win : CrossDomainWindowType = window) : 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 let 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(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function enablePerformance() : boolean {\n return inlineMemoize(enablePerformance, () : boolean => {\n /* eslint-disable compat/compat */\n return Boolean(\n window.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() - (performance.timing.connectEnd - performance.timing.navigationStart)) > 0\n );\n /* eslint-enable compat/compat */\n });\n}\n\nexport function getPageRenderTime() : ZalgoPromise {\n return waitForDocumentReady().then(() => {\n\n if (!enablePerformance()) {\n return;\n }\n\n let timing = window.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.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');\n}\n\nexport function querySelectorAll(selector : string, doc : HTMLElement = window.document) : Array {\n return Array.prototype.slice.call(doc.querySelectorAll(selector));\n}\n\nexport function onClick(element : HTMLElement, handler : (Event) => void) {\n element.addEventListener('touchstart', noop);\n element.addEventListener('click', handler);\n element.addEventListener('keypress', (event : Event) => {\n // $FlowFixMe\n if (event.keyCode === KEY_CODES.ENTER) {\n return handler(event);\n }\n });\n}\n\nexport function getScript({ host = window.location.host, path } : { host? : string, path : string }) : ?HTMLScriptElement {\n return inlineMemoize(getScript, () : ?HTMLScriptElement => {\n\n let url = `${ host }${ path }`;\n let scripts = Array.prototype.slice.call(document.getElementsByTagName('script'));\n\n for (let script of scripts) {\n if (!script.src) {\n continue;\n }\n\n let src = script.src.replace(/^https?:\\/\\//, '').split('?')[0];\n\n if (src === url) {\n return script;\n }\n }\n }, [ path ]);\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 let value = Math.random().toString();\n window.localStorage.setItem('__test__localStorage__', value);\n let 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() : Array<{ country? : string, lang : string }> {\n let nav = window.navigator;\n\n let locales = nav.languages\n ? Array.prototype.slice.apply(nav.languages)\n : [];\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.map(locale => {\n\n if (locale && locale.match(/^[a-z]{2}[-_][A-Z]{2}$/)) {\n let [ 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\n\nexport function appendChild(container : HTMLElement, child : HTMLElement | Text) {\n container.appendChild(child);\n}\n\nexport function isElement(element : mixed) : boolean {\n\n if (element instanceof window.Element) {\n return true;\n }\n\n if (element !== null && typeof element === 'object' && element.nodeType === 1 && typeof element.style === 'object' && typeof element.ownerDocument === 'object') {\n return true;\n }\n\n return false;\n}\n\nexport function getElementSafe(id : ElementRefType, doc : Document | HTMLElement = document) : ?HTMLElement {\n\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(id : ElementRefType, doc : Document | HTMLElement = document) : HTMLElement {\n\n let 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\n let name = stringify(id);\n let el = getElementSafe(id);\n\n if (el) {\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n\n let interval = setInterval(() => {\n\n el = getElementSafe(id);\n\n if (el) {\n clearInterval(interval);\n return resolve(el);\n }\n\n if (isDocumentReady()) {\n clearInterval(interval);\n return reject(new Error(`Document is ready and element ${ name } does not exist`));\n }\n }, 10);\n });\n}\n\nexport function PopupOpenError(message : string) {\n this.message = message;\n}\n\nPopupOpenError.prototype = Object.create(Error.prototype);\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|};\n\nexport function popup(url : string, options? : PopupOptions) : CrossDomainWindowType {\n\n // $FlowFixMe\n options = options || {};\n\n let { 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 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 let name = options.name || '';\n delete options.name;\n\n // eslint-disable-next-line array-callback-return\n let params = Object.keys(options).map(key => {\n // $FlowFixMe\n if (options[key]) {\n return `${ key }=${ stringify(options[key]) }`;\n }\n }).filter(Boolean).join(',');\n\n let win;\n\n try {\n win = window.open(url, name, params, true);\n } catch (err) {\n throw new PopupOpenError(`Can not open popup window - ${ err.stack || err.message }`);\n }\n\n if (isWindowClosed(win)) {\n let err = new PopupOpenError(`Can not open popup window - blocked`);\n throw err;\n }\n\n window.addEventListener('unload', () => win.close());\n\n return win;\n}\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(html) }); document.close();`;\n } catch (err2) {\n // pass\n }\n }\n}\n\nexport function writeElementToWindow(win : SameDomainWindowType, el : HTMLElement) {\n\n let tag = el.tagName.toLowerCase();\n\n if (tag !== 'html') {\n throw new Error(`Expected element to be html, got ${ tag }`);\n }\n\n let documentElement = win.document.documentElement;\n\n while (documentElement.children && documentElement.children.length) {\n documentElement.removeChild(documentElement.children[0]);\n }\n\n while (el.children.length) {\n documentElement.appendChild(el.children[0]);\n }\n}\n\nexport function setStyle(el : HTMLElement, styleText : string, doc : Document = window.document) {\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? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string\n};\n\nlet awaitFrameLoadPromises : WeakMap>;\n\nexport function awaitFrameLoad(frame : HTMLIFrameElement) : ZalgoPromise {\n awaitFrameLoadPromises = awaitFrameLoadPromises || new WeakMap();\n\n if (awaitFrameLoadPromises.has(frame)) {\n let promise = awaitFrameLoadPromises.get(frame);\n if (promise) {\n return promise;\n }\n }\n\n let 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(frame : HTMLIFrameElement) : ZalgoPromise {\n return awaitFrameLoad(frame).then(loadedFrame => {\n\n if (!loadedFrame.contentWindow) {\n throw new Error(`Could not find window in iframe`);\n }\n\n return loadedFrame.contentWindow;\n });\n}\n\nexport function createElement(tag : string = 'div', options : ElementOptionsType = {}, container : ?HTMLElement) : HTMLElement {\n\n tag = tag.toLowerCase();\n let 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 (let 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(`Iframe html can not be written unless container provided and iframe in DOM`);\n }\n\n // $FlowFixMe\n writeToWindow(element.contentWindow, options.html);\n\n } else {\n element.innerHTML = options.html;\n }\n }\n\n return element;\n}\n\n\nexport type IframeElementOptionsType = {\n style? : { [ string ] : string },\n class? : ?Array,\n attributes? : { [ string ] : string },\n styleSheet? : ?string,\n html? : ?string,\n url? : ?string\n};\n\nexport function iframe(options : IframeElementOptionsType = {}, container : ?HTMLElement) : HTMLIFrameElement {\n\n let attributes = options.attributes || {};\n let style = options.style || {};\n\n let frame = createElement('iframe', {\n attributes: {\n allowTransparency: 'true',\n ...attributes\n },\n style: {\n backgroundColor: 'transparent',\n border: 'none',\n ...style\n },\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 let 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(obj : HTMLElement, event : string, handler : (event : Event) => void) : CancelableType {\n obj.addEventListener(event, handler);\n return {\n cancel() {\n obj.removeEventListener(event, handler);\n }\n };\n}\n\nexport function bindEvents(element : HTMLElement, eventNames : Array, handler : (event : Event) => void) : CancelableType {\n\n handler = once(handler);\n\n for (let eventName of eventNames) {\n element.addEventListener(eventName, handler);\n }\n\n return {\n cancel: once(() => {\n for (let eventName of eventNames) {\n element.removeEventListener(eventName, handler);\n }\n })\n };\n}\n\nconst VENDOR_PREFIXES = [ 'webkit', 'moz', 'ms', 'o' ];\n\nexport function setVendorCSS(element : HTMLElement, name : string, value : string) {\n\n // $FlowFixMe\n element.style[name] = value;\n\n let capitalizedName = capitalizeFirstLetter(name);\n\n for (let prefix of VENDOR_PREFIXES) {\n // $FlowFixMe\n element.style[`${ prefix }${ capitalizedName }`] = value;\n }\n}\n\nconst ANIMATION_START_EVENTS = [ 'animationstart', 'webkitAnimationStart', 'oAnimationStart', 'MSAnimationStart' ];\nconst ANIMATION_END_EVENTS = [ 'animationend', 'webkitAnimationEnd', 'oAnimationEnd', 'MSAnimationEnd' ];\n\nexport function animate(element : ElementRefType, name : string, clean : (Function) => void, timeout : number = 1000) : ZalgoPromise {\n return new ZalgoPromise((resolve, reject) => {\n\n let el = getElement(element);\n\n if (!el) {\n return resolve();\n }\n\n let hasStarted = false;\n\n let startTimeout;\n let endTimeout;\n let startEvent;\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\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\n // $FlowFixMe\n if (event.target !== el || event.animationName !== name) {\n return;\n }\n\n cleanUp();\n\n // $FlowFixMe\n if (typeof event.animationName === 'string' && event.animationName !== name) {\n return reject(`Expected animation name to be ${ name }, found ${ event.animationName }`);\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\nconst STYLE = {\n\n DISPLAY: {\n NONE: 'none',\n BLOCK: 'block'\n },\n\n VISIBILITY: {\n VISIBLE: 'visible',\n HIDDEN: 'hidden'\n },\n\n IMPORTANT: 'important'\n};\n\nexport function makeElementVisible(element : HTMLElement) {\n element.style.setProperty('visibility', '');\n}\n\nexport function makeElementInvisible(element : HTMLElement) {\n element.style.setProperty('visibility', STYLE.VISIBILITY.HIDDEN, STYLE.IMPORTANT);\n}\n\n\nexport function showElement(element : HTMLElement) {\n element.style.setProperty('display', '');\n}\n\nexport function hideElement(element : HTMLElement) {\n element.style.setProperty('display', STYLE.DISPLAY.NONE, STYLE.IMPORTANT);\n}\n\nexport function destroyElement(element : HTMLElement) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\nexport function showAndAnimate(element : HTMLElement, name : string, clean : (Function) => void) : ZalgoPromise {\n let animation = animate(element, name, clean);\n showElement(element);\n return animation;\n}\n\nexport function animateAndHide(element : HTMLElement, name : string, clean : (Function) => void) : 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 (!el || !el.parentNode) {\n return true;\n }\n return false;\n}\n\nexport function watchElementForClose(element : HTMLElement, handler : () => mixed) : CancelableType {\n handler = once(handler);\n\n let interval;\n\n if (isElementClosed(element)) {\n handler();\n } else {\n interval = safeInterval(() => {\n if (isElementClosed(element)) {\n interval.cancel();\n handler();\n }\n }, 50);\n }\n\n return {\n cancel() {\n if (interval) {\n interval.cancel();\n }\n }\n };\n}\n\nexport function fixScripts(el : HTMLElement, doc : Document = window.document) {\n for (let script of querySelectorAll('script', el)) {\n let parentNode = script.parentNode;\n\n if (!parentNode) {\n continue;\n }\n\n let 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(el : HTMLElement, handler : ({ width : number, height : number }) => void, { width = true, height = true, interval = 100, win = window } : OnResizeOptions = {}) : {} {\n let currentWidth = el.offsetWidth;\n let currentHeight = el.offsetHeight;\n\n handler({ width: currentWidth, height: currentHeight });\n\n let check = () => {\n let newWidth = el.offsetWidth;\n let newHeight = el.offsetHeight;\n\n if ((width && newWidth !== currentWidth) || (height && newHeight !== currentHeight)) {\n handler({ width: newWidth, height: newHeight });\n }\n\n currentWidth = newWidth;\n currentHeight = newHeight;\n };\n\n let observer;\n let timeout;\n\n if (typeof win.ResizeObserver !== 'undefined') {\n observer = new win.ResizeObserver(check);\n observer.observe(el);\n\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 win.addEventListener('resize', check);\n } else {\n let loop = () => {\n check();\n timeout = setTimeout(loop, interval);\n };\n loop();\n }\n\n return {\n cancel: () => {\n observer.disconnect();\n window.removeEventListener('resize', check);\n clearTimeout(timeout);\n }\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 let testWeakMap = new WeakMap();\n let testKey = {};\n let 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","/* @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\n if (typeof val === 'number') {\n return val;\n }\n\n let 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\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\nexport const BRIDGE_TIMEOUT = 5000;\nexport const CHILD_WINDOW_TIMEOUT = 5000;\n\nexport const ACK_TIMEOUT = 2000;\nexport const ACK_TIMEOUT_KNOWN = 10000;\nexport const RES_TIMEOUT = __TEST__ ? 2000 : -1;\nexport const RESPONSE_CYCLE_TIME = 500;\n","/* @flow */\n\nexport const MESSAGE_TYPE = {\n REQUEST: ('postrobot_message_request' : 'postrobot_message_request'),\n RESPONSE: ('postrobot_message_response' : 'postrobot_message_response'),\n ACK: ('postrobot_message_ack' : 'postrobot_message_ack')\n};\n\nexport const MESSAGE_ACK = {\n SUCCESS: ('success' : 'success'),\n ERROR: ('error' : 'error')\n};\n\nexport const MESSAGE_NAME = {\n METHOD: ('postrobot_method' : 'postrobot_method'),\n HELLO: ('postrobot_hello' : 'postrobot_hello'),\n OPEN_TUNNEL: ('postrobot_open_tunnel' : 'postrobot_open_tunnel')\n};\n\nexport const SEND_STRATEGY = {\n POST_MESSAGE: ('postrobot_post_message' : 'postrobot_post_message'),\n BRIDGE: ('postrobot_bridge' : 'postrobot_bridge'),\n GLOBAL: ('postrobot_global' : 'postrobot_global')\n};\n\nexport const BRIDGE_NAME_PREFIX = '__postrobot_bridge__';\nexport const POSTROBOT_PROXY = '__postrobot_proxy__';\n\nexport const WILDCARD = '*';\n\nexport const SERIALIZATION_TYPE = {\n CROSS_DOMAIN_ZALGO_PROMISE: ('cross_domain_zalgo_promise' : 'cross_domain_zalgo_promise'),\n CROSS_DOMAIN_FUNCTION: ('cross_domain_function' : 'cross_domain_function'),\n CROSS_DOMAIN_WINDOW: ('cross_domain_window' : 'cross_domain_window')\n};\n","/* @flow */\n\nimport { type CrossDomainWindowType, type SameDomainWindowType } from 'cross-domain-utils/src';\nimport { WeakMap } from 'cross-domain-safe-weakmap/src';\nimport { getOrSet } from 'belter/src';\n\nexport function getGlobal(win : SameDomainWindowType = window) : Object {\n if (win !== window) {\n return win[__POST_ROBOT__.__GLOBAL_KEY__];\n }\n const global : Object = win[__POST_ROBOT__.__GLOBAL_KEY__] = win[__POST_ROBOT__.__GLOBAL_KEY__] || {};\n return global;\n}\n\nexport function deleteGlobal() {\n delete window[__POST_ROBOT__.__GLOBAL_KEY__];\n}\n\ntype ObjectGetter = () => Object;\nconst getObj : ObjectGetter = () => ({});\n\ntype GetOrSet = ((string, () => T) => T) & ((string, () => void) => void);\n\ntype GlobalStore = {|\n get : ((string, T) => T) & ((string, void) => T | void),\n set : (string, T) => T,\n has : (string) => boolean,\n del : (string) => void,\n getOrSet : GetOrSet,\n reset : () => void,\n keys : () => $ReadOnlyArray\n|};\n\n// $FlowFixMe\nexport function globalStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : GlobalStore {\n return getOrSet(getGlobal(), key, () => {\n let store = defStore();\n\n return {\n has: (storeKey) => {\n return store.hasOwnProperty(storeKey);\n },\n get: (storeKey, defVal) => {\n // $FlowFixMe\n return store.hasOwnProperty(storeKey) ? store[storeKey] : defVal;\n },\n set: (storeKey, val) => {\n store[storeKey] = val;\n return val;\n },\n del: (storeKey) => {\n delete store[storeKey];\n },\n getOrSet: (storeKey, getter) => {\n // $FlowFixMe\n return getOrSet(store, storeKey, getter);\n },\n reset: () => {\n store = defStore();\n },\n keys: () => {\n return Object.keys(store);\n }\n };\n });\n}\n\nexport class WildCard {}\n\nexport function getWildcard() : WildCard {\n const global = getGlobal();\n global.WINDOW_WILDCARD = global.WINDOW_WILDCARD || new WildCard();\n return global.WINDOW_WILDCARD;\n}\n\ntype WindowStore = {|\n get : ((CrossDomainWindowType | WildCard, T) => T) & ((CrossDomainWindowType | WildCard, void) => T | void),\n set : (CrossDomainWindowType | WildCard, T) => T,\n has : (CrossDomainWindowType | WildCard) => boolean,\n del : (CrossDomainWindowType | WildCard) => void,\n getOrSet : (CrossDomainWindowType | WildCard, () => T) => T\n|};\n\n// $FlowFixMe\nexport function windowStore(key? : string = 'store', defStore? : ObjectGetter = getObj) : WindowStore {\n return globalStore('windowStore').getOrSet(key, () => {\n const winStore = new WeakMap();\n\n const getStore = (win : CrossDomainWindowType | WildCard) : ObjectGetter => {\n return winStore.getOrSet(win, defStore);\n };\n \n return {\n has: (win) => {\n const store = getStore(win);\n return store.hasOwnProperty(key);\n },\n get: (win, defVal) => {\n const store = getStore(win);\n // $FlowFixMe\n return store.hasOwnProperty(key) ? store[key] : defVal;\n },\n set: (win, val) => {\n const store = getStore(win);\n store[key] = val;\n return val;\n },\n del: (win) => {\n const store = getStore(win);\n delete store[key];\n },\n getOrSet: (win, getter) => {\n const store = getStore(win);\n return getOrSet(store, key, getter);\n }\n };\n });\n}\n","/* @flow */\n\nimport { getAncestor, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nfunction getInstanceID() : string {\n return globalStore('instance').getOrSet('instanceID', uniqueID);\n}\n\nfunction getHelloPromise(win : CrossDomainWindowType) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n const helloPromises = windowStore('helloPromises');\n return helloPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nfunction listenForHello({ on } : { on : OnType }) : CancelableType {\n return on(MESSAGE_NAME.HELLO, { domain: WILDCARD }, ({ source, origin }) => {\n getHelloPromise(source).resolve({ win: source, domain: origin });\n return { instanceID: getInstanceID() };\n });\n}\n\nexport function sayHello(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise<{ win : CrossDomainWindowType, domain : string, instanceID : string }> {\n return send(win, MESSAGE_NAME.HELLO, { instanceID: getInstanceID() }, { domain: WILDCARD, timeout: -1 })\n .then(({ origin, data: { instanceID } }) => {\n getHelloPromise(win).resolve({ win, domain: origin });\n return { win, domain: origin, instanceID };\n });\n}\n\nexport function getWindowInstanceID(win : CrossDomainWindowType, { send } : { send : SendType }) : ZalgoPromise {\n return windowStore('windowInstanceIDPromises').getOrSet(win, () => {\n return sayHello(win, { send }).then(({ instanceID }) => instanceID);\n });\n}\n\nexport function initHello({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('helloListener', () => {\n const listener = listenForHello({ on });\n\n const parent = getAncestor();\n if (parent) {\n sayHello(parent, { send }).catch(noop);\n }\n\n return listener;\n });\n}\n\nexport function awaitWindowHello(win : CrossDomainWindowType, timeout : number = 5000, name : string = 'Window') : ZalgoPromise<{ win : CrossDomainWindowType, domain : string }> {\n let promise = getHelloPromise(win);\n\n if (timeout !== -1) {\n promise = promise.timeout(timeout, new Error(`${ name } did not load after ${ timeout }ms`));\n }\n\n return promise;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { windowStore } from '../global';\n\nexport function markWindowKnown(win : CrossDomainWindowType) {\n const knownWindows = windowStore('knownWindows');\n knownWindows.set(win, true);\n}\n\nexport function isWindowKnown(win : CrossDomainWindowType) : boolean {\n const knownWindows = windowStore('knownWindows');\n return knownWindows.get(win, false);\n}\n","/* @flow */\n\nexport const TYPE = {\n FUNCTION: ('function' : 'function'),\n ERROR: ('error' : 'error'),\n PROMISE: ('promise' : 'promise'),\n REGEX: ('regex' : 'regex'),\n DATE: ('date' : 'date'),\n ARRAY: ('array' : 'array'),\n OBJECT: ('object' : 'object'),\n STRING: ('string' : 'string'),\n NUMBER: ('number' : 'number'),\n BOOLEAN: ('boolean' : 'boolean'),\n NULL: ('null' : 'null'),\n UNDEFINED: ('undefined' : 'undefined')\n};\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { CustomSerializedType } from './types';\n\nexport function isSerializedType(item : mixed) : boolean {\n return (typeof item === 'object' && item !== null && typeof item.__type__ === 'string');\n}\n\nexport function determineType(val : mixed) : $Values | void {\n if (typeof val === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n if (val === null) {\n return TYPE.NULL;\n }\n\n if (Array.isArray(val)) {\n return TYPE.ARRAY;\n }\n\n if (typeof val === 'function') {\n return TYPE.FUNCTION;\n }\n\n if (typeof val === 'object') {\n\n if (val instanceof Error) {\n return TYPE.ERROR;\n }\n\n if (typeof val.then === 'function') {\n return TYPE.PROMISE;\n }\n\n if (Object.prototype.toString.call(val) === '[object RegExp]') {\n return TYPE.REGEX;\n }\n\n if (Object.prototype.toString.call(val) === '[object Date]') {\n return TYPE.DATE;\n }\n\n return TYPE.OBJECT;\n }\n\n if (typeof val === 'string') {\n return TYPE.STRING;\n }\n\n if (typeof val === 'number') {\n return TYPE.NUMBER;\n }\n\n if (typeof val === 'boolean') {\n return TYPE.BOOLEAN;\n }\n}\n\nexport function serializeType(type : T, val : V) : CustomSerializedType {\n return {\n __type__: type,\n __val__: val\n };\n}\n","/* @flow */\n\nimport { TYPE } from './constants';\nimport type { Thenable, CustomSerializedType, NativeSerializedType } from './types';\nimport { determineType, isSerializedType } from './common';\nimport {\n serializeFunction,\n serializeError, type SerializedError,\n serializePromise,\n serializeRegex, type SerializedRegex,\n serializeDate, type SerializedDate,\n serializeArray,\n serializeObject,\n serializeString,\n serializeNumber,\n serializeBoolean,\n serializeNull\n} from './serializers';\n\ntype NativeSerializer> = (value : V, key : string) => NativeSerializedType;\ntype CustomSerializer = (value : V, key : string) => CustomSerializedType;\ntype PrimitiveSerializer = (value : V, key : string) => S;\ntype CustomOrPrimitiveSerializer = CustomSerializer | PrimitiveSerializer;\ntype NativeOrCustomOrPrimitiveSerializer = NativeSerializer | CustomOrPrimitiveSerializer;\n\ntype Serializers = {|\n function? : CustomOrPrimitiveSerializer,\n error? : NativeOrCustomOrPrimitiveSerializer,\n promise? : CustomOrPrimitiveSerializer,\n regex? : NativeOrCustomOrPrimitiveSerializer,\n date? : NativeOrCustomOrPrimitiveSerializer,\n array? : CustomOrPrimitiveSerializer<$ReadOnlyArray, typeof TYPE.ARRAY>,\n object? : CustomOrPrimitiveSerializer,\n string? : CustomOrPrimitiveSerializer,\n number? : CustomOrPrimitiveSerializer,\n boolean? : CustomOrPrimitiveSerializer,\n null? : CustomOrPrimitiveSerializer\n|};\n\nconst SERIALIZER : Serializers = {\n [ TYPE.FUNCTION ]: serializeFunction,\n [ TYPE.ERROR ]: serializeError,\n [ TYPE.PROMISE ]: serializePromise,\n [ TYPE.REGEX ]: serializeRegex,\n [ TYPE.DATE ]: serializeDate,\n [ TYPE.ARRAY ]: serializeArray,\n [ TYPE.OBJECT ]: serializeObject,\n [ TYPE.STRING ]: serializeString,\n [ TYPE.NUMBER ]: serializeNumber,\n [ TYPE.BOOLEAN ]: serializeBoolean,\n [ TYPE.NULL ]: serializeNull\n};\n\n// $FlowFixMe\nconst defaultSerializers : Serializers = {};\n\nexport function serialize(obj : T, serializers : Serializers = defaultSerializers) : string {\n\n function replacer(key) : ?mixed {\n const val = this[key];\n\n if (isSerializedType(this)) {\n return val;\n }\n \n const type = determineType(val);\n\n if (!type) {\n return val;\n }\n\n // $FlowFixMe\n const serializer = serializers[type] || SERIALIZER[type];\n\n if (!serializer) {\n return val;\n }\n\n return serializer(val, key);\n }\n\n const result = JSON.stringify(obj, replacer);\n\n if (typeof result === 'undefined') {\n return TYPE.UNDEFINED;\n }\n\n return result;\n}\n","/* @flow */\n\nexport type SerializedFunction = void;\n\nexport function serializeFunction() : SerializedFunction {\n // pass\n}\n\nexport function deserializeFunction() {\n throw new Error(`Function serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedError = {|\n message : string,\n stack : string,\n code : string | number | void\n|};\n\n// $FlowFixMe\nexport function serializeError({ message, stack, code } : Error) : NativeSerializedType {\n return serializeType(TYPE.ERROR, { message, stack, code });\n}\n\nexport function deserializeError({ message, stack, code } : SerializedError) : Error {\n const error = new Error(message);\n // $FlowFixMe\n error.code = code;\n error.stack = `${ stack }\\n\\n${ error.stack }`;\n return error;\n}\n","/* @flow */\n\nexport type SerializedPromise = void;\n\nexport function serializePromise() : SerializedPromise {\n // pass\n}\n\nexport function deserializePromise() {\n throw new Error(`Promise serialization is not implemented; nothing to deserialize`);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedRegex = string;\n\nexport function serializeRegex(val : RegExp) : NativeSerializedType {\n return serializeType(TYPE.REGEX, val.source);\n}\n\nexport function deserializeRegex(val : string) : RegExp {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(val);\n}\n","/* @flow */\n\nimport { serializeType } from '../common';\nimport { TYPE } from '../constants';\nimport type { NativeSerializedType } from '../types';\n\nexport type SerializedDate = string;\n\nexport function serializeDate(val : Date) : NativeSerializedType {\n return serializeType(TYPE.DATE, val.toJSON());\n}\n\nexport function deserializeDate(val : string) : Date {\n return new Date(val);\n}\n","/* @flow */\n\nexport type SerializedArray = $ReadOnlyArray;\n\nexport function serializeArray(val : $ReadOnlyArray) : SerializedArray {\n return val;\n}\n\nexport function deserializeArray(val : SerializedArray) : $ReadOnlyArray {\n return val;\n}\n","/* @flow */\n\nexport type SerializedObject = Object;\n\nexport function serializeObject(val : Object) : SerializedObject {\n return val;\n}\n\nexport function deserializeObject(val : SerializedObject) : Object {\n return val;\n}\n","/* @flow */\n\nexport type SerializedString = string;\n\nexport function serializeString(val : string) : SerializedString {\n return val;\n}\n\nexport function deserializeString(val : SerializedString) : string {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNumber = number;\n\nexport function serializeNumber(val : number) : SerializedNumber {\n return val;\n}\n\nexport function deserializeNumber(val : SerializedNumber) : number {\n return val;\n}\n","/* @flow */\n\nexport type SerializedBoolean = boolean;\n\nexport function serializeBoolean(val : boolean) : SerializedBoolean {\n return val;\n}\n\nexport function deserializeBoolean(val : SerializedBoolean) : boolean {\n return val;\n}\n","/* @flow */\n\nexport type SerializedNull = null;\n\nexport function serializeNull(val : null) : SerializedNull {\n return val;\n}\n\nexport function deserializeNull(val : SerializedNull) : null {\n return val;\n}\n","/* @flow */\n\nimport type { Thenable } from './types';\nimport { TYPE } from './constants';\nimport { determineType, isSerializedType } from './common';\nimport {\n deserializeFunction,\n deserializeError, type SerializedError,\n deserializePromise,\n deserializeRegex, type SerializedRegex,\n deserializeDate, type SerializedDate,\n deserializeArray,\n deserializeObject,\n deserializeString,\n deserializeNumber,\n deserializeBoolean,\n deserializeNull\n} from './serializers';\n\ntype Deserializer = (serializedValue : S, key : string) => V;\ntype PrimitiveDeserializer = (serializedValue : S, key : string) => V;\n\ntype Deserializers = {\n function? : Deserializer,\n error? : Deserializer,\n promise? : Deserializer,\n regex? : Deserializer,\n date? : Deserializer,\n array? : PrimitiveDeserializer<$ReadOnlyArray>,\n object? : PrimitiveDeserializer,\n string? : PrimitiveDeserializer,\n number? : PrimitiveDeserializer,\n boolean? : PrimitiveDeserializer,\n null? : PrimitiveDeserializer,\n [string] : Deserializer\n};\n\n// $FlowFixMe\nconst DESERIALIZER : Deserializers = {\n [ TYPE.FUNCTION ]: deserializeFunction,\n [ TYPE.ERROR ]: deserializeError,\n [ TYPE.PROMISE ]: deserializePromise,\n [ TYPE.REGEX ]: deserializeRegex,\n [ TYPE.DATE ]: deserializeDate,\n [ TYPE.ARRAY ]: deserializeArray,\n [ TYPE.OBJECT ]: deserializeObject,\n [ TYPE.STRING ]: deserializeString,\n [ TYPE.NUMBER ]: deserializeNumber,\n [ TYPE.BOOLEAN ]: deserializeBoolean,\n [ TYPE.NULL ]: deserializeNull\n};\n\n// $FlowFixMe\nconst defaultDeserializers : Deserializers = {};\n\nexport function deserialize(str : string, deserializers : Deserializers = defaultDeserializers) : T {\n if (str === TYPE.UNDEFINED) {\n // $FlowFixMe\n return;\n }\n\n function replacer(key, val) : ?mixed {\n if (isSerializedType(this)) {\n return val;\n }\n\n let type;\n let value;\n\n if (isSerializedType(val)) {\n type = val.__type__;\n value = val.__val__;\n } else {\n type = determineType(val);\n value = val;\n }\n\n if (!type) {\n return value;\n }\n\n // $FlowFixMe\n const deserializer = deserializers[type] || DESERIALIZER[type];\n\n if (!deserializer) {\n return value;\n }\n\n return deserializer(value, key);\n }\n\n return JSON.parse(str, replacer);\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, isSameDomain, isOpener, isSameTopWindow, matchDomain, getUserAgent, getDomainFromUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { BRIDGE_NAME_PREFIX } from '../conf';\nimport { windowStore } from '../global';\n\nexport function needsBridgeForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForWin(win : CrossDomainWindowType) : boolean {\n\n if (!isSameTopWindow(window, win)) {\n return true;\n }\n\n return false;\n}\n\nexport function needsBridgeForDomain(domain : ?string, win : ?CrossDomainWindowType) : boolean {\n\n if (domain) {\n if (getDomain() !== getDomainFromUrl(domain)) {\n return true;\n }\n } else if (win) {\n if (!isSameDomain(win)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function needsBridge({ win, domain } : { win? : CrossDomainWindowType, domain? : string }) : boolean {\n\n if (!needsBridgeForBrowser()) {\n return false;\n }\n\n if (domain && !needsBridgeForDomain(domain, win)) {\n return false;\n }\n\n if (win && !needsBridgeForWin(win)) {\n return false;\n }\n\n return true;\n}\n\nexport function getBridgeName(domain : string) : string {\n\n domain = domain || getDomainFromUrl(domain);\n\n const sanitizedDomain = domain.replace(/[^a-zA-Z0-9]+/g, '_');\n\n const id = `${ BRIDGE_NAME_PREFIX }_${ sanitizedDomain }`;\n\n return id;\n}\n\nexport function isBridge() : boolean {\n return Boolean(window.name && window.name === getBridgeName(getDomain()));\n}\n\nexport const documentBodyReady = new ZalgoPromise(resolve => {\n\n if (window.document && window.document.body) {\n return resolve(window.document.body);\n }\n\n const interval = setInterval(() => {\n if (window.document && window.document.body) {\n clearInterval(interval);\n return resolve(window.document.body);\n }\n }, 10);\n});\n\nexport function registerRemoteWindow(win : CrossDomainWindowType) {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n remoteWindowPromises.getOrSet(win, () => new ZalgoPromise());\n}\n\nexport function findRemoteWindow(win : CrossDomainWindowType) : ZalgoPromise<(remoteWin : CrossDomainWindowType, message : string, remoteDomain : string) => void> {\n const remoteWindowPromises = windowStore('remoteWindowPromises');\n const remoteWinPromise = remoteWindowPromises.get(win);\n\n if (!remoteWinPromise) {\n throw new Error(`Remote window promise not found`);\n }\n\n return remoteWinPromise;\n}\n\nexport function registerRemoteSendMessage(win : CrossDomainWindowType, domain : string, sendMessage : (message : string) => void) {\n const sendMessageWrapper = (remoteWin : CrossDomainWindowType, remoteDomain : string, message : string) => {\n if (remoteWin !== win) {\n throw new Error(`Remote window does not match window`);\n }\n\n if (!matchDomain(remoteDomain, domain)) {\n throw new Error(`Remote domain ${ remoteDomain } does not match domain ${ domain }`);\n }\n\n sendMessage.fireAndForget(message);\n };\n\n findRemoteWindow(win).resolve(sendMessageWrapper);\n}\n\nexport function rejectRemoteSendMessage(win : CrossDomainWindowType, err : Error) {\n findRemoteWindow(win).reject(err).catch(noop);\n}\n\nexport function sendBridgeMessage(win : CrossDomainWindowType, domain : string, message : string) : ZalgoPromise {\n\n const messagingChild = isOpener(window, win);\n const messagingParent = isOpener(win, window);\n\n if (!messagingChild && !messagingParent) {\n throw new Error(`Can only send messages to and from parent and popup windows`);\n }\n\n return findRemoteWindow(win).then(sendMessage => {\n return sendMessage(win, domain, message);\n });\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { getDomain, getFrameByName, isWindowClosed, getDomainFromUrl, normalizeMockUrl, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport { BRIDGE_TIMEOUT, MESSAGE_NAME } from '../conf';\nimport { awaitWindowHello } from '../lib';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';\n\nexport function listenForOpenTunnel({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n const popupWindowsByName = globalStore('popupWindowsByName');\n\n on(MESSAGE_NAME.OPEN_TUNNEL, ({ source, origin, data }) => {\n const bridgePromise = globalStore('bridges').get(origin);\n\n if (!bridgePromise) {\n throw new Error(`Can not find bridge promise for domain ${ origin }`);\n }\n\n return bridgePromise.then(bridge => {\n\n // $FlowFixMe\n if (source !== bridge) {\n // $FlowFixMe\n throw new Error(`Message source does not matched registered bridge for domain ${ origin }`);\n }\n\n if (!data.name) {\n throw new Error(`Register window expected to be passed window name`);\n }\n\n if (!data.sendMessage) {\n throw new Error(`Register window expected to be passed sendMessage method`);\n }\n\n if (!popupWindowsByName.has(data.name)) {\n throw new Error(`Window with name ${ data.name } does not exist, or was not opened by this window`);\n }\n\n // $FlowFixMe\n if (!popupWindowsByName.get(data.name).domain) {\n throw new Error(`We do not have a registered domain for window ${ data.name }`);\n }\n\n // $FlowFixMe\n if (popupWindowsByName.get(data.name).domain !== origin) {\n // $FlowFixMe\n throw new Error(`Message origin ${ origin } does not matched registered window origin ${ popupWindowsByName.get(data.name).domain }`);\n }\n\n // $FlowFixMe\n registerRemoteSendMessage(popupWindowsByName.get(data.name).win, origin, data.sendMessage);\n\n return {\n sendMessage(message) {\n\n if (!window || window.closed) {\n return;\n }\n\n const winDetails = popupWindowsByName.get(data.name);\n\n if (!winDetails) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: winDetails.domain,\n source: winDetails.win\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n };\n });\n });\n}\n\nfunction openBridgeFrame(name : string, url : string) : HTMLIFrameElement {\n\n const iframe = document.createElement(`iframe`);\n\n iframe.setAttribute(`name`, name);\n iframe.setAttribute(`id`, name);\n\n iframe.setAttribute(`style`, `display: none; margin: 0; padding: 0; border: 0px none; overflow: hidden;`);\n iframe.setAttribute(`frameborder`, `0`);\n iframe.setAttribute(`border`, `0`);\n iframe.setAttribute(`scrolling`, `no`);\n iframe.setAttribute(`allowTransparency`, `true`);\n\n iframe.setAttribute(`tabindex`, `-1`);\n iframe.setAttribute(`hidden`, `true`);\n iframe.setAttribute(`title`, ``);\n iframe.setAttribute(`role`, `presentation`);\n\n iframe.src = url;\n\n return iframe;\n}\n\nexport function hasBridge(url : string, domain : string) : boolean {\n const bridges = globalStore('bridges');\n return bridges.has(domain || getDomainFromUrl(url));\n}\n\nexport function openBridge(url : string, domain : string) : ZalgoPromise {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n \n domain = domain || getDomainFromUrl(url);\n \n return bridges.getOrSet(domain, () => ZalgoPromise.try(() => {\n\n if (getDomain() === domain) {\n throw new Error(`Can not open bridge on the same domain as current domain: ${ domain }`);\n }\n\n const name = getBridgeName(domain);\n const frame = getFrameByName(window, name);\n\n if (frame) {\n throw new Error(`Frame with name ${ name } already exists on page`);\n }\n\n const iframe = openBridgeFrame(name, url);\n bridgeFrames.set(domain, iframe);\n\n return documentBodyReady.then(body => {\n\n body.appendChild(iframe);\n const bridge = iframe.contentWindow;\n\n return new ZalgoPromise((resolve, reject) => {\n\n iframe.addEventListener('load', resolve);\n iframe.addEventListener('error', reject);\n\n }).then(() => {\n\n return awaitWindowHello(bridge, BRIDGE_TIMEOUT, `Bridge ${ url }`);\n\n }).then(() => {\n\n return bridge;\n });\n });\n }));\n}\n\ntype WinDetails = {|\n win : CrossDomainWindowType,\n domain? : ?string,\n name? : ?string\n|};\n\nexport function linkWindow({ win, name, domain } : WinDetails) : WinDetails {\n const popupWindowsByName = globalStore('popupWindowsByName');\n const popupWindowsByWin = windowStore('popupWindowsByWin');\n\n for (const winName of popupWindowsByName.keys()) {\n // $FlowFixMe\n if (isWindowClosed(popupWindowsByName.get(winName).win)) {\n popupWindowsByName.del(winName);\n }\n }\n\n const details : WinDetails = popupWindowsByWin.getOrSet(win, () => {\n if (!name) {\n return { win };\n }\n \n return popupWindowsByName.getOrSet(name, () => {\n return { win, name };\n });\n });\n\n if (details.win && details.win !== win) {\n throw new Error(`Different window already linked for window: ${ name || 'undefined' }`);\n }\n\n if (name) {\n if (details.name && details.name !== name) {\n throw new Error(`Different window already linked for name ${ name }: ${ details.name }`);\n }\n\n details.name = name;\n popupWindowsByName.set(name, details);\n }\n\n if (domain) {\n details.domain = domain;\n registerRemoteWindow(win);\n }\n\n popupWindowsByWin.set(win, details);\n \n return details;\n}\n\nexport function linkUrl(win : CrossDomainWindowType, url : string) {\n linkWindow({ win, domain: getDomainFromUrl(url) });\n}\n\nexport function listenForWindowOpen() {\n const windowOpen = window.open;\n\n window.open = function windowOpenWrapper(url : string, name : string, options : string, last : mixed) : mixed {\n const win = windowOpen.call(this, normalizeMockUrl(url), name, options, last);\n \n if (!win) {\n return win;\n }\n \n linkWindow({ win, name, domain: url ? getDomainFromUrl(url) : null });\n \n return win;\n };\n}\n\nexport function destroyBridges() {\n const bridges = globalStore('bridges');\n const bridgeFrames = globalStore('bridgeFrames');\n\n for (const domain of bridgeFrames.keys()) {\n const frame = bridgeFrames.get(domain);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n }\n bridgeFrames.reset();\n bridges.reset();\n}\n","/* @flow */\n\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { listenForWindowOpen, listenForOpenTunnel } from './parent';\nimport { setupOpenTunnelToParent } from './bridge';\nimport { openTunnelToOpener } from './child';\n\nexport function setupBridge({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) {\n listenForWindowOpen();\n listenForOpenTunnel({ on, send, receiveMessage });\n setupOpenTunnelToParent({ on, send });\n openTunnelToOpener({ on, send, receiveMessage });\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { getParent, isWindowClosed, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop, uniqueID } from 'belter/src';\n\nimport { MESSAGE_NAME, WILDCARD } from '../conf';\nimport { getGlobal, globalStore } from '../global';\nimport type { SendType, ResponseMessageEvent } from '../types';\n\nfunction cleanTunnelWindows() {\n const tunnelWindows = globalStore('tunnelWindows');\n\n for (const key of tunnelWindows.keys()) {\n const tunnelWindow = tunnelWindows[key];\n\n try {\n noop(tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(key);\n continue;\n }\n\n if (isWindowClosed(tunnelWindow.source)) {\n tunnelWindows.del(key);\n }\n }\n}\n\ntype TunnelWindowDataType = {|\n name : string,\n source : CrossDomainWindowType,\n canary : () => void,\n sendMessage : (message : string) => void\n|};\n\nfunction addTunnelWindow({ name, source, canary, sendMessage } : TunnelWindowDataType) : string {\n cleanTunnelWindows();\n const id = uniqueID();\n const tunnelWindows = globalStore('tunnelWindows');\n tunnelWindows.set(id, { name, source, canary, sendMessage });\n return id;\n}\n\nexport function setupOpenTunnelToParent({ send } : { send : SendType }) {\n getGlobal(window).openTunnelToParent = function openTunnelToParent({ name, source, canary, sendMessage } : TunnelWindowDataType) : ZalgoPromise {\n\n const tunnelWindows = globalStore('tunnelWindows');\n const parentWindow = getParent(window);\n \n if (!parentWindow) {\n throw new Error(`No parent window found to open tunnel to`);\n }\n \n const id = addTunnelWindow({ name, source, canary, sendMessage });\n \n return send(parentWindow, MESSAGE_NAME.OPEN_TUNNEL, {\n \n name,\n \n sendMessage() {\n \n const tunnelWindow = tunnelWindows.get(id);\n \n try {\n // IE gets antsy if you try to even reference a closed window\n noop(tunnelWindow && tunnelWindow.source);\n } catch (err) {\n tunnelWindows.del(id);\n return;\n }\n \n if (!tunnelWindow || !tunnelWindow.source || isWindowClosed(tunnelWindow.source)) {\n return;\n }\n \n try {\n tunnelWindow.canary();\n } catch (err) {\n return;\n }\n \n tunnelWindow.sendMessage.apply(this, arguments);\n }\n \n }, { domain: WILDCARD });\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isSameDomain, getOpener, getDomain, getFrameByName, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { getGlobal, windowStore } from '../global';\nimport type { OnType, SendType, ReceiveMessageType } from '../types';\n\nimport { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';\n\nfunction awaitRemoteBridgeForWindow (win : CrossDomainWindowType) : ZalgoPromise {\n return windowStore('remoteBridgeAwaiters').getOrSet(win, () => {\n return ZalgoPromise.try(() => {\n const frame = getFrameByName(win, getBridgeName(getDomain()));\n\n if (!frame) {\n return;\n }\n\n // $FlowFixMe\n if (isSameDomain(frame) && isSameDomain(frame) && getGlobal(frame)) {\n return frame;\n }\n\n return new ZalgoPromise(resolve => {\n\n let interval;\n let timeout; // eslint-disable-line prefer-const\n\n interval = setInterval(() => { // eslint-disable-line prefer-const\n // $FlowFixMe\n if (frame && isSameDomain(frame) && getGlobal(frame)) {\n clearInterval(interval);\n clearTimeout(timeout);\n return resolve(frame);\n }\n }, 100);\n\n timeout = setTimeout(() => {\n clearInterval(interval);\n return resolve();\n }, 2000);\n });\n });\n });\n}\n\nexport function openTunnelToOpener({ on, send, receiveMessage } : { on : OnType, send : SendType, receiveMessage : ReceiveMessageType }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const opener = getOpener(window);\n \n if (!opener || !needsBridge({ win: opener })) {\n return;\n }\n\n registerRemoteWindow(opener);\n\n return awaitRemoteBridgeForWindow(opener).then(bridge => {\n\n if (!bridge) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));\n }\n\n if (!window.name) {\n return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: window does not have a name`));\n }\n\n // $FlowFixMe\n return getGlobal(bridge).openTunnelToParent({\n\n name: window.name,\n\n source: window,\n\n canary() {\n // pass\n },\n\n sendMessage(message) {\n\n try {\n noop(window);\n } catch (err) {\n return;\n }\n\n if (!window || window.closed) {\n return;\n }\n\n try {\n receiveMessage({\n data: message,\n origin: this.origin,\n source: this.source\n }, { on, send });\n } catch (err) {\n ZalgoPromise.reject(err);\n }\n }\n\n }).then(({ source, origin, data }) => {\n\n if (source !== opener) {\n throw new Error(`Source does not match opener`);\n }\n\n registerRemoteSendMessage(source, origin, data.sendMessage);\n\n }).catch(err => {\n\n rejectRemoteSendMessage(opener, err);\n throw err;\n });\n });\n });\n}\n","/* @flow */\n\nimport { isSameDomain, isWindowClosed, type CrossDomainWindowType,\n type DomainMatcher, getOpener, WINDOW_TYPE, isWindow, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, memoizePromise } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport { getWindowInstanceID } from '../lib';\nimport { linkWindow } from '../bridge';\nimport type { OnType, SendType } from '../types';\n\nfunction cleanupProxyWindows() {\n const idToProxyWindow = globalStore('idToProxyWindow');\n for (const id of idToProxyWindow.keys()) {\n // $FlowFixMe\n if (idToProxyWindow.get(id).shouldClean()) {\n idToProxyWindow.del(id);\n }\n }\n}\n\ntype SerializedProxyWindow = {|\n id : string,\n type : $Values,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n isClosed : () => ZalgoPromise,\n setLocation : (string) => ZalgoPromise,\n getName : () => ZalgoPromise,\n setName : (string) => ZalgoPromise,\n getInstanceID : () => ZalgoPromise\n|};\n\nfunction getSerializedWindow(id : string, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedProxyWindow {\n let windowName;\n \n return {\n id,\n type: getOpener(win) ? WINDOW_TYPE.POPUP : WINDOW_TYPE.IFRAME,\n getInstanceID: memoizePromise(() => getWindowInstanceID(win, { send })),\n close: () => ZalgoPromise.try(() => {\n win.close();\n }),\n getName: () => ZalgoPromise.try(() => {\n if (isWindowClosed(win)) {\n return;\n }\n\n return windowName;\n }),\n focus: () => ZalgoPromise.try(() => {\n win.focus();\n }),\n isClosed: () => ZalgoPromise.try(() => {\n return isWindowClosed(win);\n }),\n setLocation: (href) => ZalgoPromise.try(() => {\n if (isSameDomain(win)) {\n try {\n if (win.location && typeof win.location.replace === 'function') {\n // $FlowFixMe\n win.location.replace(href);\n return;\n }\n } catch (err) {\n // pass\n }\n }\n\n win.location = href;\n }),\n setName: (name) => ZalgoPromise.try(() => {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n linkWindow({ win, name });\n }\n\n win = assertSameDomain(win);\n\n win.name = name;\n\n if (win.frameElement) {\n win.frameElement.setAttribute('name', name);\n }\n\n windowName = name;\n })\n };\n}\n\nexport class ProxyWindow {\n\n isProxyWindow : true = true\n serializedWindow : SerializedProxyWindow\n actualWindow : CrossDomainWindowType\n actualWindowPromise : ZalgoPromise\n send : SendType\n name : string\n\n constructor(serializedWindow : SerializedProxyWindow, actualWindow? : ?CrossDomainWindowType, { send } : { send : SendType }) {\n this.serializedWindow = serializedWindow;\n this.actualWindowPromise = new ZalgoPromise();\n this.send = send;\n if (actualWindow) {\n this.setWindow(actualWindow);\n }\n }\n\n getType() : $Values {\n return this.serializedWindow.type;\n }\n\n isPopup() : boolean {\n return this.getType() === WINDOW_TYPE.POPUP;\n }\n\n isIframe() : boolean {\n return this.getType() === WINDOW_TYPE.IFRAME;\n }\n\n setLocation(href : string) : ZalgoPromise {\n return this.serializedWindow.setLocation(href).then(() => this);\n }\n\n setName(name : string) : ZalgoPromise {\n return this.serializedWindow.setName(name).then(() => this);\n }\n\n close() : ZalgoPromise {\n return this.serializedWindow.close().then(() => this);\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return ZalgoPromise.all([\n this.isPopup() && this.serializedWindow.getName().then(name => {\n if (name) {\n window.open('', name);\n }\n }),\n this.serializedWindow.focus()\n ]);\n }).then(() => this);\n }\n\n isClosed() : ZalgoPromise {\n return this.serializedWindow.isClosed();\n }\n\n getWindow() : ?CrossDomainWindowType {\n return this.actualWindow;\n }\n\n setWindow(win : CrossDomainWindowType) {\n this.actualWindow = win;\n this.serializedWindow = getSerializedWindow(this.serializedWindow.id, win, { send: this.send });\n this.actualWindowPromise.resolve(win);\n }\n\n awaitWindow() : ZalgoPromise {\n return this.actualWindowPromise;\n }\n\n matchWindow(win : CrossDomainWindowType) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.actualWindow) {\n return win === this.actualWindow;\n }\n \n return ZalgoPromise.all([\n this.getInstanceID(),\n getWindowInstanceID(win, { send: this.send })\n ]).then(([ proxyInstanceID, knownWindowInstanceID ]) => {\n const match = proxyInstanceID === knownWindowInstanceID;\n\n if (match) {\n this.setWindow(win);\n }\n\n return match;\n });\n });\n }\n\n unwrap() : CrossDomainWindowType | ProxyWindow {\n return this.actualWindow || this;\n }\n\n getInstanceID() : ZalgoPromise {\n return this.serializedWindow.getInstanceID();\n }\n\n serialize() : SerializedProxyWindow {\n return this.serializedWindow;\n }\n\n shouldClean() : boolean {\n return this.actualWindow && isWindowClosed(this.actualWindow);\n }\n\n static unwrap(win : CrossDomainWindowType | ProxyWindow) : CrossDomainWindowType | ProxyWindow {\n return ProxyWindow.isProxyWindow(win)\n // $FlowFixMe\n ? win.unwrap()\n : win;\n }\n\n static serialize(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : SerializedProxyWindow {\n cleanupProxyWindows();\n\n return ProxyWindow.toProxyWindow(win, { send }).serialize();\n }\n\n static deserialize(serializedWindow : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n \n return globalStore('idToProxyWindow').getOrSet(serializedWindow.id, () => {\n return new ProxyWindow(serializedWindow, null, { on, send });\n });\n }\n\n static isProxyWindow(obj : CrossDomainWindowType | ProxyWindow) : boolean {\n // $FlowFixMe\n return Boolean(obj && !isWindow(obj) && obj.isProxyWindow);\n }\n\n static toProxyWindow(win : CrossDomainWindowType | ProxyWindow, { send } : { send : SendType }) : ProxyWindow {\n cleanupProxyWindows();\n\n if (ProxyWindow.isProxyWindow(win)) {\n // $FlowFixMe\n return win;\n }\n\n // $FlowFixMe\n const realWin : CrossDomainWindowType = win;\n\n // $FlowFixMe\n return windowStore('winToProxyWindow').getOrSet(win, () => {\n const id = uniqueID();\n const serializedWindow = getSerializedWindow(id, realWin, { send });\n const proxyWindow = new ProxyWindow(serializedWindow, realWin, { send });\n\n return globalStore('idToProxyWindow').set(id, proxyWindow);\n });\n }\n}\n\nexport type SerializedWindow = CustomSerializedType;\n\nexport function serializeWindow(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, win : CrossDomainWindowType, { send } : { send : SendType }) : SerializedWindow {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW, ProxyWindow.serialize(win, { send }));\n}\n\nexport function deserializeWindow(source : CrossDomainWindowType | ProxyWindow, origin : string, win : SerializedProxyWindow, { on, send } : { on : OnType, send : SendType }) : ProxyWindow {\n return ProxyWindow.deserialize(win, { on, send });\n}\n","/* @flow */\n\nimport { matchDomain, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { uniqueID, isRegex } from 'belter/src';\nimport { serializeType, type CustomSerializedType } from 'universal-serialize/src';\n\nimport { MESSAGE_NAME, WILDCARD, SERIALIZATION_TYPE } from '../conf';\nimport { windowStore, globalStore } from '../global';\nimport type { OnType, SendType, CancelableType } from '../types';\n\nimport { ProxyWindow } from './window';\n\ntype StoredMethod = {|\n name : string,\n domain : DomainMatcher,\n val : Function,\n source : CrossDomainWindowType | ProxyWindow\n|};\n\nfunction addMethod(id : string, val : Function, name : string, source : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher) {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n \n if (ProxyWindow.isProxyWindow(source)) {\n proxyWindowMethods.set(id, { val, name, domain, source });\n } else {\n proxyWindowMethods.del(id);\n // $FlowFixMe\n const methods = methodStore.getOrSet(source, () => ({}));\n methods[id] = { domain, name, val, source };\n }\n}\n\nfunction lookupMethod(source : CrossDomainWindowType, id : string) : ?StoredMethod {\n const methodStore = windowStore('methodStore');\n const proxyWindowMethods = globalStore('proxyWindowMethods');\n const methods = methodStore.getOrSet(source, () => ({}));\n return methods[id] || proxyWindowMethods.get(id);\n}\n\nfunction listenForFunctionCalls({ on } : { on : OnType }) : CancelableType {\n return globalStore('builtinListeners').getOrSet('functionCalls', () => {\n return on(MESSAGE_NAME.METHOD, { domain: WILDCARD }, ({ source, origin, data } : { source : CrossDomainWindowType, origin : string, data : Object }) => {\n const { id, name } = data;\n\n const meth = lookupMethod(source, id);\n \n if (!meth) {\n throw new Error(`Could not find method '${ data.name }' with id: ${ data.id } in ${ getDomain(window) }`);\n }\n\n const { source: methodSource, domain, val } = meth;\n \n return ZalgoPromise.try(() => {\n if (!matchDomain(domain, origin)) {\n // $FlowFixMe\n throw new Error(`Method '${ data.name }' domain ${ JSON.stringify(isRegex(meth.domain) ? meth.domain.source : meth.domain) } does not match origin ${ origin } in ${ getDomain(window) }`);\n }\n \n if (ProxyWindow.isProxyWindow(methodSource)) {\n // $FlowFixMe\n return methodSource.matchWindow(source).then(match => {\n if (!match) {\n throw new Error(`Method call '${ data.name }' failed - proxy window does not match source in ${ getDomain(window) }`);\n }\n });\n }\n }).then(() => {\n return val.apply({ source, origin }, data.args);\n }, err => {\n return ZalgoPromise.try(() => {\n if (val.onError) {\n return val.onError(err);\n }\n }).then(() => {\n // $FlowFixMe\n if (err.stack) {\n // $FlowFixMe\n err.stack = `Remote call to ${ name }()\\n\\n${ err.stack }`;\n }\n\n throw err;\n });\n }).then(result => {\n return { result, id, name };\n });\n });\n });\n}\n\nexport type SerializedFunction = CustomSerializedType;\n\nexport function serializeFunction(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : () => ZalgoPromise | T, key : string, { on } : { on : OnType }) : SerializedFunction {\n listenForFunctionCalls({ on });\n \n const id = val.__id__ || uniqueID();\n destination = ProxyWindow.unwrap(destination);\n const name = val.__name__ || val.name || key;\n\n if (ProxyWindow.isProxyWindow(destination)) {\n addMethod(id, val, name, destination, domain);\n\n // $FlowFixMe\n destination.awaitWindow().then(win => {\n addMethod(id, val, name, win, domain);\n });\n } else {\n addMethod(id, val, name, destination, domain);\n }\n\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION, { id, name });\n}\n\nexport function deserializeFunction(source : CrossDomainWindowType | ProxyWindow, origin : string, { id, name } : { id : string, name : string }, { send } : { send : SendType }) : (...args : $ReadOnlyArray) => ZalgoPromise {\n const getDeserializedFunction = (opts? : Object = {}) => {\n function crossDomainFunctionWrapper() : ZalgoPromise {\n let originalStack;\n \n if (__DEBUG__) {\n originalStack = (new Error(`Original call to ${ name }():`)).stack;\n }\n \n return ProxyWindow.toProxyWindow(source, { send }).awaitWindow().then(win => {\n const meth = lookupMethod(win, id);\n \n if (meth && meth.val !== crossDomainFunctionWrapper) {\n return meth.val.apply({ source: window, origin: getDomain() }, arguments);\n } else {\n // $FlowFixMe\n const options = { domain: origin, fireAndForget: opts.fireAndForget };\n const args = Array.prototype.slice.call(arguments);\n\n return send(win, MESSAGE_NAME.METHOD, { id, name, args }, options)\n .then(res => {\n if (!opts.fireAndForget) {\n return res.data.result;\n }\n });\n }\n \n }).catch(err => {\n // $FlowFixMe\n if (__DEBUG__ && originalStack && err.stack) {\n // $FlowFixMe\n err.stack = `${ err.stack }\\n\\n${ originalStack }`;\n }\n throw err;\n });\n }\n\n crossDomainFunctionWrapper.__name__ = name;\n crossDomainFunctionWrapper.__origin__ = origin;\n crossDomainFunctionWrapper.__source__ = source;\n crossDomainFunctionWrapper.__id__ = id;\n\n crossDomainFunctionWrapper.origin = origin;\n\n return crossDomainFunctionWrapper;\n };\n\n const crossDomainFunctionWrapper = getDeserializedFunction();\n crossDomainFunctionWrapper.fireAndForget = getDeserializedFunction({ fireAndForget: true });\n\n return crossDomainFunctionWrapper;\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, isWindow, type DomainMatcher } from 'cross-domain-utils/src';\nimport { TYPE, serialize, deserialize, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, deserializeFunction, type SerializedFunction } from './function';\nimport { serializePromise, deserializePromise, type SerializedPromise } from './promise';\nimport { serializeWindow, deserializeWindow, type SerializedWindow, ProxyWindow } from './window';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T, { on, send } : { on : OnType, send : SendType }) : string {\n return serialize(obj, {\n [ TYPE.PROMISE ]: (val : Thenable, key : string) : SerializedPromise => serializePromise(destination, domain, val, key, { on, send }),\n [ TYPE.FUNCTION ]: (val : Function, key : string) : SerializedFunction => serializeFunction(destination, domain, val, key, { on, send }),\n [ TYPE.OBJECT ]: (val : CrossDomainWindowType) : Object | SerializedWindow => {\n return (isWindow(val) || ProxyWindow.isProxyWindow(val)) ? serializeWindow(destination, domain, val, { on, send }) : val;\n }\n });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string, { on, send } : { on : OnType, send : SendType }) : T {\n return deserialize(message, {\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE ]: (serializedPromise) => deserializePromise(source, origin, serializedPromise),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_FUNCTION ]: (serializedFunction) => deserializeFunction(source, origin, serializedFunction, { on, send }),\n [ SERIALIZATION_TYPE.CROSS_DOMAIN_WINDOW ]: (serializedWindow) => deserializeWindow(source, origin, serializedWindow, { on, send })\n });\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { serializeType, type CustomSerializedType, type Thenable } from 'universal-serialize/src';\n\nimport { SERIALIZATION_TYPE } from '../conf';\nimport type { OnType, SendType } from '../types';\n\nimport { serializeFunction, type SerializedFunction } from './function';\nimport { ProxyWindow } from './window';\n\nexport type SerializedPromise = CustomSerializedType;\n\nexport function serializePromise(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, val : Thenable, key : string, { on, send } : { on : OnType, send : SendType }) : SerializedPromise {\n return serializeType(SERIALIZATION_TYPE.CROSS_DOMAIN_ZALGO_PROMISE, {\n then: serializeFunction(destination, domain, (resolve, reject) => val.then(resolve, reject), key, { on, send })\n });\n}\n\nexport function deserializePromise(source : CrossDomainWindowType | ProxyWindow, origin : string, { then } : { then : Function }) : ZalgoPromise {\n return new ZalgoPromise(then);\n}\n","/* @flow */\n\nimport { isSameDomain, isSameTopWindow, isActuallySameDomain, getActualDomain,\n getDomain, type CrossDomainWindowType, type DomainMatcher, PROTOCOL } from 'cross-domain-utils/src';\n\nimport { SEND_STRATEGY, WILDCARD } from '../../conf';\nimport { needsGlobalMessagingForBrowser } from '../../lib';\nimport { getGlobal } from '../../global';\nimport { sendBridgeMessage, needsBridgeForBrowser, isBridge } from '../../bridge';\n\nexport const SEND_MESSAGE_STRATEGIES = {};\n\nSEND_MESSAGE_STRATEGIES[SEND_STRATEGY.POST_MESSAGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : DomainMatcher) => {\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(window, win) === false) {\n return;\n }\n }\n\n let domains;\n\n if (Array.isArray(domain)) {\n domains = domain;\n } else if (typeof domain === 'string') {\n domains = [ domain ];\n } else {\n domains = [ WILDCARD ];\n }\n\n domains = domains.map(dom => {\n\n if (__TEST__) {\n if (dom.indexOf(PROTOCOL.MOCK) === 0) {\n if (window.location.protocol === PROTOCOL.FILE) {\n return WILDCARD;\n }\n\n if (!isActuallySameDomain(win)) {\n throw new Error(`Attempting to send messsage to mock domain ${ dom }, but window is actually cross-domain`);\n }\n\n // $FlowFixMe\n return getActualDomain(win);\n\n }\n }\n \n if (dom.indexOf(PROTOCOL.FILE) === 0) {\n return WILDCARD;\n }\n\n return dom;\n });\n\n domains.forEach(dom => {\n win.postMessage(serializedMessage, dom);\n });\n};\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n\n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.BRIDGE] = (win : CrossDomainWindowType, serializedMessage : string, domain : string) => {\n\n if (!needsBridgeForBrowser() && !isBridge()) {\n return;\n }\n\n if (isSameDomain(win)) {\n throw new Error(`Post message through bridge disabled between same domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use bridge to communicate between two different windows, not between frames`);\n }\n\n sendBridgeMessage(win, domain, serializedMessage);\n };\n}\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__ || __POST_ROBOT__.__GLOBAL_MESSAGE_SUPPORT__) {\n \n SEND_MESSAGE_STRATEGIES[SEND_STRATEGY.GLOBAL] = (win : CrossDomainWindowType, serializedMessage : string) => {\n\n if (!needsGlobalMessagingForBrowser()) {\n return;\n }\n\n if (!isSameDomain(win)) {\n throw new Error(`Post message through global disabled between different domain windows`);\n }\n\n if (isSameTopWindow(window, win) !== false) {\n throw new Error(`Can only use global to communicate between two different windows, not between frames`);\n }\n\n // $FlowFixMe\n const foreignGlobal = getGlobal(win);\n\n if (!foreignGlobal) {\n throw new Error(`Can not find postRobot global on foreign window`);\n }\n\n foreignGlobal.receiveMessage({\n source: window,\n origin: getDomain(),\n data: serializedMessage\n });\n };\n}\n","/* @flow */\n\nimport { isWindowClosed, getDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, stringifyError } from 'belter/src';\n\nimport { serializeMessage } from '../../serialize';\nimport type { Message } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nimport { SEND_MESSAGE_STRATEGIES } from './strategies';\n\nexport function sendMessage(win : CrossDomainWindowType, domain : DomainMatcher, message : Message, { on, send } : { on : OnType, send : SendType }) {\n if (isWindowClosed(win)) {\n throw new Error('Window is closed');\n }\n \n const serializedMessage = serializeMessage(win, domain, {\n [ __POST_ROBOT__.__GLOBAL_KEY__ ]: {\n id: uniqueID(),\n origin: getDomain(window),\n ...message\n }\n }, { on, send });\n\n const strategies = Object.keys(SEND_MESSAGE_STRATEGIES);\n const errors = [];\n\n for (const strategyName of strategies) {\n try {\n SEND_MESSAGE_STRATEGIES[strategyName](win, serializedMessage, domain);\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length === strategies.length) {\n throw new Error(`All post-robot messaging strategies failed:\\n\\n${ errors.map(stringifyError).join('\\n\\n') }`);\n }\n}\n","/* @flow */\n\nimport { getUserAgent } from 'cross-domain-utils/src';\n\nexport function needsGlobalMessagingForBrowser() : boolean {\n\n if (getUserAgent(window).match(/MSIE|rv:11|trident|edge\\/12|edge\\/13/i)) {\n return true;\n }\n\n return false;\n}\n","/* @flow */\n\nimport { type ZalgoPromise } from 'zalgo-promise/src';\nimport { matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { isRegex, getOrSet } from 'belter/src';\n\nimport { getWildcard, type WildCard, globalStore, windowStore } from '../global';\nimport { WILDCARD } from '../conf';\n\nexport function resetListeners() {\n const responseListeners = globalStore('responseListeners');\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n responseListeners.reset();\n erroredResponseListeners.reset();\n}\n\nconst __DOMAIN_REGEX__ = '__domain_regex__';\n\nexport type RequestListenerType = {|\n handler : ({ source : CrossDomainWindowType, origin : string, data : mixed }) => (mixed | ZalgoPromise),\n handleError : (err : mixed) => void,\n window : ?CrossDomainWindowType,\n name : string,\n domain : DomainMatcher\n|};\n\nexport type ResponseListenerType = {|\n name : string,\n win : CrossDomainWindowType,\n domain : DomainMatcher,\n promise : ZalgoPromise<*>,\n ack? : ?boolean,\n cancelled? : ?boolean\n|};\n\nexport function addResponseListener(hash : string, listener : ResponseListenerType) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.set(hash, listener);\n}\n\nexport function getResponseListener(hash : string) : ?ResponseListenerType {\n const responseListeners = globalStore('responseListeners');\n return responseListeners.get(hash);\n}\n\nexport function deleteResponseListener(hash : string) {\n const responseListeners = globalStore('responseListeners');\n responseListeners.del(hash);\n}\n\nexport function cancelResponseListeners() {\n const responseListeners = globalStore('responseListeners');\n for (const hash of responseListeners.keys()) {\n const listener = responseListeners.get(hash);\n if (listener) {\n listener.cancelled = true;\n }\n responseListeners.del(hash);\n }\n}\n\nexport function markResponseListenerErrored(hash : string) {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n erroredResponseListeners.set(hash, true);\n}\n\nexport function isResponseListenerErrored(hash : string) : boolean {\n const erroredResponseListeners = globalStore('erroredResponseListeners');\n return erroredResponseListeners.has(hash);\n}\n\nexport function getRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?(string | RegExp) }) : ?RequestListenerType {\n const requestListeners = windowStore('requestListeners');\n\n if (win === WILDCARD) {\n win = null;\n }\n\n if (domain === WILDCARD) {\n domain = null;\n }\n\n if (!name) {\n throw new Error(`Name required to get request listener`);\n }\n\n for (const winQualifier of [ win, getWildcard() ]) {\n if (!winQualifier) {\n continue;\n }\n\n const nameListeners = requestListeners.get(winQualifier);\n\n if (!nameListeners) {\n continue;\n }\n\n const domainListeners = nameListeners[name];\n\n if (!domainListeners) {\n continue;\n }\n\n if (domain && typeof domain === 'string') {\n if (domainListeners[domain]) {\n return domainListeners[domain];\n }\n\n if (domainListeners[__DOMAIN_REGEX__]) {\n for (const { regex, listener } of domainListeners[__DOMAIN_REGEX__]) {\n if (matchDomain(regex, domain)) {\n return listener;\n }\n }\n }\n }\n\n if (domainListeners[WILDCARD]) {\n return domainListeners[WILDCARD];\n }\n }\n}\n\nexport function addRequestListener({ name, win, domain } : { name : string, win : ?(CrossDomainWindowType | WildCard), domain : ?DomainMatcher }, listener : RequestListenerType) : { cancel : () => void } {\n const requestListeners = windowStore('requestListeners');\n\n if (!name || typeof name !== 'string') {\n throw new Error(`Name required to add request listener`);\n }\n\n if (Array.isArray(win)) {\n const listenersCollection = [];\n\n for (const item of win) {\n listenersCollection.push(addRequestListener({ name, domain, win: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n if (Array.isArray(domain)) {\n const listenersCollection = [];\n\n for (const item of domain) {\n listenersCollection.push(addRequestListener({ name, win, domain: item }, listener));\n }\n\n return {\n cancel() {\n for (const cancelListener of listenersCollection) {\n cancelListener.cancel();\n }\n }\n };\n }\n\n const existingListener = getRequestListener({ name, win, domain });\n\n if (!win || win === WILDCARD) {\n win = getWildcard();\n }\n\n domain = domain || WILDCARD;\n\n if (existingListener) {\n if (win && domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (win) {\n throw new Error(`Request listener already exists for ${ name } for ${ win === getWildcard() ? 'wildcard' : 'specified' } window`);\n } else if (domain) {\n throw new Error(`Request listener already exists for ${ name } on domain ${ domain.toString() }`);\n } else {\n throw new Error(`Request listener already exists for ${ name }`);\n }\n }\n\n const nameListeners = requestListeners.getOrSet(win, () => ({}));\n // $FlowFixMe\n const domainListeners = getOrSet(nameListeners, name, () => ({}));\n\n const strDomain = domain.toString();\n\n let regexListeners;\n let regexListener;\n\n if (isRegex(domain)) {\n regexListeners = getOrSet(domainListeners, __DOMAIN_REGEX__, () => []);\n regexListener = { regex: domain, listener };\n regexListeners.push(regexListener);\n } else {\n domainListeners[strDomain] = listener;\n }\n\n return {\n cancel() {\n delete domainListeners[strDomain];\n\n if (regexListener) {\n regexListeners.splice(regexListeners.indexOf(regexListener, 1));\n\n if (!regexListeners.length) {\n delete domainListeners[__DOMAIN_REGEX__];\n }\n }\n\n if (!Object.keys(domainListeners).length) {\n // $FlowFixMe\n delete nameListeners[name];\n }\n\n // $FlowFixMe\n if (win && !Object.keys(nameListeners).length) {\n requestListeners.del(win);\n }\n }\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindowClosed, matchDomain, stringifyDomainPattern, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { MESSAGE_TYPE, MESSAGE_ACK, MESSAGE_NAME } from '../../conf';\nimport { sendMessage } from '../send';\nimport { getRequestListener, getResponseListener, deleteResponseListener, isResponseListenerErrored } from '../listeners';\nimport type { RequestMessage, AckResponseMessage, SuccessResponseMessage, ErrorResponseMessage } from '../types';\nimport type { OnType, SendType } from '../../types';\n\nexport const RECEIVE_MESSAGE_TYPES = {\n\n [ MESSAGE_TYPE.REQUEST ](source : CrossDomainWindowType, origin : string, message : RequestMessage, { on, send } : { on : OnType, send : SendType }) : ZalgoPromise {\n\n const options = getRequestListener({ name: message.name, win: source, domain: origin });\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (__DEBUG__) {\n // eslint-disable-next-line no-console\n console.info('receive::req', logName, origin, '\\n\\n', message.data);\n }\n\n function sendResponse(type : $Values, ack? : $Values, response = {}) {\n\n if (message.fireAndForget || isWindowClosed(source)) {\n return;\n }\n\n if (__DEBUG__ && type !== MESSAGE_TYPE.ACK) {\n if (ack === MESSAGE_ACK.SUCCESS) {\n // $FlowFixMe\n console.info('respond::res', logName, origin, '\\n\\n', response.data); // eslint-disable-line no-console\n } else if (ack === MESSAGE_ACK.ERROR) {\n // $FlowFixMe\n console.error('respond::err', logName, origin, '\\n\\n', response.error); // eslint-disable-line no-console\n }\n }\n\n // $FlowFixMe\n sendMessage(source, origin, {\n type,\n ack,\n hash: message.hash,\n name: message.name,\n ...response\n }, { on, send });\n }\n\n return ZalgoPromise.all([\n\n sendResponse(MESSAGE_TYPE.ACK),\n\n ZalgoPromise.try(() => {\n\n if (!options) {\n throw new Error(`No handler found for post message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Request origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n const data = message.data;\n\n return options.handler({ source, origin, data });\n\n }).then(data => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.SUCCESS, { data });\n\n }, error => {\n return sendResponse(MESSAGE_TYPE.RESPONSE, MESSAGE_ACK.ERROR, { error });\n })\n\n ]).then(noop).catch(err => {\n if (options && options.handleError) {\n return options.handleError(err);\n } else {\n throw err;\n }\n });\n },\n\n [ MESSAGE_TYPE.ACK ](source : CrossDomainWindowType, origin : string, message : AckResponseMessage) {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message ack for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Ack origin ${ origin } does not match domain ${ options.domain.toString() }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Ack source does not match registered window`);\n }\n\n options.ack = true;\n },\n\n [ MESSAGE_TYPE.RESPONSE ](source : CrossDomainWindowType, origin : string, message : SuccessResponseMessage | ErrorResponseMessage) : void | ZalgoPromise {\n\n if (isResponseListenerErrored(message.hash)) {\n return;\n }\n\n const options = getResponseListener(message.hash);\n\n if (!options) {\n throw new Error(`No handler found for post message response for message: ${ message.name } from ${ origin } in ${ window.location.protocol }//${ window.location.host }${ window.location.pathname }`);\n }\n\n if (!matchDomain(options.domain, origin)) {\n throw new Error(`Response origin ${ origin } does not match domain ${ stringifyDomainPattern(options.domain) }`);\n }\n\n if (source !== options.win) {\n throw new Error(`Response source does not match registered window`);\n }\n\n deleteResponseListener(message.hash);\n\n const logName = (message.name === MESSAGE_NAME.METHOD && message.data && typeof message.data.name === 'string') ? `${ message.data.name }()` : message.name;\n\n if (message.ack === MESSAGE_ACK.ERROR) {\n if (__DEBUG__) {\n console.error('receive::err', logName, origin, '\\n\\n', message.error); // eslint-disable-line no-console\n }\n\n options.promise.reject(message.error);\n\n } else if (message.ack === MESSAGE_ACK.SUCCESS) {\n if (__DEBUG__) {\n console.info('receive::res', logName, origin, '\\n\\n', message.data); // eslint-disable-line no-console\n }\n\n options.promise.resolve({ source, origin, data: message.data });\n }\n }\n};\n","/* @flow */\n\nimport { isWindowClosed, type CrossDomainWindowType, getDomain, isSameTopWindow, PROTOCOL } from 'cross-domain-utils/src';\nimport { addEventListener, noop } from 'belter/src';\n\nimport { markWindowKnown, needsGlobalMessagingForBrowser } from '../../lib';\nimport { deserializeMessage } from '../../serialize';\nimport { getGlobal, globalStore } from '../../global';\nimport type { OnType, SendType, MessageEvent, CancelableType } from '../../types';\n\nimport { RECEIVE_MESSAGE_TYPES } from './types';\n\nfunction parseMessage(message : string, source : CrossDomainWindowType, origin : string, { on, send } : { on : OnType, send : SendType }) : ?Object {\n let parsedMessage;\n\n try {\n parsedMessage = deserializeMessage(source, origin, message, { on, send });\n } catch (err) {\n return;\n }\n\n if (!parsedMessage) {\n return;\n }\n\n if (typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n parsedMessage = parsedMessage[__POST_ROBOT__.__GLOBAL_KEY__];\n\n if (!parsedMessage || typeof parsedMessage !== 'object' || parsedMessage === null) {\n return;\n }\n\n if (!parsedMessage.type || typeof parsedMessage.type !== 'string') {\n return;\n }\n\n if (!RECEIVE_MESSAGE_TYPES[parsedMessage.type]) {\n return;\n }\n\n return parsedMessage;\n}\n\nexport function receiveMessage(event : MessageEvent, { on, send } : { on : OnType, send : SendType }) {\n const receivedMessages = globalStore('receivedMessages');\n\n if (!window || window.closed) {\n throw new Error(`Message recieved in closed window`);\n }\n\n try {\n if (!event.source) {\n return;\n }\n } catch (err) {\n return;\n }\n\n let { source, origin, data } = event;\n\n if (__TEST__) {\n // $FlowFixMe\n origin = getDomain(source);\n }\n\n const message = parseMessage(data, source, origin, { on, send });\n\n if (!message) {\n return;\n }\n\n markWindowKnown(source);\n\n if (receivedMessages.has(message.id)) {\n return;\n }\n\n receivedMessages.set(message.id, true);\n\n if (isWindowClosed(source) && !message.fireAndForget) {\n return;\n }\n\n if (message.origin.indexOf(PROTOCOL.FILE) === 0) {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n RECEIVE_MESSAGE_TYPES[message.type](source, origin, message, { on, send });\n}\n\nexport function setupGlobalReceiveMessage({ on, send } : { on : OnType, send : SendType }) {\n const global = getGlobal();\n global.receiveMessage = global.receiveMessage || (message => receiveMessage(message, { on, send }));\n}\n\ntype ListenerEvent = {|\n source : CrossDomainWindowType,\n origin : string,\n data : string,\n sourceElement : CrossDomainWindowType,\n originalEvent? : { origin : string }\n|};\n\nexport function messageListener(event : ListenerEvent, { on, send } : { on : OnType, send : SendType }) {\n\n try {\n noop(event.source);\n } catch (err) {\n return;\n }\n\n const source = event.source || event.sourceElement;\n let origin = event.origin || (event.originalEvent && event.originalEvent.origin);\n const data = event.data;\n\n if (origin === 'null') {\n origin = `${ PROTOCOL.FILE }//`;\n }\n\n if (!source) {\n return;\n }\n\n if (!origin) {\n throw new Error(`Post message did not have origin domain`);\n }\n\n if (__TEST__) {\n if (needsGlobalMessagingForBrowser() && isSameTopWindow(source, window) === false) {\n return;\n }\n }\n\n receiveMessage({ source, origin, data }, { on, send });\n}\n\nexport function listenForMessages({ on, send } : { on : OnType, send : SendType }) : CancelableType {\n return globalStore().getOrSet('postMessageListener', () => {\n // $FlowFixMe\n return addEventListener(window, 'message', event => {\n // $FlowFixMe\n messageListener(event, { on, send });\n });\n });\n}\n\nexport function stopListenForMessages() {\n const listener = globalStore().get('postMessageListener');\n if (listener) {\n listener.cancel();\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nimport { addRequestListener, type RequestListenerType } from '../drivers';\nimport { WILDCARD } from '../conf';\nimport type { ServerOptionsType, HandlerType, CancelableType } from '../types';\n\nexport function on(name : string, options : ServerOptionsType | HandlerType, handler : ?HandlerType) : CancelableType {\n\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n if (!handler) {\n throw new Error('Expected handler');\n }\n\n options = options || {};\n options.name = name;\n options.handler = handler || options.handler;\n\n const win = options.window;\n const domain = options.domain;\n\n const listenerOptions : RequestListenerType = {\n handler: options.handler,\n handleError: options.errorHandler || (err => {\n throw err;\n }),\n window: win,\n domain: domain || WILDCARD,\n name\n };\n\n const requestListener = addRequestListener({ name, win, domain }, listenerOptions);\n\n return {\n cancel() {\n requestListener.cancel();\n }\n };\n}\n\nexport function once(name : string, options? : ServerOptionsType | HandlerType, handler? : HandlerType) : ZalgoPromise<{ source : mixed, origin : string, data : Object }> {\n \n // $FlowFixMe\n options = options || {};\n if (typeof options === 'function') {\n handler = options;\n // $FlowFixMe\n options = {};\n }\n\n const promise = new ZalgoPromise();\n let listener; // eslint-disable-line prefer-const\n\n options.errorHandler = (err) => {\n listener.cancel();\n promise.reject(err);\n };\n\n listener = on(name, options, event => {\n listener.cancel();\n promise.resolve(event);\n if (handler) {\n return handler(event);\n }\n });\n\n promise.cancel = listener.cancel;\n return promise;\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isAncestor, isWindowClosed, getDomain, matchDomain, type CrossDomainWindowType, type DomainMatcher } from 'cross-domain-utils/src';\nimport { uniqueID, isRegex, noop, safeInterval, stringify } from 'belter/src';\n\n\nimport { CHILD_WINDOW_TIMEOUT, MESSAGE_TYPE, WILDCARD, MESSAGE_NAME, ACK_TIMEOUT, RES_TIMEOUT, ACK_TIMEOUT_KNOWN, RESPONSE_CYCLE_TIME } from '../conf';\nimport { sendMessage, addResponseListener, deleteResponseListener, markResponseListenerErrored, type ResponseListenerType } from '../drivers';\nimport { awaitWindowHello, sayHello, isWindowKnown } from '../lib';\nimport { windowStore } from '../global';\nimport type { SendType } from '../types';\n\nimport { on } from './on';\n\nfunction validateOptions(name : string, win : CrossDomainWindowType, domain : ?DomainMatcher) {\n if (!name) {\n throw new Error('Expected name');\n }\n\n if (domain) {\n if (typeof domain !== 'string' && !Array.isArray(domain) && !isRegex(domain)) {\n throw new TypeError(`Expected domain to be a string, array, or regex`);\n }\n }\n\n if (isWindowClosed(win)) {\n throw new Error('Target window is closed');\n }\n}\n\nfunction normalizeDomain(win : CrossDomainWindowType, domain : DomainMatcher, childTimeout : number, { send } : { send : SendType }) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (isAncestor(window, win)) {\n return awaitWindowHello(win, childTimeout);\n } else if (isRegex(domain)) {\n // $FlowFixMe\n return sayHello(win, { send });\n } else {\n return { domain };\n }\n // $FlowFixMe\n }).then(({ domain: normalizedDomain }) => {\n\n // $FlowFixMe\n return normalizedDomain;\n });\n}\n\nexport const send : SendType = (win, name, data, options) => {\n\n // $FlowFixMe\n options = options || {};\n let domain = options.domain || WILDCARD;\n const responseTimeout = options.timeout || RES_TIMEOUT;\n const childTimeout = options.timeout || CHILD_WINDOW_TIMEOUT;\n const fireAndForget = options.fireAndForget || false;\n\n // $FlowFixMe\n return ZalgoPromise.try(() => {\n validateOptions(name, win, domain);\n return normalizeDomain(win, domain, childTimeout, { send });\n }).then(targetDomain => {\n\n if (!matchDomain(domain, targetDomain)) {\n throw new Error(`Domain ${ stringify(domain) } does not match ${ stringify(targetDomain) }`);\n }\n\n domain = targetDomain;\n\n const logName = (name === MESSAGE_NAME.METHOD && data && typeof data.name === 'string') ? `${ data.name }()` : name;\n\n if (__DEBUG__) {\n console.info('send::req', logName, domain, '\\n\\n', data); // eslint-disable-line no-console\n }\n\n const promise = new ZalgoPromise();\n const hash = `${ name }_${ uniqueID() }`;\n\n if (!fireAndForget) {\n const responseListener : ResponseListenerType = { name, win, domain, promise };\n addResponseListener(hash, responseListener);\n\n const reqPromises = windowStore('requestPromises').getOrSet(win, () => []);\n reqPromises.push(promise);\n\n promise.catch(() => {\n markResponseListenerErrored(hash);\n deleteResponseListener(hash);\n });\n\n const totalAckTimeout = isWindowKnown(win) ? ACK_TIMEOUT_KNOWN : ACK_TIMEOUT;\n const totalResTimeout = responseTimeout;\n\n let ackTimeout = totalAckTimeout;\n let resTimeout = totalResTimeout;\n \n const interval = safeInterval(() => {\n if (isWindowClosed(win)) {\n return promise.reject(new Error(`Window closed for ${ name } before ${ responseListener.ack ? 'response' : 'ack' }`));\n }\n\n if (responseListener.cancelled) {\n return promise.reject(new Error(`Response listener was cancelled for ${ name }`));\n }\n\n ackTimeout = Math.max(ackTimeout - RESPONSE_CYCLE_TIME, 0);\n if (resTimeout !== -1) {\n resTimeout = Math.max(resTimeout - RESPONSE_CYCLE_TIME, 0);\n }\n\n if (!responseListener.ack && ackTimeout === 0) {\n return promise.reject(new Error(`No ack for postMessage ${ logName } in ${ getDomain() } in ${ totalAckTimeout }ms`));\n\n } else if (resTimeout === 0) {\n return promise.reject(new Error(`No response for postMessage ${ logName } in ${ getDomain() } in ${ totalResTimeout }ms`));\n }\n }, RESPONSE_CYCLE_TIME);\n\n promise.finally(() => {\n interval.cancel();\n reqPromises.splice(reqPromises.indexOf(promise, 1));\n }).catch(noop);\n }\n\n sendMessage(win, domain, {\n type: MESSAGE_TYPE.REQUEST,\n hash,\n name,\n data,\n fireAndForget\n }, { on, send });\n \n return fireAndForget ? promise.resolve() : promise;\n });\n};\n","/* @flow */\n\nimport { setup } from './setup';\nimport { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge, needsBridgeForBrowser, hasBridge,\n needsBridgeForWin, needsBridgeForDomain, destroyBridges } from './bridge';\n\nexport { ZalgoPromise as Promise } from 'zalgo-promise/src';\n\nexport * from './types';\nexport { ProxyWindow } from './serialize';\nexport { setup, destroy, serializeMessage, deserializeMessage, toProxyWindow } from './setup';\nexport { on, once, send } from './public';\nexport { markWindowKnown } from './lib';\nexport { cleanUpWindow } from './clean';\nexport let bridge;\n\nif (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n bridge = { setupBridge, openBridge, linkWindow, linkUrl, isBridge, needsBridge,\n needsBridgeForBrowser, hasBridge, needsBridgeForWin, needsBridgeForDomain, destroyBridges };\n}\n\nif (__POST_ROBOT__.__AUTO_SETUP__) {\n setup();\n}\n","/* @flow */\n\nimport type { CrossDomainWindowType, DomainMatcher } from 'cross-domain-utils/src';\n\nimport { initHello } from './lib';\nimport { listenForMessages, stopListenForMessages, receiveMessage, setupGlobalReceiveMessage, cancelResponseListeners } from './drivers';\nimport { getGlobal, deleteGlobal } from './global';\nimport { on, send } from './public';\nimport { setupBridge } from './bridge';\nimport { serializeMessage as internalSerializeMessage, deserializeMessage as internalDeserializeMessage, ProxyWindow } from './serialize';\n\nexport function serializeMessage(destination : CrossDomainWindowType | ProxyWindow, domain : DomainMatcher, obj : T) : string {\n return internalSerializeMessage(destination, domain, obj, { on, send });\n}\n\nexport function deserializeMessage(source : CrossDomainWindowType | ProxyWindow, origin : string, message : string) : T {\n return internalDeserializeMessage(source, origin, message, { on, send });\n}\n\nexport function toProxyWindow(win : CrossDomainWindowType | ProxyWindow) : ProxyWindow {\n return ProxyWindow.toProxyWindow(win, { send });\n}\n\nexport function setup() {\n if (!getGlobal().initialized) {\n getGlobal().initialized = true;\n \n setupGlobalReceiveMessage({ on, send });\n listenForMessages({ on, send });\n \n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n setupBridge({ on, send, receiveMessage });\n }\n\n initHello({ on, send });\n }\n}\n\nexport function destroy() {\n cancelResponseListeners();\n stopListenForMessages();\n deleteGlobal();\n}\n","/* @flow */\n\nimport { type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { noop } from 'belter/src';\n\nimport { windowStore } from './global';\n\nexport function cleanUpWindow(win : CrossDomainWindowType) {\n const requestPromises = windowStore('requestPromises');\n for (const promise of requestPromises.get(win, [])) {\n promise.reject(new Error(`Window cleaned up before response`)).catch(noop);\n }\n}\n","/* @flow */\n\nimport { isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nexport function getGlobal(win? : CrossDomainWindowType = window) : Object {\n\n if (!isSameDomain(win)) {\n throw new Error(`Can not get global for window on different domain`);\n }\n\n if (!win[__ZOID__.__GLOBAL_KEY__]) {\n win[__ZOID__.__GLOBAL_KEY__] = {};\n }\n\n return win[__ZOID__.__GLOBAL_KEY__];\n}\n\nexport function destroyGlobal() {\n delete window[__ZOID__.__GLOBAL_KEY__];\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\n\nexport type ProxyObject = {|\n get : () => ZalgoPromise\n|};\n\nexport function getProxyObject(obj : T) : ProxyObject {\n return {\n get() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.source && this.source !== window) {\n throw new Error(`Can not call get on proxy object from a remote window`);\n }\n \n return obj;\n });\n }\n };\n}\n","/* @flow */\n\nimport { WINDOW_TYPE } from 'cross-domain-utils/src';\n\nexport const ZOID = `zoid`;\n\nexport const POST_MESSAGE = {\n DELEGATE: `${ ZOID }_delegate`,\n ALLOW_DELEGATE: `${ ZOID }_allow_delegate`\n};\n\nexport const PROP_TYPE = {\n STRING: `string`,\n OBJECT: `object`,\n FUNCTION: `function`,\n BOOLEAN: `boolean`,\n NUMBER: `number`,\n ARRAY: `array`\n};\n\nexport const INITIAL_PROPS = {\n RAW: 'raw',\n UID: 'uid'\n};\n\nexport const WINDOW_REFERENCES = {\n OPENER: `opener`,\n TOP: `top`,\n PARENT: `parent`,\n GLOBAL: `global`\n};\n\nexport const PROP_SERIALIZATION = {\n JSON: ('json' : 'json'),\n DOTIFY: ('dotify' : 'dotify'),\n BASE64: ('base64' : 'base64')\n};\n\nexport const CONTEXT = WINDOW_TYPE;\n\nexport const WILDCARD = '*';\n\nexport const DEFAULT_DIMENSIONS = {\n WIDTH: '300px',\n HEIGHT: '150px'\n};\n\nexport const EVENT = {\n RENDER: 'zoid-render',\n RENDERED: 'zoid-rendered',\n DISPLAY: 'zoid-display',\n ERROR: 'zoid-error',\n CLOSE: 'zoid-close',\n PROPS: 'zoid-props',\n RESIZE: 'zoid-resize'\n};\n","/* @flow */\n\nimport { getDomain, isSameDomain, type CrossDomainWindowType } from 'cross-domain-utils/src';\n\nimport type { Component } from '../component';\nimport type { PropsType, MixedPropDefinitionType } from '../component/props';\n\nimport type { ChildHelpers } from './index';\n\nexport function normalizeChildProp(component : Component

, props : (PropsType

), key : string, value : T, helpers : ChildHelpers

) : ?T {\n\n // $FlowFixMe\n const prop : MixedPropDefinitionType

= component.getPropDefinition(key);\n\n if (!prop) {\n return value;\n }\n\n if (typeof prop.childDecorate === 'function') {\n return prop.childDecorate({ value, ...helpers });\n }\n\n return value;\n}\n\n// eslint-disable-next-line max-params\nexport function normalizeChildProps

(parentComponentWindow : CrossDomainWindowType, component : Component

, props : (PropsType

), origin : string, helpers : ChildHelpers

, isUpdate : boolean = false) : (PropsType

) {\n\n const result = {};\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const prop = component.getPropDefinition(key);\n\n if (prop && prop.sameDomain && (origin !== getDomain(window) || !isSameDomain(parentComponentWindow))) {\n continue;\n }\n\n const value = normalizeChildProp(component, props, key, props[key], helpers);\n\n result[key] = value;\n if (prop && prop.alias && !result[prop.alias]) {\n result[prop.alias] = value;\n }\n }\n\n if (!isUpdate) {\n for (const key of component.getPropNames()) {\n if (!props.hasOwnProperty(key)) {\n result[key] = normalizeChildProp(component, props, key, props[key], helpers);\n }\n }\n }\n\n // $FlowFixMe\n return result;\n}\n","/* @flow */\n\nimport { inlineMemoize, stringifyError, base64decode } from 'belter/src';\n\nimport { ZOID } from '../constants';\nimport type { ChildPayload } from '../parent';\n\nfunction parseChildWindowName(windowName : string) : ChildPayload {\n return inlineMemoize(parseChildWindowName, () => {\n if (!windowName) {\n throw new Error(`No window name`);\n }\n \n const [ , zoidcomp, name, encodedPayload ] = windowName.split('__');\n \n if (zoidcomp !== ZOID) {\n throw new Error(`Window not rendered by zoid - got ${ zoidcomp }`);\n }\n \n if (!name) {\n throw new Error(`Expected component name`);\n }\n \n if (!encodedPayload) {\n throw new Error(`Expected encoded payload`);\n }\n \n try {\n return JSON.parse(base64decode(encodedPayload));\n } catch (err) {\n throw new Error(`Can not decode window name payload: ${ encodedPayload }: ${ stringifyError(err) }`);\n }\n }, [ windowName ]);\n}\n\nexport function getChildPayload() : ?ChildPayload {\n try {\n return parseChildWindowName(window.name);\n } catch (err) {\n // pass\n }\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { isSameDomain, matchDomain, getDomain, getOpener,\n getNthParentFromTop, getAncestor, getAllFramesInWindow,\n type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src';\nimport { markWindowKnown, deserializeMessage } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src';\n\nimport { getGlobal } from '../lib';\nimport { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component } from '../component';\nimport type { PropsType } from '../component/props';\nimport type { WindowRef, PropRef, ParentExportsType } from '../parent';\n\nimport { normalizeChildProps } from './props';\nimport { getChildPayload } from './window';\n\nexport * from './window';\n\nexport type ChildExportsType

= {|\n updateProps : (props : (PropsType

)) => ZalgoPromise,\n close : () => ZalgoPromise\n|};\n\nexport type ChildHelpers

= {|\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n onProps : ((PropsType

) => void) => void,\n getParent : () => CrossDomainWindowType,\n getParentDomain : () => string\n|};\n\n/* Child Component\n ---------------\n\n This is the portion of code which runs inside the frame or popup window containing the component's implementation.\n\n When the component author calls myComponent.attach(), it creates a new instance of ChildComponent, which is then\n responsible for managing the state and messaging back up to the parent, and providing props for the component to\n utilize.\n*/\n\nexport class ChildComponent

{\n\n component : Component

\n props : PropsType

\n context : string\n parent : ParentExportsType

\n parentDomain : string\n parentComponentWindow : CrossDomainWindowType\n\n onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array\n autoResize : { width : boolean, height : boolean, element? : string }\n\n constructor(component : Component

) {\n ZalgoPromise.try(() => {\n this.component = component;\n this.onPropHandlers = [];\n \n const childPayload = getChildPayload();\n\n if (!childPayload) {\n throw new Error(`No child payload found`);\n }\n\n if (childPayload.version !== __ZOID__.__VERSION__) {\n const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`;\n // throw new Error(msg);\n // eslint-disable-next-line no-console\n console.log(msg);\n }\n\n const { parent, domain, exports, context, props } = childPayload;\n\n this.context = context;\n this.parentComponentWindow = this.getParentComponentWindow(parent);\n this.parentDomain = domain;\n this.parent = deserializeMessage(this.parentComponentWindow, domain, exports);\n\n this.checkParentDomain(domain);\n\n const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props);\n this.setProps(initialProps, domain);\n markWindowKnown(this.parentComponentWindow);\n \n this.watchForClose();\n\n return this.parent.init(this.buildExports());\n\n }).then(() => {\n return this.watchForResize();\n\n }).catch(err => {\n this.onError(err);\n });\n }\n\n getHelpers() : ChildHelpers

{\n return {\n focus: () => this.focus(),\n close: () => this.close(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n onProps: (handler) => this.onProps(handler),\n getParent: () => this.parentComponentWindow,\n getParentDomain: () => this.parentDomain\n };\n }\n\n checkParentDomain(domain : string) {\n if (!matchDomain(this.component.allowedParentDomains, domain)) {\n throw new Error(`Can not be rendered by domain: ${ domain }`);\n }\n }\n\n onProps(handler : Function) {\n this.onPropHandlers.push(handler);\n }\n\n getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) {\n let props;\n\n if (type === INITIAL_PROPS.RAW) {\n props = value;\n } else if (type === INITIAL_PROPS.UID) {\n if (!isSameDomain(parentComponentWindow)) {\n throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`);\n }\n\n const global = getGlobal(parentComponentWindow);\n props = assertExists('props', global && global.props[uid]);\n }\n\n if (!props) {\n throw new Error(`Could not find props`);\n }\n\n return deserializeMessage(parentComponentWindow, domain, props);\n }\n\n getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType {\n const { type } = ref;\n \n if (type === WINDOW_REFERENCES.OPENER) {\n return assertExists('opener', getOpener(window));\n \n } else if (type === WINDOW_REFERENCES.PARENT) {\n // $FlowFixMe\n const distance = ref.distance;\n return assertExists('parent', getNthParentFromTop(window, distance));\n\n } else if (type === WINDOW_REFERENCES.GLOBAL) {\n // $FlowFixMe\n const { uid } = ref;\n const ancestor = getAncestor(window);\n\n if (!ancestor) {\n throw new Error(`Can not find ancestor window`);\n }\n\n for (const frame of getAllFramesInWindow(ancestor)) {\n if (isSameDomain(frame)) {\n const global = getGlobal(frame);\n\n if (global && global.windows && global.windows[uid]) {\n return global.windows[uid];\n }\n }\n }\n }\n \n throw new Error(`Unable to find ${ type } parent component window`);\n }\n\n getProps() : PropsType

{\n // $FlowFixMe\n this.props = this.props || {};\n return this.props;\n }\n\n\n setProps(props : PropsType

, origin : string, isUpdate : boolean = false) {\n const helpers = this.getHelpers();\n const existingProps = this.getProps();\n const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate);\n\n extend(existingProps, normalizedProps);\n\n for (const handler of this.onPropHandlers) {\n handler.call(this, existingProps);\n }\n }\n\n watchForClose() {\n window.addEventListener('beforeunload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n window.addEventListener('unload', () => {\n this.parent.checkClose.fireAndForget();\n });\n\n onCloseWindow(this.parentComponentWindow, () => {\n this.destroy();\n });\n }\n\n getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } {\n let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {};\n element = getElementSafe(element);\n return { width, height, element };\n }\n\n watchForResize() : ?ZalgoPromise {\n return waitForDocumentBody().then(() => {\n const { width, height, element } = this.getAutoResize();\n\n if (!element || (!width && !height) || this.context === CONTEXT.POPUP) {\n return;\n }\n\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height });\n });\n }\n\n buildExports() : ChildExportsType

{\n\n const self = this;\n\n return {\n updateProps(props : (PropsType

)) : ZalgoPromise {\n return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true));\n },\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => self.destroy());\n }\n };\n }\n\n resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise {\n return this.parent.resize.fireAndForget({ width, height });\n }\n\n close() : ZalgoPromise {\n return this.parent.close();\n }\n \n destroy() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.close();\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n window.focus();\n });\n }\n\n onError(err : mixed) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.parent && this.parent.onError) {\n return this.parent.onError(err);\n } else {\n throw err;\n }\n });\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { cleanUpWindow, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { assertSameDomain } from 'cross-domain-utils/src';\nimport { iframe, popup, destroyElement, normalizeDimension, watchElementForClose,\n awaitFrameWindow, uniqueID } from 'belter/src';\n\nimport { CONTEXT } from '../constants';\nimport { getProxyObject, type ProxyObject } from '../lib';\n\n\nexport type ContextDriverType = {|\n openOnClick : boolean,\n openFrame? : () => ProxyObject,\n open : (?ProxyObject) => ZalgoPromise,\n openPrerenderFrame? : () => ProxyObject,\n openPrerender : (ProxyWindow, ?ProxyObject) => ZalgoPromise,\n resize? : ({ width : ?number, height : ?number }) => void,\n delegate : $ReadOnlyArray\n|};\n\nexport const RENDER_DRIVERS : { [string] : ContextDriverType } = {};\n\nRENDER_DRIVERS[CONTEXT.IFRAME] = {\n openOnClick: false,\n\n openFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n title: this.component.name,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n\n return proxyFrame.get().then(frame => {\n return awaitFrameWindow(frame).then(win => {\n\n const frameWatcher = watchElementForClose(frame, () => this.close());\n this.clean.register(() => frameWatcher.cancel());\n this.clean.register(() => destroyElement(frame));\n this.clean.register(() => cleanUpWindow(win));\n\n return toProxyWindow(win);\n });\n });\n },\n\n openPrerenderFrame() : ProxyObject {\n return getProxyObject(iframe({\n attributes: {\n name: `__zoid_prerender_frame__${ this.component.name }_${ uniqueID() }__`,\n title: `prerender__${ this.component.name }`,\n ...this.component.attributes.iframe\n }\n }));\n },\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n if (!proxyPrerenderFrame) {\n throw new Error(`Expected proxy frame to be passed`);\n }\n \n return proxyPrerenderFrame.get().then(prerenderFrame => {\n this.clean.register(() => destroyElement(prerenderFrame));\n\n return awaitFrameWindow(prerenderFrame).then(prerenderFrameWindow => {\n return assertSameDomain(prerenderFrameWindow);\n }).then(win => {\n return toProxyWindow(win);\n });\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'openFrame',\n 'openPrerenderFrame',\n 'prerender',\n 'open',\n 'openPrerender'\n ]\n};\n\nif (__ZOID__.__POPUP_SUPPORT__) {\n RENDER_DRIVERS[CONTEXT.POPUP] = {\n openOnClick: true,\n\n open() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n let { width, height } = this.component.dimensions;\n\n width = normalizeDimension(width, window.outerWidth);\n height = normalizeDimension(height, window.outerWidth);\n\n const win = popup('', {\n width,\n height,\n ...this.component.attributes.popup\n });\n\n this.clean.register(() => {\n win.close();\n cleanUpWindow(win);\n });\n\n return toProxyWindow(win);\n });\n },\n\n openPrerender(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return proxyWin;\n });\n },\n\n delegate: [\n 'getProxyContainer',\n 'renderContainer',\n 'setProxyWin'\n ]\n };\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { dotify, isDefined, extend } from 'belter/src';\n\nimport type { Component } from '../component';\nimport type { BuiltInPropsDefinitionType, PropsInputType, PropsType, MixedPropDefinitionType } from '../component/props';\nimport { PROP_SERIALIZATION } from '../constants';\n\nimport type { ParentHelpers } from './index';\n\n/* Normalize Props\n ---------------\n\n Turn props into normalized values, using defaults, function options, etc.\n*/\n\nexport function extendProps

(component : Component

, props : PropsType

, inputProps : PropsInputType

, helpers : ParentHelpers

, isUpdate : boolean = false) { // eslint-disable-line complexity\n\n // $FlowFixMe\n inputProps = inputProps || {};\n extend(props, inputProps);\n\n const propNames = isUpdate ? [] : [ ...component.getPropNames() ];\n\n // $FlowFixMe\n for (const key of Object.keys(inputProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n const aliases = [];\n\n const { state, close, focus, onError } = helpers;\n\n for (const key of propNames) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n let value = inputProps[key];\n\n if (!propDef) {\n continue;\n }\n\n const alias = propDef.alias;\n if (alias) {\n if (!isDefined(value) && isDefined(inputProps[alias])) {\n value = inputProps[alias];\n }\n aliases.push(alias);\n }\n\n if (propDef.value) {\n value = propDef.value({ props, state, close, focus, onError });\n }\n\n if (!isDefined(value) && propDef.default) {\n value = propDef.default({ props, state, close, focus, onError });\n }\n\n if (isDefined(value)) {\n if (propDef.type === 'array' ? !Array.isArray(value) : (typeof value !== propDef.type)) {\n throw new TypeError(`Prop is not of type ${ propDef.type }: ${ key }`);\n }\n }\n \n // $FlowFixMe\n props[key] = value;\n }\n\n for (const alias of aliases) {\n // $FlowFixMe\n delete props[alias];\n }\n\n // $FlowFixMe\n for (const key of Object.keys(props)) {\n const propDef = component.getPropDefinition(key);\n // $FlowFixMe\n const value = props[key];\n\n if (!propDef) {\n continue;\n }\n\n if (isDefined(value) && propDef.validate) {\n // $FlowFixMe\n propDef.validate({ value, props });\n }\n\n if (isDefined(value) && propDef.decorate) {\n // $FlowFixMe\n props[key] = propDef.decorate({ value, props, state, close, focus, onError });\n }\n }\n\n for (const key of component.getPropNames()) {\n const propDef = component.getPropDefinition(key);\n if (propDef.required !== false && !isDefined(props[key])) {\n throw new Error(`Expected prop \"${ key }\" to be defined`);\n }\n }\n}\n\n// $FlowFixMe\nfunction getQueryParam(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryParam === 'function') {\n return prop.queryParam({ value });\n } else if (typeof prop.queryParam === 'string') {\n return prop.queryParam;\n } else {\n return key;\n }\n });\n}\n\n// $FlowFixMe\nfunction getQueryValue(prop : MixedPropDefinitionType

, key : string, value : T) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (typeof prop.queryValue === 'function' && isDefined(value)) {\n return prop.queryValue({ value });\n } else {\n return value;\n }\n });\n}\n\nexport function propsToQuery

(propsDef : BuiltInPropsDefinitionType

, props : (PropsType

)) : ZalgoPromise<{ [string] : string }> {\n\n const params = {};\n\n // $FlowFixMe\n return ZalgoPromise.all(Object.keys(props).map(key => {\n\n const prop = propsDef[key];\n\n if (!prop) {\n return; // eslint-disable-line array-callback-return\n }\n\n return ZalgoPromise.resolve().then(() => {\n\n const value = props[key];\n\n if (!value) {\n return;\n }\n\n if (!prop.queryParam) {\n return;\n }\n\n return value;\n\n }).then(value => {\n\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n return ZalgoPromise.all([\n // $FlowFixMe\n getQueryParam(prop, key, value),\n // $FlowFixMe\n getQueryValue(prop, key, value)\n ]).then(([ queryParam, queryValue ]) => {\n\n let result;\n\n if (typeof queryValue === 'boolean') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'string') {\n result = queryValue.toString();\n } else if (typeof queryValue === 'object' && queryValue !== null) {\n\n if (prop.serialization === PROP_SERIALIZATION.JSON) {\n result = JSON.stringify(queryValue);\n } else if (prop.serialization === PROP_SERIALIZATION.BASE64) {\n result = btoa(JSON.stringify(queryValue));\n } else if (prop.serialization === PROP_SERIALIZATION.DOTIFY || !prop.serialization) {\n result = dotify(queryValue, key);\n\n for (const dotkey of Object.keys(result)) {\n params[dotkey] = result[dotkey];\n }\n\n return;\n }\n\n } else if (typeof queryValue === 'number') {\n result = queryValue.toString();\n }\n\n params[queryParam] = result;\n });\n });\n\n })).then(() => {\n return params;\n });\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { send, bridge, serializeMessage, ProxyWindow, toProxyWindow } from 'post-robot/src';\nimport { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,\n getDomain, type CrossDomainWindowType,\n getDistanceFromTop, normalizeMockUrl, assertSameDomain } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,\n noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,\n once, stringifyError, destroyElement, getElementSafe } from 'belter/src';\n\nimport { ZOID, POST_MESSAGE, CONTEXT, EVENT,\n INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';\nimport type { Component, onErrorPropType } from '../component';\nimport { getGlobal, getProxyObject, type ProxyObject } from '../lib';\nimport type { PropsInputType, PropsType } from '../component/props';\nimport type { ChildExportsType } from '../child';\nimport type { DimensionsType } from '../types';\n\nimport { RENDER_DRIVERS, type ContextDriverType } from './drivers';\nimport { propsToQuery, extendProps } from './props';\n\nexport type RenderOptionsType

= {|\n uid : string,\n props : PropsInputType

,\n tag : string,\n context : string,\n close : (?string) => ZalgoPromise,\n focus : () => ZalgoPromise,\n doc : Document,\n container? : HTMLElement,\n dimensions : DimensionsType,\n state : Object,\n event : EventEmitterType,\n frame : ?HTMLIFrameElement,\n prerenderFrame : ?HTMLIFrameElement\n|};\n\nexport type ParentExportsType

= {|\n init : (ChildExportsType

) => ZalgoPromise,\n close : () => ZalgoPromise,\n checkClose : () => ZalgoPromise,\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise\n|};\n\nexport type PropRef =\n {| type : typeof INITIAL_PROPS.RAW, uid? : string, value? : string |};\n\nexport type WindowRef =\n {| type : typeof WINDOW_REFERENCES.OPENER |} |\n {| type : typeof WINDOW_REFERENCES.PARENT, distance : number |} |\n {| type : typeof WINDOW_REFERENCES.GLOBAL, uid : string |};\n\nexport type ChildPayload = {|\n uid : string,\n tag : string,\n version : string,\n context : $Values,\n domain : string,\n parent : WindowRef,\n props : PropRef,\n exports : string\n|};\n\nexport type StateType = Object;\n\nexport type ParentHelpers

= {|\n state : StateType,\n close : () => ZalgoPromise,\n focus : () => ZalgoPromise,\n resize : ({ width : ?number, height : ?number }) => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n updateProps : PropsInputType

=> ZalgoPromise,\n event : EventEmitterType\n|};\n\nexport class ParentComponent

{\n\n component : Component

\n driver : ContextDriverType\n clean : CleanupType\n event : EventEmitterType\n\n initPromise : ZalgoPromise\n handledErrors : Array // eslint-disable-line flowtype/no-mutable-array\n \n props : PropsType

\n state : StateType\n child : ?ChildExportsType

\n\n proxyWin : ?ProxyWindow\n\n constructor(component : Component

, props : PropsInputType

) {\n this.initPromise = new ZalgoPromise();\n this.handledErrors = [];\n\n // $FlowFixMe\n this.props = {};\n\n this.clean = cleanup(this);\n this.state = {};\n\n this.component = component;\n\n this.setupEvents(props.onError);\n this.setProps(props);\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n this.watchForUnload();\n }\n\n setupEvents(onError : ?onErrorPropType) {\n this.event = eventEmitter();\n \n this.event.on(EVENT.RENDER, () => this.props.onRender());\n this.event.on(EVENT.DISPLAY, () => this.props.onDisplay());\n this.event.on(EVENT.RENDERED, () => this.props.onRendered());\n this.event.on(EVENT.CLOSE, () => this.props.onClose());\n this.event.on(EVENT.PROPS, (props) => this.props.onProps(props));\n\n this.event.on(EVENT.ERROR, err => {\n if (this.props && this.props.onError) {\n return this.props.onError(err);\n } else if (onError) {\n return onError(err);\n } else {\n return this.initPromise.reject(err).then(() => {\n setTimeout(() => {\n throw err;\n }, 1);\n });\n }\n });\n }\n\n render(target : CrossDomainWindowType, container : string | HTMLElement, context : $Values) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`render`);\n\n this.driver = RENDER_DRIVERS[context];\n const uid = `${ ZOID }-${ this.component.tag }-${ uniqueID() }`;\n const domain = this.getDomain();\n const initialDomain = this.getInitialDomain();\n \n this.component.checkAllowRender(target, domain, container);\n\n if (target !== window) {\n this.delegate(context, target);\n }\n\n const tasks = {};\n\n tasks.init = this.initPromise;\n tasks.buildUrl = this.buildUrl();\n tasks.onRender = this.event.trigger(EVENT.RENDER);\n\n tasks.getProxyContainer = this.getProxyContainer(container);\n\n tasks.openFrame = this.openFrame();\n tasks.openPrerenderFrame = this.openPrerenderFrame();\n\n tasks.renderContainer = ZalgoPromise.all([ tasks.getProxyContainer, tasks.openFrame, tasks.openPrerenderFrame ]).then(([ proxyContainer, proxyFrame, proxyPrerenderFrame ]) => {\n return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });\n });\n\n tasks.open = this.driver.openOnClick\n ? this.open()\n : tasks.openFrame.then(proxyFrame => this.open(proxyFrame));\n\n tasks.openPrerender = ZalgoPromise.all([ tasks.open, tasks.openPrerenderFrame ]).then(([ proxyWin, proxyPrerenderFrame ]) => {\n return this.openPrerender(proxyWin, proxyPrerenderFrame);\n });\n\n tasks.setState = ZalgoPromise.all([\n tasks.open.then(proxyWin => {\n this.proxyWin = proxyWin;\n return this.setProxyWin(proxyWin);\n })\n ]);\n \n tasks.prerender = ZalgoPromise.all([ tasks.openPrerender, tasks.setState ]).then(([ proxyPrerenderWin ]) => {\n return this.prerender(proxyPrerenderWin, { context, uid });\n });\n\n tasks.loadUrl = ZalgoPromise.all([ tasks.open, tasks.buildUrl, tasks.setWindowName, tasks.prerender ]).then(([ proxyWin, url ]) => {\n return proxyWin.setLocation(url);\n });\n\n tasks.buildWindowName = tasks.open.then(proxyWin => {\n return this.buildWindowName({ proxyWin, initialDomain, domain, target, context, uid });\n });\n\n tasks.setWindowName = ZalgoPromise.all([ tasks.open, tasks.buildWindowName ]).then(([ proxyWin, windowName ]) => {\n return proxyWin.setName(windowName);\n });\n\n tasks.watchForClose = tasks.open.then(proxyWin => {\n this.watchForClose(proxyWin);\n });\n\n tasks.onDisplay = ZalgoPromise.all([ tasks.renderContainer, tasks.prerender ]).then(() => {\n return this.event.trigger(EVENT.DISPLAY);\n });\n\n tasks.openBridge = tasks.open.then(proxyWin => {\n return this.openBridge(proxyWin, initialDomain, context);\n });\n\n tasks.runTimeout = tasks.loadUrl.then(() => {\n return this.runTimeout();\n });\n\n tasks.onRender = tasks.init.then(() => {\n return this.event.trigger(EVENT.RENDERED);\n });\n\n return ZalgoPromise.hash(tasks);\n \n }).catch(err => {\n return ZalgoPromise.all([\n this.onError(err),\n this.destroy(err)\n ]).then(() => {\n throw err;\n });\n }).then(noop);\n }\n\n getProxyContainer(container : string | HTMLElement) : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n return elementReady(container);\n }).then(containerElement => {\n return getProxyObject(containerElement);\n });\n }\n\n buildWindowName({ proxyWin, initialDomain, domain, target, uid, context } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string }) : string {\n const childPayload = this.buildChildPayload({ proxyWin, initialDomain, domain, target, context, uid });\n return `__${ ZOID }__${ this.component.name }__${ base64encode(JSON.stringify(childPayload)) }__`;\n }\n\n getPropsRef(proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, uid : string) : PropRef {\n const value = serializeMessage(proxyWin, domain, this.getPropsForChild(domain));\n\n const propRef = (initialDomain === getDomain())\n ? { type: INITIAL_PROPS.UID, uid }\n : { type: INITIAL_PROPS.RAW, value };\n\n if (propRef.type === INITIAL_PROPS.UID) {\n const global = getGlobal(window);\n global.props = global.props || {};\n global.props[uid] = value;\n\n this.clean.register(() => {\n delete global.props[uid];\n });\n }\n\n return propRef;\n }\n\n buildChildPayload({ proxyWin, initialDomain, domain, target = window, context, uid } : { proxyWin : ProxyWindow, initialDomain : string, domain : string | RegExp, target : CrossDomainWindowType, context : $Values, uid : string } = {}) : ChildPayload {\n return {\n uid,\n context,\n version: __ZOID__.__VERSION__,\n domain: getDomain(window),\n tag: this.component.tag,\n parent: this.getWindowRef(target, initialDomain, uid, context),\n props: this.getPropsRef(proxyWin, initialDomain, domain, uid),\n exports: serializeMessage(proxyWin, domain, this.buildParentExports(proxyWin))\n };\n }\n\n setProxyWin(proxyWin : ProxyWindow) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.proxyWin = proxyWin;\n });\n }\n\n getHelpers() : ParentHelpers

{\n return {\n state: this.state,\n event: this.event,\n close: () => this.close(),\n focus: () => this.focus(),\n resize: ({ width, height }) => this.resize({ width, height }),\n onError: (err) => this.onError(err),\n updateProps: (props) => this.updateProps(props)\n };\n }\n\n setProps(props : PropsInputType

, isUpdate : boolean = false) {\n if (this.component.validate) {\n this.component.validate({ props });\n }\n\n const helpers = this.getHelpers();\n extendProps(this.component, this.props, props, helpers, isUpdate);\n }\n\n buildUrl() : ZalgoPromise {\n return propsToQuery({ ...this.component.props, ...this.component.builtinProps }, this.props).then(query => {\n return extendUrl(normalizeMockUrl(this.component.getUrl(this.props)), { query });\n });\n }\n\n getDomain() : string | RegExp {\n return this.component.getDomain(this.props);\n }\n\n getInitialDomain() : string {\n return this.component.getInitialDomain(this.props);\n }\n\n getPropsForChild(domain : string | RegExp) : (PropsType

) {\n const result = {};\n\n for (const key of Object.keys(this.props)) {\n const prop = this.component.getPropDefinition(key);\n\n if (prop && prop.sendToChild === false) {\n continue;\n }\n\n if (prop && prop.sameDomain && !matchDomain(domain, getDomain(window))) {\n continue;\n }\n\n // $FlowFixMe\n result[key] = this.props[key];\n }\n\n // $FlowFixMe\n return result;\n }\n\n updateProps(props : PropsInputType

) : ZalgoPromise {\n this.setProps(props, true);\n\n return this.initPromise.then(() => {\n if (this.child) {\n return this.child.updateProps(this.getPropsForChild(this.getDomain())).catch(err => {\n if (!this.child || !this.proxyWin) {\n return;\n }\n\n return this.checkClose(this.proxyWin).then(() => {\n if (this.child) {\n throw err;\n }\n });\n });\n }\n });\n }\n\n openFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openFrame) {\n return this.driver.openFrame.call(this);\n }\n });\n }\n\n openPrerenderFrame() : ZalgoPromise> {\n return ZalgoPromise.try(() => {\n if (this.driver.openPrerenderFrame) {\n return this.driver.openPrerenderFrame.call(this);\n }\n });\n }\n \n open(proxyFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`open`);\n\n const windowProp = this.props.window;\n\n if (windowProp) {\n this.clean.register(() => windowProp.close());\n return toProxyWindow(windowProp);\n }\n\n return this.driver.open.call(this, proxyFrame);\n\n }).then(proxyWin => {\n this.proxyWin = proxyWin;\n return proxyWin;\n });\n }\n\n openPrerender(proxyWin : ProxyWindow, proxyPrerenderFrame : ?ProxyObject) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n return this.driver.openPrerender.call(this, proxyWin, proxyPrerenderFrame);\n });\n }\n\n focus() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.proxyWin) {\n return this.proxyWin.focus().then(noop);\n }\n });\n }\n\n delegate(context : $Values, target : CrossDomainWindowType) {\n this.component.log(`delegate`);\n\n const props = {};\n for (const propName of this.component.getPropNames()) {\n if (this.component.getPropDefinition(propName).allowDelegate) {\n props[propName] = this.props[propName];\n }\n }\n\n const overridesPromise = send(target, `${ POST_MESSAGE.DELEGATE }_${ this.component.name }`, {\n context,\n props,\n overrides: {\n event: this.event,\n close: () => this.close(),\n onError: (err) => this.onError(err)\n }\n\n }).then(({ data }) => {\n this.clean.register(data.destroy);\n return data.overrides;\n\n }).catch(err => {\n throw new Error(`Unable to delegate rendering. Possibly the component is not loaded in the target window.\\n\\n${ stringifyError(err) }`);\n });\n\n for (const key of this.driver.delegate) {\n // $FlowFixMe\n this[key] = function overriddenFunction() : ZalgoPromise {\n return overridesPromise.then(overrides => {\n return overrides[key].apply(this, arguments);\n });\n };\n }\n }\n\n getWindowRef(target : CrossDomainWindowType, domain : string, uid : string, context : $Values) : WindowRef {\n \n if (domain === getDomain(window)) {\n const global = getGlobal(window);\n global.windows = global.windows || {};\n global.windows[uid] = window;\n this.clean.register(() => {\n delete global.windows[uid];\n });\n \n return { type: WINDOW_REFERENCES.GLOBAL, uid };\n }\n\n if (context === CONTEXT.POPUP) {\n return { type: WINDOW_REFERENCES.OPENER };\n }\n\n return { type: WINDOW_REFERENCES.PARENT, distance: getDistanceFromTop(window) };\n }\n\n watchForClose(proxyWin : ProxyWindow) : ZalgoPromise {\n let cancelled = false;\n\n this.clean.register(() => {\n cancelled = true;\n });\n\n return ZalgoPromise.delay(2000).then(() => {\n return proxyWin.isClosed();\n }).then(isClosed => {\n if (isClosed) {\n this.component.log(`detect_close_child`);\n return this.close();\n } else if (!cancelled) {\n return this.watchForClose(proxyWin);\n }\n });\n }\n\n watchForUnload() {\n const unloadWindowListener = addEventListener(window, 'unload', once(() => {\n this.component.log(`navigate_away`);\n this.destroy(new Error(`Window navigated away`));\n }));\n\n this.clean.register(unloadWindowListener.cancel);\n }\n\n runTimeout() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const timeout = this.props.timeout;\n\n if (timeout) {\n return this.initPromise.timeout(timeout, new Error(`Loading component timed out after ${ timeout } milliseconds`));\n }\n });\n }\n\n initChild(child : ChildExportsType

) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.clean.set('child', child);\n this.initPromise.resolve();\n });\n }\n\n buildParentExports(win : ProxyWindow) : ParentExportsType

{\n const onError = (err) => this.onError(err);\n const init = (child) => this.initChild(child);\n const close = () => this.close();\n const checkClose = () => this.checkClose(win);\n const resize = ({ width, height }) => this.resize({ width, height });\n\n init.onError = onError;\n\n return { init, close, checkClose, resize, onError };\n }\n\n resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.event.trigger(EVENT.RESIZE, { width, height });\n });\n }\n\n checkClose(win : ProxyWindow) : ZalgoPromise {\n return win.isClosed().then(closed => {\n if (closed) {\n return this.close();\n }\n\n return ZalgoPromise.delay(200)\n .then(() => win.isClosed())\n .then(secondClosed => {\n if (secondClosed) {\n return this.close();\n }\n });\n });\n }\n\n close() : ZalgoPromise {\n return ZalgoPromise.try(() => {\n this.component.log(`close`);\n return this.event.trigger(EVENT.CLOSE);\n\n }).then(() => {\n if (this.child) {\n this.child.close.fireAndForget().catch(noop);\n }\n\n return this.destroy(new Error(`Window closed`), false);\n });\n }\n\n prerender(proxyPrerenderWin : ProxyWindow, { context, uid } : { context : $Values, uid : string }) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n const prerenderTemplate = this.component.prerenderTemplate;\n\n if (!prerenderTemplate) {\n return;\n }\n\n let prerenderWindow = proxyPrerenderWin.getWindow();\n\n if (!prerenderWindow || !isSameDomain(prerenderWindow) || !isBlankDomain(prerenderWindow)) {\n return;\n }\n\n prerenderWindow = assertSameDomain(prerenderWindow);\n \n const doc = prerenderWindow.document;\n const el = this.renderTemplate(prerenderTemplate, { context, uid, doc });\n\n if (!el) {\n return;\n }\n\n if (el.ownerDocument !== doc) {\n throw new Error(`Expected prerender template to have been created with document from child window`);\n }\n\n writeElementToWindow(prerenderWindow, el);\n\n let { width = false, height = false, element = 'body' } = this.component.autoResize || {};\n element = getElementSafe(element, doc);\n \n if (element && (width || height)) {\n onResize(element, ({ width: newWidth, height: newHeight }) => {\n this.resize({\n width: width ? newWidth : undefined,\n height: height ? newHeight : undefined\n });\n }, { width, height, win: prerenderWindow });\n }\n });\n }\n\n renderTemplate(renderer : (RenderOptionsType

) => ?HTMLElement, { context, uid, container, doc, frame, prerenderFrame } : { context : $Values, uid : string, container? : HTMLElement, doc : Document, frame? : ?HTMLIFrameElement, prerenderFrame? : ?HTMLIFrameElement }) : ?HTMLElement {\n // $FlowFixMe\n return renderer.call(this, {\n container,\n context,\n uid,\n doc,\n frame,\n prerenderFrame,\n focus: () => this.focus(),\n close: () => this.close(),\n state: this.state,\n props: this.props,\n tag: this.component.tag,\n dimensions: this.component.dimensions,\n event: this.event\n });\n }\n\n renderContainer(proxyContainer : ProxyObject, { proxyFrame, proxyPrerenderFrame, context, uid } : { context : $Values, uid : string, proxyFrame : ?ProxyObject, proxyPrerenderFrame : ?ProxyObject }) : ZalgoPromise> {\n return ZalgoPromise.all([\n proxyContainer.get().then(elementReady),\n // $FlowFixMe\n proxyFrame ? proxyFrame.get() : null,\n // $FlowFixMe\n proxyPrerenderFrame ? proxyPrerenderFrame.get() : null\n ]).then(([ container, frame, prerenderFrame ]) => {\n const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });\n if (innerContainer) {\n appendChild(container, innerContainer);\n this.clean.register(() => destroyElement(innerContainer));\n return getProxyObject(innerContainer);\n }\n });\n }\n\n destroy(err? : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (!err) {\n trigger = false;\n err = new Error('Component destroyed');\n }\n this.component.log(`destroy`);\n return this.onError(err, trigger);\n }).then(() => {\n return this.clean.all();\n });\n }\n\n onError(err : mixed, trigger? : boolean = true) : ZalgoPromise {\n return ZalgoPromise.try(() => {\n if (this.handledErrors.indexOf(err) !== -1) {\n return;\n }\n\n this.handledErrors.push(err);\n this.initPromise.asyncReject(err);\n\n if (trigger) {\n return this.event.trigger(EVENT.ERROR, err);\n }\n });\n }\n\n openBridge(proxyWin : ProxyWindow, domain : string, context : $Values) : ?ZalgoPromise {\n if (__POST_ROBOT__.__IE_POPUP_SUPPORT__) {\n return ZalgoPromise.try(() => {\n return proxyWin.awaitWindow();\n \n }).then(win => {\n if (!bridge || !bridge.needsBridge({ win, domain }) || bridge.hasBridge(domain, domain)) {\n return;\n }\n\n const bridgeUrl = this.component.getBridgeUrl();\n\n if (!bridgeUrl) {\n throw new Error(`Bridge needed to render ${ context }`);\n }\n\n const bridgeDomain = getDomainFromUrl(bridgeUrl);\n bridge.linkUrl(win, domain);\n return bridge.openBridge(normalizeMockUrl(bridgeUrl), bridgeDomain);\n });\n }\n }\n}\n","/* @flow */\n\nimport { onCloseWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { ProxyWindow } from 'post-robot/src';\nimport { cleanup, type CleanupType, type EventEmitterType } from 'belter/src';\n\nimport { ParentComponent } from '../parent';\nimport { RENDER_DRIVERS, type ContextDriverType } from '../parent/drivers';\nimport type { Component } from '../component';\n\nexport type DelegatePropsType = {|\n onClose : () => ?ZalgoPromise,\n onDisplay : () => ?ZalgoPromise,\n window : ?ProxyWindow\n|};\n\nexport type DelegateOptionsType = {|\n context : string,\n props : DelegatePropsType,\n overrides : {\n close : () => ZalgoPromise,\n onError : (mixed) => ZalgoPromise,\n event : EventEmitterType\n }\n|};\n\nexport type DelegateReturnType = {|\n overrides : Object,\n destroy : () => ZalgoPromise\n|};\n\nexport class DelegateComponent

{\n\n component : Component

\n source : CrossDomainWindowType\n context : string\n driver : ContextDriverType\n props : DelegatePropsType\n clean : CleanupType\n\n focus : () => ZalgoPromise\n resize : ({ width? : ?number, height? : ?number }) => ZalgoPromise\n renderTemplate : Function\n\n close : () => ZalgoPromise\n onError : (mixed) => ZalgoPromise\n event : EventEmitterType\n\n constructor(component : Component

, source : CrossDomainWindowType, options : DelegateOptionsType) {\n this.component = component;\n this.context = options.context;\n this.driver = RENDER_DRIVERS[options.context];\n this.clean = cleanup(this);\n \n this.focus = ParentComponent.prototype.focus;\n this.resize = ParentComponent.prototype.resize;\n this.renderTemplate = ParentComponent.prototype.renderTemplate;\n\n // $FlowFixMe\n this.props = {};\n for (const propName of Object.keys(options.props)) {\n const propDef = this.component.getPropDefinition(propName);\n if (propDef && propDef.allowDelegate && options.props[propName]) {\n // $FlowFixMe\n this.props[propName] = options.props[propName];\n }\n }\n\n this.close = options.overrides.close;\n this.onError = options.overrides.onError;\n this.event = options.overrides.event;\n\n this.component.registerActiveComponent(this);\n this.clean.register(() => this.component.destroyActiveComponent(this));\n\n this.watchForSourceClose(source);\n }\n\n getDelegate() : DelegateReturnType {\n return {\n overrides: this.getOverrides(),\n destroy: () => this.destroy()\n };\n }\n\n watchForSourceClose(source : CrossDomainWindowType) {\n const closeSourceWindowListener = onCloseWindow(source, () => this.destroy(), 3000);\n this.clean.register(closeSourceWindowListener.cancel);\n }\n\n getOverrides() : { [string] : mixed } {\n const overrides = {};\n const self = this;\n\n for (const key of this.driver.delegate) {\n overrides[key] = function delegateOverride() : mixed {\n // $FlowFixMe\n return ParentComponent.prototype[key].apply(self, arguments);\n };\n overrides[key].__name__ = key;\n }\n\n return overrides;\n }\n\n destroy() : ZalgoPromise {\n return this.clean.all();\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { destroyElement, toCSS } from 'belter/src';\n\nimport { type RenderOptionsType } from '../../parent';\nimport { EVENT } from '../../constants';\n\nconst CLASS = {\n VISIBLE: 'visible',\n INVISIBLE: 'invisible'\n};\n\nexport function defaultContainerTemplate

({ uid, frame, prerenderFrame, doc, props, event, dimensions : { width, height } } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_CONTAINER__) {\n if (!frame || !prerenderFrame) {\n return;\n }\n\n const div = doc.createElement('div');\n div.setAttribute('id', uid);\n const style = doc.createElement('style');\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n style.appendChild(doc.createTextNode(`\n #${ uid } {\n display: inline-block;\n position: relative;\n width: ${ width };\n height: ${ height };\n }\n\n #${ uid } > iframe {\n display: inline-block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transition: opacity .2s ease-in-out;\n }\n\n #${ uid } > iframe.${ CLASS.INVISIBLE } {\n opacity: 0;\n }\n\n #${ uid } > iframe.${ CLASS.VISIBLE } {\n opacity: 1;\n }\n `));\n\n div.appendChild(frame);\n div.appendChild(prerenderFrame);\n div.appendChild(style);\n\n prerenderFrame.classList.add(CLASS.VISIBLE);\n frame.classList.add(CLASS.INVISIBLE);\n \n event.on(EVENT.RENDERED, () => {\n prerenderFrame.classList.remove(CLASS.VISIBLE);\n prerenderFrame.classList.add(CLASS.INVISIBLE);\n \n frame.classList.remove(CLASS.INVISIBLE);\n frame.classList.add(CLASS.VISIBLE);\n \n setTimeout(() => {\n destroyElement(prerenderFrame);\n }, 1);\n });\n\n event.on(EVENT.RESIZE, ({ width: newWidth, height: newHeight }) => {\n if (typeof newWidth === 'number') {\n div.style.width = toCSS(newWidth);\n }\n \n if (typeof newHeight === 'number') {\n div.style.height = toCSS(newHeight);\n }\n });\n\n return div;\n }\n}\n","/* @flow */\n/* eslint react/react-in-jsx-scope: off */\n\nimport { type RenderOptionsType } from '../../parent';\n\nexport function defaultPrerenderTemplate

({ doc, props } : RenderOptionsType

) : ?HTMLElement {\n if (__ZOID__.__DEFAULT_PRERENDER__) {\n const html = doc.createElement('html');\n const body = doc.createElement('body');\n const style = doc.createElement('style');\n const spinner = doc.createElement('div');\n spinner.classList.add('spinner');\n\n if (props.cspNonce) {\n style.setAttribute('nonce', props.cspNonce);\n }\n\n html.appendChild(body);\n body.appendChild(spinner);\n body.appendChild(style);\n style.appendChild(doc.createTextNode(`\n html, body {\n width: 100%;\n height: 100%;\n }\n\n .spinner {\n position: fixed;\n max-height: 60vmin;\n max-width: 60vmin;\n height: 40px;\n width: 40px;\n top: 50%;\n left: 50%;\n box-sizing: border-box;\n border: 3px solid rgba(0, 0, 0, .2);\n border-top-color: rgba(33, 128, 192, 0.8);\n border-radius: 100%;\n animation: rotation .7s infinite linear;\n }\n\n @keyframes rotation {\n from {\n transform: translateX(-50%) translateY(-50%) rotate(0deg);\n }\n to {\n transform: translateX(-50%) translateY(-50%) rotate(359deg);\n }\n }\n `));\n\n return html;\n }\n}\n","/* @flow */\n\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { once, noop } from 'belter/src';\nimport { isWindow, type CrossDomainWindowType } from 'cross-domain-utils/src';\nimport { ProxyWindow, toProxyWindow } from 'post-robot/src';\n\nimport { PROP_SERIALIZATION } from '../constants';\n\nexport type EventHandlerType = (T) => void | ZalgoPromise;\n\nexport type timeoutPropType = number;\nexport type windowPropType = CrossDomainWindowType | ProxyWindow;\nexport type cspNoncePropType = string;\nexport type closePropType = () => ZalgoPromise;\nexport type focusPropType = () => ZalgoPromise;\nexport type resizePropType = ({ width : ?number, height : ?number }) => ZalgoPromise;\n\nexport type onDisplayPropType = EventHandlerType;\nexport type onRenderedPropType = EventHandlerType;\nexport type onRenderPropType = EventHandlerType;\nexport type onClosePropType = EventHandlerType;\nexport type onErrorPropType = EventHandlerType;\nexport type onPropsPropType

= ((PropsType

) => void) => void; // eslint-disable-line no-use-before-define\n\nexport type PropsInputType

= {\n timeout? : timeoutPropType,\n window? : windowPropType,\n cspNonce? : cspNoncePropType,\n\n onDisplay? : onDisplayPropType,\n onRendered? : onRenderedPropType,\n onRender? : onRenderPropType,\n onClose? : onClosePropType,\n onError? : onErrorPropType,\n onProps? : onPropsPropType

\n} & P;\n\nexport type PropsType

= {|\n timeout? : timeoutPropType,\n window? : ?windowPropType,\n close? : ?closePropType,\n focus? : ?focusPropType,\n resize? : ?resizePropType,\n cspNonce? : ?cspNoncePropType,\n\n onDisplay : onDisplayPropType,\n onRendered : onRenderedPropType,\n onRender : onRenderPropType,\n onClose : onClosePropType,\n onError : onErrorPropType,\n onProps : onPropsPropType

\n|} & P;\n\ntype PropDefinitionType = {|\n type : S,\n alias? : string,\n value? : ({ props : P, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => ?T,\n required? : boolean,\n queryParam? : boolean | string | ({ value : T }) => (string | ZalgoPromise),\n queryValue? : ({ value : T }) => (ZalgoPromise | mixed),\n sendToChild? : boolean,\n allowDelegate? : boolean,\n validate? : ({ value : T, props : PropsInputType

}) => void,\n decorate? : ({ value : T, props : PropsType

, state : Object, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise }) => T,\n default? : ({ props : P, state : Object }) => ?T,\n sameDomain? : boolean,\n serialization? : $Values,\n childDecorate? : ({ value : T, close : () => ZalgoPromise, focus : () => ZalgoPromise, onError : (mixed) => ZalgoPromise, onProps : ((PropsType

) => void) => void, resize : ({ width : ?number, height : ?number }) => ZalgoPromise }) => ?T\n|};\n\nexport type BooleanPropDefinitionType = PropDefinitionType;\nexport type StringPropDefinitionType = PropDefinitionType;\nexport type NumberPropDefinitionType = PropDefinitionType;\nexport type FunctionPropDefinitionType = PropDefinitionType;\nexport type ArrayPropDefinitionType, P> = PropDefinitionType; // eslint-disable-line flowtype/no-mutable-array\nexport type ObjectPropDefinitionType = PropDefinitionType;\n\nexport type MixedPropDefinitionType

= BooleanPropDefinitionType<*, P> | StringPropDefinitionType<*, P> | NumberPropDefinitionType<*, P> | FunctionPropDefinitionType<*, P> | ObjectPropDefinitionType<*, P> | ArrayPropDefinitionType<*, P>;\n\nexport type UserPropsDefinitionType

= {\n [string] : MixedPropDefinitionType

\n};\n\n// eslint-disable-next-line flowtype/require-exact-type\nexport type BuiltInPropsDefinitionType

= {\n timeout : NumberPropDefinitionType,\n window : ObjectPropDefinitionType,\n close : FunctionPropDefinitionType,\n focus : FunctionPropDefinitionType,\n resize : FunctionPropDefinitionType,\n\n onDisplay : FunctionPropDefinitionType,\n onRendered : FunctionPropDefinitionType,\n onRender : FunctionPropDefinitionType,\n onClose : FunctionPropDefinitionType,\n onError : FunctionPropDefinitionType,\n onProps : FunctionPropDefinitionType, P>\n};\n\nconst defaultNoop = () => noop;\nconst decorateOnce = ({ value }) => once(value);\n\nexport function getBuiltInProps

() : BuiltInPropsDefinitionType

{\n return {\n window: {\n type: 'object',\n sendToChild: false,\n required: false,\n allowDelegate: true,\n validate({ value } : { value : CrossDomainWindowType | ProxyWindow }) {\n if (!isWindow(value) && !ProxyWindow.isProxyWindow(value)) {\n throw new Error(`Expected Window or ProxyWindow`);\n }\n },\n decorate({ value } : { value : CrossDomainWindowType | ProxyWindow }) : ProxyWindow {\n return toProxyWindow(value);\n }\n },\n\n timeout: {\n type: 'number',\n required: false,\n sendToChild: false\n },\n\n close: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ close }) => close\n },\n\n focus: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ focus }) => focus\n },\n\n resize: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ resize }) => resize\n },\n\n cspNonce: {\n type: 'string',\n required: false\n },\n\n getParent: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParent }) => getParent\n },\n\n getParentDomain: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ getParentDomain }) => getParentDomain\n },\n\n onDisplay: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRendered: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onRender: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onClose: {\n type: 'function',\n required: false,\n sendToChild: false,\n allowDelegate: true,\n default: defaultNoop,\n decorate: decorateOnce\n },\n\n onError: {\n type: 'function',\n required: false,\n sendToChild: false,\n childDecorate: ({ onError }) => onError\n },\n\n onProps: {\n type: 'function',\n required: false,\n sendToChild: false,\n default: defaultNoop,\n childDecorate: ({ onProps }) => onProps\n }\n };\n}\n","/* @flow */\n/* eslint max-lines: 0 */\n\nimport { setup as setupPostRobot, on, send, bridge, toProxyWindow, destroy as destroyPostRobot } from 'post-robot/src';\nimport { ZalgoPromise } from 'zalgo-promise/src';\nimport { isWindow, getDomainFromUrl, type CrossDomainWindowType, isSameTopWindow, getDomain, matchDomain, isSameDomain } from 'cross-domain-utils/src';\nimport { isRegex, noop, isElement } from 'belter/src';\n\nimport { ChildComponent, getChildPayload } from '../child';\nimport { ParentComponent, type RenderOptionsType, type ParentHelpers } from '../parent';\nimport { DelegateComponent } from '../delegate';\nimport { CONTEXT, POST_MESSAGE, WILDCARD, DEFAULT_DIMENSIONS } from '../constants';\nimport { react, angular, vue, angular2 } from '../drivers';\nimport { getGlobal, destroyGlobal } from '../lib';\nimport type { CssDimensionsType, StringMatcherType } from '../types';\n\nimport { validate } from './validate';\nimport { defaultContainerTemplate, defaultPrerenderTemplate } from './templates';\nimport { getBuiltInProps, type UserPropsDefinitionType, type BuiltInPropsDefinitionType, type PropsInputType, type PropsType, type MixedPropDefinitionType } from './props';\n\ntype LoggerPayload = { [string] : ?string };\n\n// eslint-disable-next-line flowtype/require-exact-type\ntype Logger = {\n debug : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n info : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n warn : (event : string, payload? : LoggerPayload) => any, // eslint-disable-line flowtype/no-weak-types\n error : (event : string, payload? : LoggerPayload) => any // eslint-disable-line flowtype/no-weak-types\n};\n\n/* Component\n ---------\n\n This is the spec for the component. The idea is, when I call zoid.create(), it will create a new instance\n of Component with the blueprint needed to set up ParentComponents and ChildComponents.\n\n This is the one portion of code which is required by -- and shared to -- both the parent and child windows, and\n contains all of the configuration needed for them to set themselves up.\n*/\n\nexport type ComponentOptionsType

= {|\n\n tag : string,\n\n url : string | ({ props : PropsType

}) => string,\n domain? : string | RegExp,\n bridgeUrl? : string,\n\n props? : UserPropsDefinitionType

,\n\n dimensions? : CssDimensionsType,\n autoResize? : { width? : boolean, height? : boolean, element? : string },\n\n allowedParentDomains? : StringMatcherType,\n\n attributes? : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n },\n\n defaultContext? : $Values,\n\n containerTemplate? : (RenderOptionsType

) => ?HTMLElement,\n prerenderTemplate? : (RenderOptionsType

) => ?HTMLElement,\n\n validate? : ({ props : PropsInputType

}) => void,\n\n logger? : Logger\n|};\n\ntype ZoidRenderer = {|\n render : (container? : string | HTMLElement, context? : $Values) => ZalgoPromise,\n renderTo : (target : CrossDomainWindowType, container? : string, context? : $Values) => ZalgoPromise\n|};\n\nexport type ZoidComponentInstance

= {| ...ParentHelpers

, ...ZoidRenderer |};\n\nexport type ZoidComponent

= {|\n (PropsInputType

) : ZoidComponentInstance

,\n driver : (string, mixed) => mixed,\n isChild : () => boolean,\n xprops? : PropsType

,\n canRenderTo : (CrossDomainWindowType) => ZalgoPromise\n|};\n\nexport class Component

{\n\n tag : string\n name : string\n \n url : string | ({ props : PropsType

}) => string\n domain : void | string | RegExp\n bridgeUrl : void | string\n\n props : UserPropsDefinitionType

\n builtinProps : BuiltInPropsDefinitionType

\n\n dimensions : CssDimensionsType\n autoResize : void | { width? : boolean, height? : boolean, element? : string }\n\n allowedParentDomains : StringMatcherType\n\n defaultContext : $Values\n \n attributes : {\n iframe? : { [string] : string },\n popup? : { [string] : string }\n }\n\n containerTemplate : (RenderOptionsType

) => ?HTMLElement\n prerenderTemplate : ?(RenderOptionsType

) => ?HTMLElement\n\n validate : void | ({ props : PropsInputType

}) => void\n\n driverCache : { [string] : mixed }\n\n xprops : ?PropsType

\n\n logger : Logger\n\n propNames : $ReadOnlyArray\n\n constructor(options : ComponentOptionsType

) {\n validate(options);\n\n // The tag name of the component. Used by some drivers (e.g. angular) to turn the component into an html element,\n // e.g. \n\n this.tag = options.tag;\n this.name = this.tag.replace(/-/g, '_');\n\n this.allowedParentDomains = options.allowedParentDomains || WILDCARD;\n\n const global = getGlobal();\n global.components = global.components || {};\n\n if (global.components[this.tag]) {\n throw new Error(`Can not register multiple components with the same tag: ${ this.tag }`);\n }\n\n // A json based spec describing what kind of props the component accepts. This is used to validate any props before\n // they are passed down to the child.\n\n this.builtinProps = getBuiltInProps();\n this.props = options.props || {};\n\n // The dimensions of the component, e.g. { width: '300px', height: '150px' }\n\n const { width = DEFAULT_DIMENSIONS.WIDTH, height = DEFAULT_DIMENSIONS.HEIGHT } = options.dimensions || {};\n this.dimensions = { width, height };\n\n this.url = options.url;\n this.domain = options.domain;\n this.bridgeUrl = options.bridgeUrl;\n\n this.attributes = options.attributes || {};\n this.attributes.iframe = this.attributes.iframe || {};\n this.attributes.popup = this.attributes.popup || {};\n\n this.defaultContext = options.defaultContext || CONTEXT.IFRAME;\n\n this.autoResize = options.autoResize;\n\n if (options.containerTemplate) {\n this.containerTemplate = options.containerTemplate;\n } else if (__ZOID__.__DEFAULT_CONTAINER__) {\n this.containerTemplate = defaultContainerTemplate;\n }\n\n if (options.prerenderTemplate) {\n this.prerenderTemplate = options.prerenderTemplate;\n } else if (__ZOID__.__DEFAULT_PRERENDER__) {\n this.prerenderTemplate = defaultPrerenderTemplate;\n }\n\n this.validate = options.validate;\n\n this.logger = options.logger || {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n };\n\n this.registerChild();\n this.listenDelegate();\n\n global.components[this.tag] = this;\n }\n\n getPropNames() : $ReadOnlyArray {\n if (this.propNames) {\n return this.propNames;\n }\n\n const propNames = Object.keys(this.props);\n for (const key of Object.keys(this.builtinProps)) {\n if (propNames.indexOf(key) === -1) {\n propNames.push(key);\n }\n }\n\n this.propNames = propNames;\n return propNames;\n }\n\n // $FlowFixMe\n getPropDefinition(name : string) : MixedPropDefinitionType

{\n // $FlowFixMe\n return this.props[name] || this.builtinProps[name];\n }\n\n driver(name : string, dep : mixed) : mixed {\n if (__ZOID__.__FRAMEWORK_SUPPORT__) {\n const drivers = { react, angular, vue, angular2 };\n\n if (!drivers[name]) {\n throw new Error(`Could not find driver for framework: ${ name }`);\n }\n \n this.driverCache = this.driverCache || {};\n \n if (!this.driverCache[name]) {\n this.driverCache[name] = drivers[name].register(this, dep);\n }\n \n return this.driverCache[name];\n } else {\n throw new Error(`Driver support not enabled`);\n }\n }\n\n registerChild() {\n if (this.isChild()) {\n if (window.xprops) {\n throw new Error(`Can not register ${ this.name } as child - can not attach multiple components to the same window`);\n }\n\n const child = new ChildComponent(this);\n window.xprops = this.xprops = child.getProps();\n }\n }\n\n listenDelegate() {\n on(`${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`, () => {\n return true;\n });\n\n on(`${ POST_MESSAGE.DELEGATE }_${ this.name }`, ({ source, data: { context, props, overrides } }) => {\n const delegate = new DelegateComponent(this, source, { context, props, overrides });\n return delegate.getDelegate();\n });\n }\n\n canRenderTo(win : CrossDomainWindowType) : ZalgoPromise {\n return send(win, `${ POST_MESSAGE.ALLOW_DELEGATE }_${ this.name }`).then(({ data }) => {\n return data;\n }).catch(() => {\n return false;\n });\n }\n\n getUrl(props : PropsType

) : string {\n if (typeof this.url === 'function') {\n return this.url({ props });\n }\n\n return this.url;\n }\n\n getInitialDomain(props : PropsType

) : string {\n if (this.domain && typeof this.domain === 'string') {\n return this.domain;\n }\n\n return getDomainFromUrl(this.getUrl(props));\n }\n\n getDomain(props : PropsType

) : string | RegExp {\n if (isRegex(this.domain)) {\n // $FlowFixMe\n return this.domain;\n }\n\n return this.getInitialDomain(props);\n }\n\n getBridgeUrl() : ?string {\n if (this.bridgeUrl) {\n return this.bridgeUrl;\n }\n }\n\n isChild() : boolean {\n const payload = getChildPayload();\n return Boolean(payload && payload.tag === this.tag);\n }\n\n getDefaultContainer(context : $Values, container? : T) : T {\n if (container) {\n if (typeof container !== 'string' && !isElement(container)) {\n throw new TypeError(`Expected string or element selector to be passed`);\n }\n\n return container;\n }\n\n if (context === CONTEXT.POPUP) {\n // $FlowFixMe\n return 'body';\n }\n\n throw new Error(`Expected element to be passed to render iframe`);\n }\n\n getDefaultContext(context : ?$Values, props : PropsInputType

) : $Values {\n if (props.window) {\n return toProxyWindow(props.window).getType();\n }\n\n if (context) {\n if (context !== CONTEXT.IFRAME && context !== CONTEXT.POPUP) {\n throw new Error(`Unrecognized context: ${ context }`);\n }\n \n return context;\n }\n\n return this.defaultContext;\n }\n\n init(props : PropsInputType

) : ZoidComponentInstance

{\n\n // $FlowFixMe\n props = props || {};\n \n const parent = new ParentComponent(this, props);\n\n const render = (target, container, context) => ZalgoPromise.try(() => {\n if (!isWindow(target)) {\n throw new Error(`Must pass window to renderTo`);\n }\n\n context = this.getDefaultContext(context, props);\n container = this.getDefaultContainer(context, container);\n return parent.render(target, container, context);\n });\n\n return {\n ...parent.getHelpers(),\n render: (container, context) => render(window, container, context),\n renderTo: (target, container, context) => render(target, container, context)\n };\n }\n\n checkAllowRender(target : CrossDomainWindowType, domain : string | RegExp, container : string | HTMLElement) {\n if (target === window) {\n return;\n }\n\n if (!isSameTopWindow(window, target)) {\n throw new Error(`Can only renderTo an adjacent frame`);\n }\n\n const origin = getDomain();\n\n if (!matchDomain(domain, origin) && !isSameDomain(target)) {\n throw new Error(`Can not render remotely to ${ domain.toString() } - can only render to ${ origin }`);\n }\n\n if (container && typeof container !== 'string') {\n throw new Error(`Container passed to renderTo must be a string selector, got ${ typeof container } }`);\n }\n }\n\n log(event : string, payload? : LoggerPayload) {\n this.logger.info(`${ this.name }_${ event }`, payload);\n }\n\n registerActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.push(instance);\n }\n\n destroyActiveComponent(instance : ParentComponent | DelegateComponent) {\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n global.activeComponents.splice(global.activeComponents.indexOf(instance), 1);\n }\n}\n\nexport type ComponentDriverType = {|\n register : (Component

, T) => mixed\n|};\n\nexport function create

(options : ComponentOptionsType

) : ZoidComponent

{\n setupPostRobot();\n\n const component : Component

= new Component(options);\n\n const init = (props) => component.init(props);\n init.driver = (name, dep) => component.driver(name, dep);\n init.isChild = () => component.isChild();\n init.canRenderTo = (win) => component.canRenderTo(win);\n init.xprops = component.xprops;\n\n // $FlowFixMe\n return init;\n}\n\nexport function destroyAll() : ZalgoPromise {\n if (bridge) {\n bridge.destroyBridges();\n }\n\n const results = [];\n\n const global = getGlobal();\n global.activeComponents = global.activeComponents || [];\n while (global.activeComponents.length) {\n results.push(global.activeComponents[0].destroy(new Error(`zoid desroyed all`), false));\n }\n\n return ZalgoPromise.all(results).then(noop);\n}\n\nexport const destroyComponents = destroyAll;\n\nexport function destroy() {\n destroyAll();\n destroyGlobal();\n destroyPostRobot();\n}\n","/* @flow */\n\nimport { isPerc, isPx, values } from 'belter/src';\n\nimport { CONTEXT, PROP_TYPE } from '../constants';\n\nimport type { ComponentOptionsType } from './index';\n\nfunction validatePropDefinitions

(options : ComponentOptionsType

) {\n\n if (options.props && !(typeof options.props === 'object')) {\n throw new Error(`Expected options.props to be an object`);\n }\n\n const PROP_TYPE_LIST = values(PROP_TYPE);\n\n if (options.props) {\n for (const key of Object.keys(options.props)) {\n\n // $FlowFixMe\n const prop = options.props[key];\n\n if (!prop || !(typeof prop === 'object')) {\n throw new Error(`Expected options.props.${ key } to be an object`);\n }\n\n if (!prop.type) {\n throw new Error(`Expected prop.type`);\n }\n\n if (PROP_TYPE_LIST.indexOf(prop.type) === -1) {\n throw new Error(`Expected prop.type to be one of ${ PROP_TYPE_LIST.join(', ') }`);\n }\n\n if (prop.required && prop.default) {\n throw new Error(`Required prop can not have a default value`);\n }\n\n if (prop.type === PROP_TYPE.FUNCTION && prop.queryParam && !prop.queryValue) {\n throw new Error(`Do not pass queryParam for function prop`);\n }\n }\n }\n}\n\n// eslint-disable-next-line complexity\nexport function validate

(options : ?ComponentOptionsType

) { // eslint-ignore-line\n\n if (!options) {\n throw new Error(`Expected options to be passed`);\n }\n\n // eslint-disable-next-line security/detect-unsafe-regex, unicorn/no-unsafe-regex\n if (!options.tag || !options.tag.match(/^([a-z0-9]+-)+[a-z0-9]+$/)) {\n throw new Error(`Invalid options.tag: ${ options.tag }`);\n }\n\n validatePropDefinitions(options);\n\n if (options.dimensions) {\n if (options.dimensions && !isPx(options.dimensions.width) && !isPerc(options.dimensions.width)) {\n throw new Error(`Expected options.dimensions.width to be a px or % string value`);\n }\n\n if (options.dimensions && !isPx(options.dimensions.height) && !isPerc(options.dimensions.height)) {\n throw new Error(`Expected options.dimensions.height to be a px or % string value`);\n }\n }\n\n if (options.defaultContext) {\n if (options.defaultContext !== CONTEXT.IFRAME && options.defaultContext !== CONTEXT.POPUP) {\n throw new Error(`Unsupported context type: ${ options.defaultContext || 'unknown' }`);\n }\n }\n\n if (!options.url) {\n throw new Error(`Must pass url`);\n }\n\n if (typeof options.url !== 'string' && typeof options.url !== 'function') {\n throw new TypeError(`Expected url to be string or function`);\n }\n\n if (options.prerenderTemplate && typeof options.prerenderTemplate !== 'function') {\n throw new Error(`Expected options.prerenderTemplate to be a function`);\n }\n\n if ((options.containerTemplate || !__ZOID__.__DEFAULT_CONTAINER__) && typeof options.containerTemplate !== 'function') {\n throw new Error(`Expected options.containerTemplate to be a function`);\n }\n}\n","/* @flow */\n\nexport { PopupOpenError } from 'belter/src';\nexport { create, destroy, destroyComponents, destroyAll, Component } from './component';\nexport type { ZoidComponent, ZoidComponentInstance } from './component';\nexport type { RenderOptionsType } from './parent';\nexport { PROP_TYPE, PROP_SERIALIZATION, CONTEXT, EVENT } from './constants';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index dfc1a989..8d3b7e81 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "karma": "cross-env NODE_ENV=test babel-node --plugins=transform-es2015-modules-commonjs ./node_modules/.bin/karma start", "babel": "babel src/ --out-dir dist/module", "webpack": "babel-node --plugins=transform-es2015-modules-commonjs ./node_modules/.bin/webpack --progress", - "test": "npm run flow-typed && npm run flow && npm run karma", + "test": "npm run lint && npm run flow-typed && npm run flow && npm run karma", "build": "npm run test && npm run babel && npm run webpack -- $@", "release": "./publish.sh", "release:patch": "./publish.sh patch", diff --git a/src/child/index.js b/src/child/index.js index d4812cd7..d7a861e8 100644 --- a/src/child/index.js +++ b/src/child/index.js @@ -1,26 +1,12 @@ /* @flow */ /* eslint max-lines: 0 */ -import { - isSameDomain, - matchDomain, - getDomain, - getOpener, - getNthParentFromTop, - getAncestor, - getAllFramesInWindow, - type CrossDomainWindowType, - onCloseWindow, -} from 'cross-domain-utils/src'; +import { isSameDomain, matchDomain, getDomain, getOpener, + getNthParentFromTop, getAncestor, getAllFramesInWindow, + type CrossDomainWindowType, onCloseWindow } from 'cross-domain-utils/src'; import { markWindowKnown, deserializeMessage } from 'post-robot/src'; import { ZalgoPromise } from 'zalgo-promise/src'; -import { - extend, - waitForDocumentBody, - onResize, - getElementSafe, - assertExists, -} from 'belter/src'; +import { extend, waitForDocumentBody, onResize, getElementSafe, assertExists } from 'belter/src'; import { getGlobal } from '../lib'; import { CONTEXT, INITIAL_PROPS, WINDOW_REFERENCES } from '../constants'; @@ -34,18 +20,18 @@ import { getChildPayload } from './window'; export * from './window'; export type ChildExportsType

= {| - updateProps: (props: PropsType

) => ZalgoPromise, - close: () => ZalgoPromise, + updateProps : (props : (PropsType

)) => ZalgoPromise, + close : () => ZalgoPromise |}; export type ChildHelpers

= {| - close: () => ZalgoPromise, - focus: () => ZalgoPromise, - resize: ({ width: ?number, height: ?number }) => ZalgoPromise, - onError: mixed => ZalgoPromise, - onProps: ((PropsType

) => void) => void, - getParent: () => CrossDomainWindowType, - getParentDomain: () => string, + close : () => ZalgoPromise, + focus : () => ZalgoPromise, + resize : ({ width : ?number, height : ?number }) => ZalgoPromise, + onError : (mixed) => ZalgoPromise, + onProps : ((PropsType

) => void) => void, + getParent : () => CrossDomainWindowType, + getParentDomain : () => string |}; /* Child Component @@ -59,265 +45,235 @@ export type ChildHelpers

= {| */ export class ChildComponent

{ - component: Component

; - props: PropsType

; - context: string; - parent: ParentExportsType

; - parentDomain: string; - parentComponentWindow: CrossDomainWindowType; - - onPropHandlers: Array<(PropsType

) => void>; // eslint-disable-line flowtype/no-mutable-array - autoResize: { width: boolean, height: boolean, element?: string }; - - constructor(component: Component

) { - ZalgoPromise.try(() => { - this.component = component; - this.onPropHandlers = []; - - const childPayload = getChildPayload(); - - if (!childPayload) { - throw new Error(`No child payload found`); - } - - if (childPayload.version !== __ZOID__.__VERSION__) { - const msg = `Parent window has zoid version ${ - childPayload.version - }, child window has version ${__ZOID__.__VERSION__}`; - // throw new Error(msg); - console.log(msg); - } - - const { parent, domain, exports, context, props } = childPayload; - - this.context = context; - this.parentComponentWindow = this.getParentComponentWindow(parent); - this.parentDomain = domain; - this.parent = deserializeMessage( - this.parentComponentWindow, - domain, - exports - ); - - this.checkParentDomain(domain); - - const initialProps = this.getPropsByRef( - this.parentComponentWindow, - domain, - props - ); - this.setProps(initialProps, domain); - markWindowKnown(this.parentComponentWindow); - - this.watchForClose(); - - return this.parent.init(this.buildExports()); - }) - .then(() => { - return this.watchForResize(); - }) - .catch(err => { - this.onError(err); - }); - } - - getHelpers(): ChildHelpers

{ - return { - focus: () => this.focus(), - close: () => this.close(), - resize: ({ width, height }) => this.resize({ width, height }), - onError: err => this.onError(err), - onProps: handler => this.onProps(handler), - getParent: () => this.parentComponentWindow, - getParentDomain: () => this.parentDomain, - }; - } - - checkParentDomain(domain: string) { - if (!matchDomain(this.component.allowedParentDomains, domain)) { - throw new Error(`Can not be rendered by domain: ${domain}`); + + component : Component

+ props : PropsType

+ context : string + parent : ParentExportsType

+ parentDomain : string + parentComponentWindow : CrossDomainWindowType + + onPropHandlers : Array<(PropsType

) => void> // eslint-disable-line flowtype/no-mutable-array + autoResize : { width : boolean, height : boolean, element? : string } + + constructor(component : Component

) { + ZalgoPromise.try(() => { + this.component = component; + this.onPropHandlers = []; + + const childPayload = getChildPayload(); + + if (!childPayload) { + throw new Error(`No child payload found`); + } + + if (childPayload.version !== __ZOID__.__VERSION__) { + const msg = `Parent window has zoid version ${ childPayload.version }, child window has version ${ __ZOID__.__VERSION__ }`; + // throw new Error(msg); + // eslint-disable-next-line no-console + console.log(msg); + } + + const { parent, domain, exports, context, props } = childPayload; + + this.context = context; + this.parentComponentWindow = this.getParentComponentWindow(parent); + this.parentDomain = domain; + this.parent = deserializeMessage(this.parentComponentWindow, domain, exports); + + this.checkParentDomain(domain); + + const initialProps = this.getPropsByRef(this.parentComponentWindow, domain, props); + this.setProps(initialProps, domain); + markWindowKnown(this.parentComponentWindow); + + this.watchForClose(); + + return this.parent.init(this.buildExports()); + + }).then(() => { + return this.watchForResize(); + + }).catch(err => { + this.onError(err); + }); + } + + getHelpers() : ChildHelpers

{ + return { + focus: () => this.focus(), + close: () => this.close(), + resize: ({ width, height }) => this.resize({ width, height }), + onError: (err) => this.onError(err), + onProps: (handler) => this.onProps(handler), + getParent: () => this.parentComponentWindow, + getParentDomain: () => this.parentDomain + }; } - } - - onProps(handler: Function) { - this.onPropHandlers.push(handler); - } - - getPropsByRef( - parentComponentWindow: CrossDomainWindowType, - domain: string, - { type, value, uid }: PropRef - ): PropsType

{ - let props; - - if (type === INITIAL_PROPS.RAW) { - props = value; - } else if (type === INITIAL_PROPS.UID) { - if (!isSameDomain(parentComponentWindow)) { - throw new Error( - `Parent component window is on a different domain - expected ${getDomain()} - can not retrieve props` - ); - } - - const global = getGlobal(parentComponentWindow); - props = assertExists('props', global && global.props[uid]); + + checkParentDomain(domain : string) { + if (!matchDomain(this.component.allowedParentDomains, domain)) { + throw new Error(`Can not be rendered by domain: ${ domain }`); + } } - if (!props) { - throw new Error(`Could not find props`); + onProps(handler : Function) { + this.onPropHandlers.push(handler); } - return deserializeMessage(parentComponentWindow, domain, props); - } - - getParentComponentWindow(ref: WindowRef): CrossDomainWindowType { - const { type } = ref; - - if (type === WINDOW_REFERENCES.OPENER) { - return assertExists('opener', getOpener(window)); - } else if (type === WINDOW_REFERENCES.PARENT) { - // $FlowFixMe - const distance = ref.distance; - return assertExists('parent', getNthParentFromTop(window, distance)); - } else if (type === WINDOW_REFERENCES.GLOBAL) { - // $FlowFixMe - const { uid } = ref; - const ancestor = getAncestor(window); - - if (!ancestor) { - throw new Error(`Can not find ancestor window`); - } - - for (const frame of getAllFramesInWindow(ancestor)) { - if (isSameDomain(frame)) { - const global = getGlobal(frame); - - if (global && global.windows && global.windows[uid]) { - return global.windows[uid]; - } + getPropsByRef(parentComponentWindow : CrossDomainWindowType, domain : string, { type, value, uid } : PropRef) : (PropsType

) { + let props; + + if (type === INITIAL_PROPS.RAW) { + props = value; + } else if (type === INITIAL_PROPS.UID) { + if (!isSameDomain(parentComponentWindow)) { + throw new Error(`Parent component window is on a different domain - expected ${ getDomain() } - can not retrieve props`); + } + + const global = getGlobal(parentComponentWindow); + props = assertExists('props', global && global.props[uid]); + } + + if (!props) { + throw new Error(`Could not find props`); + } + + return deserializeMessage(parentComponentWindow, domain, props); + } + + getParentComponentWindow(ref : WindowRef) : CrossDomainWindowType { + const { type } = ref; + + if (type === WINDOW_REFERENCES.OPENER) { + return assertExists('opener', getOpener(window)); + + } else if (type === WINDOW_REFERENCES.PARENT) { + // $FlowFixMe + const distance = ref.distance; + return assertExists('parent', getNthParentFromTop(window, distance)); + + } else if (type === WINDOW_REFERENCES.GLOBAL) { + // $FlowFixMe + const { uid } = ref; + const ancestor = getAncestor(window); + + if (!ancestor) { + throw new Error(`Can not find ancestor window`); + } + + for (const frame of getAllFramesInWindow(ancestor)) { + if (isSameDomain(frame)) { + const global = getGlobal(frame); + + if (global && global.windows && global.windows[uid]) { + return global.windows[uid]; + } + } + } + } + + throw new Error(`Unable to find ${ type } parent component window`); + } + + getProps() : PropsType

{ + // $FlowFixMe + this.props = this.props || {}; + return this.props; + } + + + setProps(props : PropsType

, origin : string, isUpdate : boolean = false) { + const helpers = this.getHelpers(); + const existingProps = this.getProps(); + const normalizedProps = normalizeChildProps(this.parentComponentWindow, this.component, props, origin, helpers, isUpdate); + + extend(existingProps, normalizedProps); + + for (const handler of this.onPropHandlers) { + handler.call(this, existingProps); } - } } - throw new Error(`Unable to find ${type} parent component window`); - } - - getProps(): PropsType

{ - // $FlowFixMe - this.props = this.props || {}; - return this.props; - } - - setProps(props: PropsType

, origin: string, isUpdate: boolean = false) { - const helpers = this.getHelpers(); - const existingProps = this.getProps(); - const normalizedProps = normalizeChildProps( - this.parentComponentWindow, - this.component, - props, - origin, - helpers, - isUpdate - ); - - extend(existingProps, normalizedProps); - - for (const handler of this.onPropHandlers) { - handler.call(this, existingProps); + watchForClose() { + window.addEventListener('beforeunload', () => { + this.parent.checkClose.fireAndForget(); + }); + + window.addEventListener('unload', () => { + this.parent.checkClose.fireAndForget(); + }); + + onCloseWindow(this.parentComponentWindow, () => { + this.destroy(); + }); + } + + getAutoResize() : { width : boolean, height : boolean, element : ?HTMLElement } { + let { width = false, height = false, element = 'body' } = this.autoResize || this.component.autoResize || {}; + element = getElementSafe(element); + return { width, height, element }; + } + + watchForResize() : ?ZalgoPromise { + return waitForDocumentBody().then(() => { + const { width, height, element } = this.getAutoResize(); + + if (!element || (!width && !height) || this.context === CONTEXT.POPUP) { + return; + } + + onResize(element, ({ width: newWidth, height: newHeight }) => { + this.resize({ + width: width ? newWidth : undefined, + height: height ? newHeight : undefined + }); + }, { width, height }); + }); + } + + buildExports() : ChildExportsType

{ + + const self = this; + + return { + updateProps(props : (PropsType

)) : ZalgoPromise { + return ZalgoPromise.try(() => self.setProps(props, this.__origin__, true)); + }, + + close() : ZalgoPromise { + return ZalgoPromise.try(() => self.destroy()); + } + }; + } + + resize({ width, height } : { width : ?number, height : ?number }) : ZalgoPromise { + return this.parent.resize.fireAndForget({ width, height }); + } + + close() : ZalgoPromise { + return this.parent.close(); + } + + destroy() : ZalgoPromise { + return ZalgoPromise.try(() => { + window.close(); + }); + } + + focus() : ZalgoPromise { + return ZalgoPromise.try(() => { + window.focus(); + }); + } + + onError(err : mixed) : ZalgoPromise { + return ZalgoPromise.try(() => { + if (this.parent && this.parent.onError) { + return this.parent.onError(err); + } else { + throw err; + } + }); } - } - - watchForClose() { - window.addEventListener('beforeunload', () => { - this.parent.checkClose.fireAndForget(); - }); - - window.addEventListener('unload', () => { - this.parent.checkClose.fireAndForget(); - }); - - onCloseWindow(this.parentComponentWindow, () => { - this.destroy(); - }); - } - - getAutoResize(): { width: boolean, height: boolean, element: ?HTMLElement } { - let { width = false, height = false, element = 'body' } = - this.autoResize || this.component.autoResize || {}; - element = getElementSafe(element); - return { width, height, element }; - } - - watchForResize(): ?ZalgoPromise { - return waitForDocumentBody().then(() => { - const { width, height, element } = this.getAutoResize(); - - if (!element || (!width && !height) || this.context === CONTEXT.POPUP) { - return; - } - - onResize( - element, - ({ width: newWidth, height: newHeight }) => { - this.resize({ - width: width ? newWidth : undefined, - height: height ? newHeight : undefined, - }); - }, - { width, height } - ); - }); - } - - buildExports(): ChildExportsType

{ - const self = this; - - return { - updateProps(props: PropsType

): ZalgoPromise { - return ZalgoPromise.try(() => - self.setProps(props, this.__origin__, true) - ); - }, - - close(): ZalgoPromise { - return ZalgoPromise.try(() => self.destroy()); - }, - }; - } - - resize({ - width, - height, - }: { - width: ?number, - height: ?number, - }): ZalgoPromise { - return this.parent.resize.fireAndForget({ width, height }); - } - - close(): ZalgoPromise { - return this.parent.close(); - } - - destroy(): ZalgoPromise { - return ZalgoPromise.try(() => { - window.close(); - }); - } - - focus(): ZalgoPromise { - return ZalgoPromise.try(() => { - window.focus(); - }); - } - - onError(err: mixed): ZalgoPromise { - return ZalgoPromise.try(() => { - if (this.parent && this.parent.onError) { - return this.parent.onError(err); - } else { - throw err; - } - }); - } }